commit 561a8479b7673de15f11945dae4fca099710d315 Author: jfmartel Date: Wed Apr 27 16:08:20 2022 -0400 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6142305 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +*.d diff --git a/ChaloupeLora.X/Makefile b/ChaloupeLora.X/Makefile new file mode 100644 index 0000000..fca8e2c --- /dev/null +++ b/ChaloupeLora.X/Makefile @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/ChaloupeLora.X/Source/ADC.c b/ChaloupeLora.X/Source/ADC.c new file mode 100644 index 0000000..5d18bac --- /dev/null +++ b/ChaloupeLora.X/Source/ADC.c @@ -0,0 +1,265 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120521 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "ADC.h" +#include "HallAcquisition.h" +#include "digitalio.h" +#include "PAStatus.h" + +/* Globals */ +unsigned int guiADCMode; +unsigned short egADCMotPhaseA; +unsigned short egADCMotPhaseB; +unsigned short egADCMotPhaseC; + +/* Implementation */ + + +//---------------------------------------------------------------------------- +void InitADC(void) +{ + //At boot, init ADC in normal mode... + guiADCMode = ADC_NORMAL_MODE; + + //configure input pins as analog inputs. + TRISBbits.TRISB3 = 1; + AD1PCFGbits.PCFG3 = 0; + TRISBbits.TRISB4 = 1; + AD1PCFGbits.PCFG4 = 0; + TRISBbits.TRISB5 = 1; + AD1PCFGbits.PCFG5 = 0; + TRISBbits.TRISB8 = 1; + AD1PCFGbits.PCFG8 = 0; + TRISBbits.TRISB9 = 1; + AD1PCFGbits.PCFG9 = 0; + TRISBbits.TRISB11 = 1; + AD1PCFGbits.PCFG11 = 0; + TRISBbits.TRISB12 = 1; + AD1PCFGbits.PCFG12 = 0; + TRISBbits.TRISB13 = 1; + AD1PCFGbits.PCFG13 = 0; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + //configure output format (unsigned int 16 bits) + AD1CON1bits.FORM = 0b000; + //configure clock source and prescaling + AD1CON3bits.ADRC = 0; //Use Peripheral clock + AD1CON3bits.ADCS = 4; //Acording to datasheet TAD must be min 83.33ns --> minimal prescaler applied to TPBclk = 8 --> Conversion time ~= 100ns + //AD1CON3bits.SAMC = 1; //Used in automatic sampling mode (scan mode). Shall be augmented if results are not accurate. See datasheet. + AD1CON3bits.SAMC = 30; //Used in automatic sampling mode (scan mode). Shall be augmented if results are not accurate. See datasheet. + +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCEnterHallACQMode(void) +{ + //configure ADC module + AD1CON1bits.ON = 0; //stop ADC to reconfigure. + IEC1bits.AD1IE = 0; //disable ADC interrupt for now + + AD1CHS = 0; //Reset channel source since input source is controlled by hardware in scan mode. + AD1CON2 = 0; + AD1CSSL = 0; + + AD1CON1bits.SSRC = 0b111; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. +// AD1CON1bits.SSRC = 0b000; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. + AD1CON1bits.CLRASAM = 1; + AD1CON1bits.ASAM = 1; + + //configure scan mode + AD1CON2bits.CSCNA = 1; //enable scan mode + AD1CON2bits.SMPI = 2; //Generate interrupt after the 3rd conversion. + + AD1CSSLbits.CSSL11= 1; //select Phase A input in scan sequence + AD1CSSLbits.CSSL12= 1; //select Phase B input in scan sequence + AD1CSSLbits.CSSL13= 1; //select Phase C input in scan sequence + AD1CON1bits.SAMP = 1 ; + + + IPC6bits.AD1IP = 5; + IPC6bits.AD1IS = 3; + IFS1bits.AD1IF = 0; + IEC1bits.AD1IE = 1; //enable ADC interrupt + + AD1CON1bits.ON = 1; //enable ADC. + + guiADCMode = ADC_HALL_ACQ_MODE; + + + return 1; +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCEnterTracesMode(void) +{ + //trick to reuse code but force the good mode :) + ADCEnterHallACQMode(); + guiADCMode = ADC_TRACE_MODE; + return 1; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCEnterCBITMode(void) +{ + //configure ADC module + AD1CON1bits.ON = 0; //stop ADC to reconfigure. + IEC1bits.AD1IE = 0; //disable ADC interrupt for now + + AD1CHS = 0; //Reset channel source since input source is controlled by hardware in scan mode. + AD1CON2 = 0; + AD1CSSL = 0; + + AD1CON1bits.SSRC = 0b111; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. +// AD1CON1bits.SSRC = 0b000; //manual conversion start. Clearing SAMP starts conversion. See AD1CON3bits.SAMC for sampling time. + AD1CON1bits.CLRASAM = 1; + AD1CON1bits.ASAM = 1; + + //configure scan mode + AD1CON2bits.CSCNA = 1; //enable scan mode + AD1CON2bits.SMPI = 4; //Generate interrupt after the 5th conversion. + + AD1CSSLbits.CSSL3= 1; //select Vref input in scan sequence + AD1CSSLbits.CSSL4= 1; //select 5V input in scan sequence + AD1CSSLbits.CSSL5= 1; //select 3.3V input in scan sequence + AD1CSSLbits.CSSL8= 1; //select Motor Thermistor input in scan sequence + AD1CSSLbits.CSSL9= 1; //select Drive Thermistor input in scan sequence + AD1CON1bits.SAMP = 1; + + + IPC6bits.AD1IP = 5; + IPC6bits.AD1IS = 3; + IFS1bits.AD1IF = 0; + IEC1bits.AD1IE = 1; //enable ADC interrupt + + AD1CON1bits.ON = 1; //enable ADC. + + guiADCMode = ADC_CBIT_MODE; + + + return 1; +} +//---------------------------------------------------------------------------- + + +//---------------------------------------------------------------------------- +// Starts acquistion and conversion of the 3 phases. The 3 inputs are scanned +// automatically by hardware and an interrupt is triggered when finished. +// +int ADCStartHallACQConversion(void) +{ + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; +} +//---------------------------------------------------------------------------- + +//---------------------------------------------------------------------------- +int ADCStartTracesConversion(void) +{ + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCStartCBITConversion(void) +{ + if(guiADCMode == ADC_CBIT_MODE) + { + AD1CON1bits.ASAM = 1; + AD1CON1bits.SAMP = 1; //start sampling and start conversion. Interrupt will be generated when data is ready + return 1; + } + return 0; +} +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +int ADCStopConversion(void) +{ + return 1; +} +//---------------------------------------------------------------------------- + +int ADCGetMode(void) +{ + return guiADCMode; +} + + + +//---------------------------------------------------------------------------- +void __ISR(_ADC_VECTOR, ipl5) ADCInterrupt(void) +{ + switch(guiADCMode) + { + case ADC_NORMAL_MODE: + { + break; + } + case ADC_CBIT_MODE: + { + estPAStatus.gusVoltageVref = ADC1BUF0; + estPAStatus.gusVoltage5V = ADC1BUF1; + estPAStatus.gusVoltage33V = ADC1BUF2; + estPAStatus.gusVoltageThermMot = ADC1BUF3; + estPAStatus.gusVoltageThermDrv = ADC1BUF4; + + estPAStatus.IsDataReady = 1; + break; + } + case ADC_TRACE_MODE: + { + egADCMotPhaseA = ADC1BUF0; + egADCMotPhaseB = ADC1BUF1; + egADCMotPhaseC = ADC1BUF2; + break; + } + case ADC_HALL_ACQ_MODE: + { + //Update data structure. + if(gpstHallAcqDataPtr != 0 && gpstHallAcqDataPtr <= gpstHallAcqDataPtrEND) + { + gpstHallAcqDataPtr->MotPhaseA = ADC1BUF0; + gpstHallAcqDataPtr->MotPhaseB = ADC1BUF1; + gpstHallAcqDataPtr->MotPhaseC = ADC1BUF2; + gpstHallAcqDataPtr->AnalogDataUpToDate = 1; + } + break; + } + } + IFS1bits.AD1IF = 0; +} +//---------------------------------------------------------------------------- + +//EOF + diff --git a/ChaloupeLora.X/Source/ADC.h b/ChaloupeLora.X/Source/ADC.h new file mode 100644 index 0000000..10c9e45 --- /dev/null +++ b/ChaloupeLora.X/Source/ADC.h @@ -0,0 +1,73 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20120516 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef ADC_H +#define ADC_H + +/* ************************************************************************** */ +/* Externs */ + +extern unsigned short egADCMotPhaseA; +extern unsigned short egADCMotPhaseB; +extern unsigned short egADCMotPhaseC; +/* ************************************************************************** */ +/* Defines */ +#define ADC_VOLT_PER_BIT (float)0.003222656 +/* ************************************************************************** */ +/* Type definitions */ +enum eADCModes +{ + ADC_NORMAL_MODE, + ADC_CBIT_MODE, + ADC_TRACE_MODE, + ADC_HALL_ACQ_MODE, + ADC_MAX_MODE +}; + +/* ************************************************************************** */ +/* Prototypes */ +void InitADC(void); + +int ADCStopConversion(void); +//Hall Acquisition Mode +int ADCEnterHallACQMode(void); +int ADCStartHallACQConversion(void); + +//Traces Mode +int ADCEnterTracesMode(void); +int ADCStartTracesConversion(void); + +//CBIT Mode +int ADCEnterCBITMode(void); +int ADCStartCBITConversion(void); + + +int ADCGetMode(void); + + + +#endif //#define ADC_H +//EOF + diff --git a/ChaloupeLora.X/Source/BatteryMonitor.c b/ChaloupeLora.X/Source/BatteryMonitor.c new file mode 100644 index 0000000..490510e --- /dev/null +++ b/ChaloupeLora.X/Source/BatteryMonitor.c @@ -0,0 +1,188 @@ +//#include + +#include "BatteryMonitor.h" +#include "BoardCfg.h" +#include "timer.h" +#include "ina219.h" +#include "WiFiCtrl.h" +#include "I2C.h" + +float mBatteryVoltage; +int mBatteryCurrent; +int mBatterySOC; + +float mVoltageMeanSum; +int mVoltageMeanCount; +unsigned int mCurrentMeanSum; +int mCurrentMeanCount; +bool mCurrentModuleOK; + +void InitBatteryMonitor() +{ + mBatteryVoltage = 0; + mBatteryCurrent = 0; + mBatterySOC = 0; + mVoltageMeanCount = 0; + mCurrentMeanCount = 0; + mCurrentModuleOK = true; + + TimerStart(BATTERY_MONITOR_TIMER,100); + + + //experimental stuff! + mVoltageMeanSum = 0.0; + mVoltageMeanCount = 0; + + if(ina219Init() == RET_ERROR) + { + mCurrentModuleOK = false; + } + //ina219SetCalibration_16V_500mA(); + // ina219SetCalibration_16V_200mA(); + +} + +void BatteryMonitorTick() +{ + static int NetworkSendCounter; //Every second (10 counts) we want to send the battery data. + if(IsTimerExpired(BATTERY_MONITOR_TIMER)) + { + unsigned int adc; + double conv, raw; + + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + adc = ADC1BUF0; + AD1CON1bits.SAMP = 1; + // adc &= 0xFFFE; + conv = (float)adc / 1023; + conv *= 3.36; + raw = conv; + conv *= 11; + + //avoid rollovers in case the LORA network gets disconnected. + //This could go for a long time but 5000 samples is too much anyways. + if(mVoltageMeanCount >= 5000) + { + mVoltageMeanCount = 0; + mVoltageMeanSum = conv; + } + else + { + mVoltageMeanCount++; + mVoltageMeanSum += conv; + } + + + + mBatteryVoltage = conv; + + TimerStart(BATTERY_MONITOR_TIMER,100); + + if(mCurrentModuleOK == true) + { + mBatteryCurrent = ina219GetCurrent_mA(); + if(I2CWasLastTransactionOK() == 0 ) + { + mCurrentModuleOK = false; + } + } + else + { + unsigned int Ref = 0; + AD1CHSbits.CH0SA = 0; //AN0 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + Ref = ADC1BUF0; + AD1CON1bits.SAMP = 1; + + + + + AD1CHSbits.CH0SA = 2; //AN2 + AD1CON1bits.SAMP = 0; + while(AD1CON1bits.DONE == 0); + adc = ADC1BUF0; + AD1CON1bits.SAMP = 1; + // adc &= 0xFFFE; + + adc -= Ref; + + conv = (double)adc * 1.0; + conv /= 1023; + conv *= 3.3; //Volts + conv /= 0.05; //Amps (50mV/A) + + raw = conv; + + //avoid rollovers in case the LORA network gets disconnected. + //This could go for a long time but 5000 samples is too much anyways. + if(mCurrentMeanCount >= 500) + { + mCurrentMeanCount = 1; + mCurrentMeanSum = adc; + } + else + { + mCurrentMeanCount++; + mCurrentMeanSum += adc; + } + + + + mBatteryCurrent = adc; + //mBatteryCurrent = mCurrentMeanSum / mCurrentMeanCount; + } + + } +} + +float GetBatteryVoltage() +{ + mBatteryVoltage = (mVoltageMeanSum/mVoltageMeanCount); + mVoltageMeanSum = 0.0; + mVoltageMeanCount = 0; + + + return mBatteryVoltage; + +} + +int GetSolarPanelCurrent() +{ + //mBatteryCurrent = (mCurrentMeanSum/mCurrentMeanCount); + mVoltageMeanCount = 0; + mCurrentMeanSum = 0.0; + + return mBatteryCurrent; +} + +int GetBatterySOC() +{ + return mBatterySOC; +} + +int SendNetworkBatteryData() +{ +// int VoltageMilliVolts = (int)(mBatteryVoltage * 1000); +// int BattCurrent = mBatteryCurrent; +// +// char BatData[10]; +// BatData[0] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 1 +// VoltageMilliVolts >>= 8; +// BatData[1] = (char)(VoltageMilliVolts & 0x000000FF); //Battery Voltage 2 +// BatData[2] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 1 +// BattCurrent >>= 8; +// BatData[3] = (char)(BattCurrent & 0x000000FF); //Solar panel Current 2 +// +// SendNetworkData(BatData,4); + + printf("Battery voltage: %f\n",mBatteryVoltage); + +} + +bool GetCurrentModuleOK() +{ + return mCurrentModuleOK; +} diff --git a/ChaloupeLora.X/Source/BatteryMonitor.h b/ChaloupeLora.X/Source/BatteryMonitor.h new file mode 100644 index 0000000..e4a6596 --- /dev/null +++ b/ChaloupeLora.X/Source/BatteryMonitor.h @@ -0,0 +1,26 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef BATTERYMONITOR_H +#define BATTERYMONITOR_H +#include "define.h" + + + + +void InitBatteryMonitor(); + +void BatteryMonitorTick(); +float GetBatteryVoltage(); +int GetSolarPanelCurrent(); +int GetBatterySOC(); +int SendNetworkBatteryData(); +bool GetCurrentModuleOK(); + + +#endif /* BATTERYMONITOR_H */ + diff --git a/ChaloupeLora.X/Source/BoardCfg.h b/ChaloupeLora.X/Source/BoardCfg.h new file mode 100644 index 0000000..32cceb6 --- /dev/null +++ b/ChaloupeLora.X/Source/BoardCfg.h @@ -0,0 +1,49 @@ +/* + * File: BoardCfg.h + * Author: JF + * + * Created on November 26, 2018, 4:50 PM + */ + +#ifndef BOARDCFG_H +#define BOARDCFG_H + +#include "define.h" + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk) +{ + unsigned int brg; + + brg = pb_clk / (2 * spi_clk); + + if(pb_clk % (2 * spi_clk)) + brg++; + + if(brg > 0x100) + brg = 0x100; + + if(brg) + brg--; + + return (unsigned char) brg; +} +// +#ifdef FUBARINO_BRD +#include "BoardCfg_Fubarino.h" +#endif + +//#ifdef PINGUINO_BRD +//#include "BoardCfg_Pinguino.h" +//#endif + +#ifdef CHALETDUINO_BRD +#include "BoardCfg_Chaletduino.h" +#endif + +#ifdef CHALETDUINO_V2_BRD +#include "BoardCfg_ChaletduinoV2.h" +#endif +int InitBoard(); + +#endif /* BOARDCFG_H */ + diff --git a/ChaloupeLora.X/Source/BoardCfg_Chaletduino.h b/ChaloupeLora.X/Source/BoardCfg_Chaletduino.h new file mode 100644 index 0000000..893ae7d --- /dev/null +++ b/ChaloupeLora.X/Source/BoardCfg_Chaletduino.h @@ -0,0 +1,120 @@ +/* + * File: DigitalIO_Chaletduino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_CHALETDUINO_H +#define DIGITALIO_CHALETDUINO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ************************************************************************** */ + /* Includes */ +#include "define.h" + /* ************************************************************************** */ + /* Defines */ + //#include +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + + //Output pins hardware definitions + // +#define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 +#define HEARTBEAT_LED_2_PIN LATEbits.LATE6 +#define HEARTBEAT_LED_2_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_2_SET_REG LATESET +#define HEARTBEAT_LED_2_CLEAR_REG LATECLR +#define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATE6_MASK + +#define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 +#define HEARTBEAT_LED_1_PIN LATEbits.LATE5 +#define HEARTBEAT_LED_1_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_1_SET_REG LATESET +#define HEARTBEAT_LED_1_CLEAR_REG LATECLR +#define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + +#define LORA_ACTIVITY_LED_PIN_DIR TRISFbits.TRISF1 +#define LORA_ACTIVITY_LED_PIN LATFbits.LATF1 +#define LORA_ACTIVITY_LED_TOGGLE_REG LATFINV +#define LORA_ACTIVITY_LED_SET_REG LATFSET +#define LORA_ACTIVITY_LED_CLEAR_REG LATFCLR +#define LORA_ACTIVITY_LED_TOGGLE_MASK _LATE_LATF1_MASK + + // #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + // #define GP_DEBUG_1_PIN LATEbits.LATE5 + // #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + // #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + // #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 + // #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs +#define SPI_SDO_PIN_DIR TRISGbits.TRISG8 +#define SPI_SDI_PIN_DIR TRISGbits.TRISG7 +#define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + //SD Card +#define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 +#define SD_SPI_SS_PIN LATBbits.LATB13 + + //SPI Flash +#define FLASH_SS_PIN_DIR TRISEbits.TRISE3 +#define FLASH_SS_PIN LATEbits.LATE3 + + + //Wifi (WINC3400 module) +#define WIFI_SPI_SS_PIN_DIR TRISEbits.TRISE0 +#define WIFI_SPI_SS_PIN LATEbits.LATE0 +#define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 +#define WIFI_IRQ_PIN PORTDbits.RD0 + + // #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + // #define WIFI_SPI_CFG_PIN LATEbits.LATE1 +#define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 +#define WIFI_CHP_EN_PIN LATEbits.LATE2 +#define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE4 +#define WIFI_CHP_RST_PIN LATEbits.LATE4 + + //Chalet power relay +#define POWER_RELAY_ON_PIN_DIR TRISEbits.TRISE7 +#define POWER_RELAY_ON_PIN LATEbits.LATE7 //X2-3 +#define POWER_RELAY_OFF_PIN_DIR TRISGbits.TRISG9 +#define POWER_RELAY_OFF_PIN LATGbits.LATG9 //X3-5 + + //Harakiri relay +#define HARAKIRI_RELAY_ON_PIN_DIR TRISBbits.TRISB0 +#define HARAKIRI_RELAY_ON_PIN LATBbits.LATB0 //X2-3 + + //12V presence detection input +#define CHALET_12V_PRESENCE_PIN_DIR TRISBbits.TRISB15 +#define CHALET_12V_PRESENCE_PIN PORTBbits.RB15 //X2-3 + + //Battery voltage measurement (analog input) +#define BATTERY_VOLTAGE_ANALOG_PIN_DIR TRISBbits.TRISB1 + + //Current sensor. Those pins tristate is controlled by the I2C module +#define CURRENT_MODULE_I2C_SCL_PIN_DIR TRISDbits.TRISD3 +#define CURRENT_MODULE_I2C_SDA_PIN_DIR TRISDbits.TRISD2 + + + + /* ************************************************************************** */ + /* Prototypes */ + void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/ChaloupeLora.X/Source/BoardCfg_ChaletduinoV2.h b/ChaloupeLora.X/Source/BoardCfg_ChaletduinoV2.h new file mode 100644 index 0000000..489c0fd --- /dev/null +++ b/ChaloupeLora.X/Source/BoardCfg_ChaletduinoV2.h @@ -0,0 +1,170 @@ +/* + * File: DigitalIO_Chaletduino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_CHALETDUINO_H +#define DIGITALIO_CHALETDUINO_H + + +#ifdef __cplusplus +extern "C" { +#endif + + + /* ************************************************************************** */ + /* Includes */ +#include "define.h" + /* ************************************************************************** */ + /* Defines */ + //#include +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + + //Output pins hardware definitions + // +#define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE6 +#define HEARTBEAT_LED_2_PIN LATEbits.LATE6 +#define HEARTBEAT_LED_2_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_2_SET_REG LATESET +#define HEARTBEAT_LED_2_CLEAR_REG LATECLR +#define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATE6_MASK + +#define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 +#define HEARTBEAT_LED_1_PIN LATEbits.LATE5 +#define HEARTBEAT_LED_1_TOGGLE_REG LATEINV +#define HEARTBEAT_LED_1_SET_REG LATESET +#define HEARTBEAT_LED_1_CLEAR_REG LATECLR +#define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + +//#define LORA_ACTIVITY_LED_PIN_DIR TRISFbits.TRISF1 +//#define LORA_ACTIVITY_LED_PIN LATFbits.LATF1 +//#define LORA_ACTIVITY_LED_TOGGLE_REG LATFINV +//#define LORA_ACTIVITY_LED_SET_REG LATFSET +//#define LORA_ACTIVITY_LED_CLEAR_REG LATFCLR +//#define LORA_ACTIVITY_LED_TOGGLE_MASK _LATE_LATF1_MASK + + // #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + // #define GP_DEBUG_1_PIN LATEbits.LATE5 + // #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + // #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + // #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 + // #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs +#define SPI_SDO_PIN_DIR TRISGbits.TRISG8 +#define SPI_SDI_PIN_DIR TRISGbits.TRISG7 +#define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + + + + //SD Card +#define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 +#define SD_SPI_SS_PIN LATBbits.LATB13 + + //SPI Flash +#define FLASH_SS_PIN_DIR TRISEbits.TRISE3 +#define FLASH_SS_PIN LATEbits.LATE3 + + + //Wifi (WINC3400 module) +#define WIFI_SPI_SS_PIN_DIR TRISEbits.TRISE0 +#define WIFI_SPI_SS_PIN LATEbits.LATE0 +#define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 +#define WIFI_IRQ_PIN PORTDbits.RD0 + + // #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + // #define WIFI_SPI_CFG_PIN LATEbits.LATE1 +#define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 +#define WIFI_CHP_EN_PIN LATEbits.LATE2 +#define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE4 +#define WIFI_CHP_RST_PIN LATEbits.LATE4 + + //Chalet power relay +#define POWER_RELAY_ON_PIN_DIR TRISEbits.TRISE7 +#define POWER_RELAY_ON_PIN LATEbits.LATE7 //X2- +#define POWER_RELAY_OFF_PIN_DIR TRISGbits.TRISG9 +#define POWER_RELAY_OFF_PIN LATGbits.LATG9 //X3- + + //Harakiri relay +#define HARAKIRI_RELAY_ON_PIN_DIR TRISDbits.TRISD6 +#define HARAKIRI_RELAY_ON_PIN LATDbits.LATD6 + + //12V presence detection input +#define CHALET_12V_PRESENCE_PIN_DIR TRISBbits.TRISB15 +#define CHALET_12V_PRESENCE_PIN PORTBbits.RB15 //X2- + + //Battery voltage measurement (analog input) +#define BATTERY_VOLTAGE_ANALOG_PIN_DIR TRISBbits.TRISB1 //X2-7 + + // //Current sensor. Those pins tristate is controlled by the I2C module + //#define CURRENT_MODULE_I2C_SCL_PIN_DIR TRISDbits.TRISD3 + //#define CURRENT_MODULE_I2C_SDA_PIN_DIR TRISDbits.TRISD2 + + //Onboard temperature sensor (SPI) +#define TEMP_SENSOR_CS_PIN_DIR TRISDbits.TRISD4 +#define TEMP_SENSOR_CS_PIN LATDbits.LATD4 +#define TEMP_SENSOR_SPI_SDO_PIN_DIR TRISDbits.TRISD3 +#define TEMP_SENSOR_SPI_SDI_PIN_DIR TRISDbits.TRISD2 +#define TEMP_SENSOR_SPI_SCK_PIN_DIR TRISDbits.TRISD1 + + + //Analog (Hall effect) current sensor +#define CURRENT_SENSOR_IN1_PIN_DIR TRISBbits.TRISB2 +#define CURRENT_SENSOR_IN2_PIN_DIR TRISBbits.TRISB0 + + //LoRa +#define LORA_MODULE_RELAY_PIN_DIR TRISDbits.TRISD11 +#define LORA_MODULE_RELAY_PIN LATDbits.LATD11 +#define LORA_MODULE_M0_PIN_DIR TRISDbits.TRISD3 //V2 +#define LORA_MODULE_M0_PIN LATDbits.LATD3 +#define LORA_MODULE_M1_PIN_DIR TRISDbits.TRISD9 +#define LORA_MODULE_M1_PIN LATDbits.LATD9 +#define LORA_MODULE_INT_PIN_DIR TRISDbits.TRISD8 +#define LORA_MODULE_INT_PIN PORTDbits.RD8 +//#define LORA_MODULE_RX_LED_PIN_DIR TRISCbits.TRISC14 +//#define LORA_MODULE_RX_LED_PIN LATCbits.LATC14 +//#define LORA_MODULE_TX_LED_PIN_DIR TRISCbits.TRISC13 +//#define LORA_MODULE_TX_LED_PIN LATCbits.LATC13 +#define LORA_MODULE_RX_LED_PIN_DIR TRISBbits.TRISB4 +#define LORA_MODULE_RX_LED_PIN LATBbits.LATB4 +#define LORA_MODULE_TX_LED_PIN_DIR TRISFbits.TRISF1 +#define LORA_MODULE_TX_LED_PIN LATFbits.LATF1 + + + //LCD Screen +#define LCD_RS_PIN_DIR TRISDbits.TRISD5 +#define LCD_RS_PIN LATDbits.LATD5 +#define LCD_RW_PIN_DIR TRISBbits.TRISB13 +#define LCD_RW_PIN LATBbits.LATB13 +#define LCD_E_PIN_DIR TRISBbits.TRISB12 +#define LCD_E_PIN LATBbits.LATB12 +#define LCD_DB4_PIN_DIR TRISBbits.TRISB3 +#define LCD_DB4_PIN LATBbits.LATB3 +#define LCD_DB5_PIN_DIR TRISBbits.TRISB9 +#define LCD_DB5_PIN LATBbits.LATB9 +#define LCD_DB6_PIN_DIR TRISBbits.TRISB10 +#define LCD_DB6_PIN LATBbits.LATB10 +#define LCD_DB7_PIN_DIR TRISBbits.TRISB11 +#define LCD_DB7_PIN LATBbits.LATB11 +#define LCD_SCROLL_BTN_PIN_DIR TRISBbits.TRISB5 +#define LCD_SCROLL_BTN_PIN PORTBbits.RB5 + + /* ************************************************************************** */ + /* Prototypes */ + void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/ChaloupeLora.X/Source/BoardCfg_Fubarino.h b/ChaloupeLora.X/Source/BoardCfg_Fubarino.h new file mode 100644 index 0000000..ef129eb --- /dev/null +++ b/ChaloupeLora.X/Source/BoardCfg_Fubarino.h @@ -0,0 +1,58 @@ +/* + * File: DigitalIO_Fubarino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_FUBARINO_H +#define DIGITALIO_FUBARINO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +/* ************************************************************************** */ +/* Defines */ + +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + +//Output pins hardware definitions +// + #define HEARTBEAT_LED_1_PIN_DIR TRISEbits.TRISE5 + #define HEARTBEAT_LED_1_PIN LATEbits.LATE5 + #define HEARTBEAT_LED_1_TOGGLE_REG LATEINV + #define HEARTBEAT_LED_1_SET_REG LATESET + #define HEARTBEAT_LED_1_CLEAR_REG LATECLR + #define HEARTBEAT_LED_1_TOGGLE_MASK _LATE_LATE5_MASK + + #define HEARTBEAT_LED_2_PIN_DIR TRISEbits.TRISE2 + #define HEARTBEAT_LED_2_PIN LATEbits.LATE2 + #define HEARTBEAT_LED_2_TOGGLE_REG LATEINV + #define HEARTBEAT_LED_2_SET_REG LATESET + #define HEARTBEAT_LED_2_CLEAR_REG LATECLR + #define HEARTBEAT_LED_2_TOGGLE_MASK _LATE_LATE2_MASK + + #define SD_SPI_SDO_PIN_DIR TRISGbits.TRISG8 + #define SD_SPI_CS_PIN_DIR TRISGbits.TRISG9 + #define SD_SPI_CS_PIN LATGbits.LATG9 + #define SD_SPI_SDI_PIN_DIR TRISGbits.TRISG7 + #define SD_SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + +/* ************************************************************************** */ +/* Prototypes */ +void InitDigitalIO(void); + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_FUBARINO_H */ + diff --git a/ChaloupeLora.X/Source/BoardCfg_Pinguino.h b/ChaloupeLora.X/Source/BoardCfg_Pinguino.h new file mode 100644 index 0000000..041115e --- /dev/null +++ b/ChaloupeLora.X/Source/BoardCfg_Pinguino.h @@ -0,0 +1,104 @@ +/* + * File: DigitalIO_Pinguino.h + * Author: JF + * + * Created on November 24, 2018, 3:20 PM + */ + +#ifndef DIGITALIO_PINGUINO_H +#define DIGITALIO_PINGUINO_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +/* ************************************************************************** */ +/* Defines */ + +#define SYS_FREQ (80000000L) //Clock period = 12.5 ns +#define PERIPHERAL_FREQ (80000000L) + + + +//Output pins hardware definitions +// +// #define HEARTBEAT_LED_2_PIN_DIR TRISGbits.TRISG6 +// #define HEARTBEAT_LED_2_PIN LATGbits.LATG6 +// #define HEARTBEAT_LED_2_TOGGLE_REG LATGINV +// #define HEARTBEAT_LED_2_SET_REG LATGSET +// #define HEARTBEAT_LED_2_CLEAR_REG LATGCLR +// #define HEARTBEAT_LED_2_TOGGLE_MASK _LATG_LATG6_MASK + + #define HEARTBEAT_LED_1_PIN_DIR TRISDbits.TRISD1 + #define HEARTBEAT_LED_1_PIN LATDbits.LATD1 + #define HEARTBEAT_LED_1_TOGGLE_REG LATDINV + #define HEARTBEAT_LED_1_SET_REG LATDSET + #define HEARTBEAT_LED_1_CLEAR_REG LATDCLR + #define HEARTBEAT_LED_1_TOGGLE_MASK _LATD_LATD1_MASK + + +// #define SD_CARD_DETECT_PIN_DIR TRISDbits.TRISD8 +// #define SD_CARD_DETECT_PIN LATDbits.LATD8 + + //SPI port defs + #define SPI_SDO_PIN_DIR TRISGbits.TRISG8 + #define SPI_SDI_PIN_DIR TRISGbits.TRISG7 + #define SPI_SCK_PIN_DIR TRISGbits.TRISG6 + + //SD Card + #define SD_SPI_SS_PIN_DIR TRISBbits.TRISB13 + #define SD_SPI_SS_PIN LATBbits.LATB13 + + //Wifi (WINC3400 module) + #define WIFI_SPI_SS_PIN_DIR TRISFbits.TRISF1 + #define WIFI_SPI_SS_PIN LATFbits.LATF1 + #define WIFI_IRQ_PIN_DIR TRISDbits.TRISD0 + #define WIFI_IRQ_PIN PORTDbits.RD0 + #define WIFI_WAKE_PIN_DIR TRISEbits.TRISE0 + #define WIFI_WAKE_PIN LATEbits.LATE0 + #define WIFI_SPI_CFG_PIN_DIR TRISEbits.TRISE1 + #define WIFI_SPI_CFG_PIN LATEbits.LATE1 + #define WIFI_CHP_EN_PIN_DIR TRISEbits.TRISE2 + #define WIFI_CHP_EN_PIN LATEbits.LATE2 + #define WIFI_CHP_RST_PIN_DIR TRISEbits.TRISE3 + #define WIFI_CHP_RST_PIN LATEbits.LATE3 + + //Control knob encoder + #define KNOB_PH_A_PIN_DIR TRISDbits.TRISD8 + #define KNOB_PH_A_PIN PORTDbits.RD8 + #define KNOB_PH_B_PIN_DIR TRISDbits.TRISD7 + #define KNOB_PH_B_PIN PORTDbits.RD7 + #define KNOB_TGLE_BTN_PIN_DIR TRISDbits.TRISD11 + #define KNOB_TGLE_BTN_PIN PORTDbits.RD11 + + //Led controller PWM + #define LED_PWM_PIN_DIR TRISDbits.TRISD2 + #define LED_PWM_PIN LATDbits.LATD2 + #define LED_PWM_VAL_REG OC3RS + + + //Misc CPU or board related defines + #define PWM_RANGE_MAX 16000 + + #define GP_DEBUG_1_PIN_DIR TRISEbits.TRISE5 + #define GP_DEBUG_1_PIN LATEbits.LATE5 + #define GP_DEBUG_2_PIN_DIR TRISEbits.TRISE6 + #define GP_DEBUG_2_PIN LATEbits.LATE6 + + + +/* ************************************************************************** */ +/* Prototypes */ +void InitDigitalIO(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* DIGITALIO_PINGUINO_H */ + diff --git a/ChaloupeLora.X/Source/BootloaderInterface.c b/ChaloupeLora.X/Source/BootloaderInterface.c new file mode 100644 index 0000000..f92298f --- /dev/null +++ b/ChaloupeLora.X/Source/BootloaderInterface.c @@ -0,0 +1,985 @@ +//#include + +#include "BootloaderInterface.h" +#include "BootloaderProtocol.h" +#include "ProtocolDefs.h" +#include "BoardCfg.h" +#include "timer.h" +#include "WiFiCtrl.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" +#include "NetworkProtocol.h" +#include "Syslog.h" +#include "checksum.h" +#include "FlashMapping.h" + + +#define BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... +#define BOOTLOADER_FLASH_WRITE_POLL_TIMEOUT 25//100 //ms +#define BOOTLOADER_FLASH_WRITE_MAX_POLL_COUNT 40//10 //One sector should not take more than 1s to erase... + + +unsigned char BootloaderBuffer[300]; +int BootloaderInterfaceState; + + +int DataChunkWritten; +int CurDataChunkIndex; +int FirmwareUploaded; +int CurDataChunkSize; + +int BooloaderFlashEraseState; +int BootloaderFlashErased; +unsigned int BootloaderCurFlashEraseAddress; +int BooloaderFlashErasePollCount; + +int BootloaderFlashWriteState; +unsigned int BootloaderCurFlashWriteAddress; +int BootloaderFlashWritePollCount; +int BootloaderFirmwareChunkWriteCount; +char* BootloaderFlashWriteDataPtr; + + +int BootloaderInterfaceInit() +{ + BootloaderProtocolInit(); + BootloaderResetStateMachine(); + BootloaderCheckFlashBootloaderData(); + update_crc_32(0,0); //Force to populate the CRC32 table... + return 1; +} + +void BootloaderInterfaceTick() +{ + BootloaderInterfaceStateMachine(BOOTLOADER_TICK_EVENT,0); +} + +void BootloaderExecuteCmd(char Cmd,bool CRCValid) +{ + unsigned char *DataBufPtr = BootloaderProtocolGetDataBufferPtr(); + if(CRCValid == 0) + { + printf("Bootloader received a frame with invalid CRC\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD); + return; + } + switch(Cmd) + { + case BOOTLOADER_HEARTBEAT_REQUEST: + { + printf("Bootloader Heartbeat Request\n"); + *DataBufPtr = 1; + BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1); + break; + } + case BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST: + { + printf("BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ERASE_FLASH_CMD); + break; + } + case BOOTLOADER_INIT_UPLOAD_REQUEST: + { + printf("BOOTLOADER_INIT_UPLOAD_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INIT_UPLOAD_CMD); + break; + } + case BOOTLOADER_GET_STATE_REQUEST: + { + printf("BOOTLOADER_GET_STATE_REQUEST\n"); + BootloaderProtocolSendBootloaderState((char)BootloaderInterfaceState); + break; + } + case BOOTLOADER_SEND_DATA_CHUNK_REQUEST: + { + // printf("BOOTLOADER_SEND_DATA_CHUNK_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_NEW_DATA_CHUNK_CMD); + break; + } + case BOOTLOADER_UPLOAD_FINISHED_REQUEST: + { + printf("BOOTLOADER_UPLOAD_FINISHED_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_UPLOAD_FINISHED_CMD); + break; + } + case BOOTLOADER_EXECUTE_UPGRAGE_REQUEST: + { + printf("BOOTLOADER_EXECUTE_UPGRAGE_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD); + break; + } + case BOOTLOADER_ABORT_OPERATION_REQUEST: + { + printf("BOOTLOADER_ABORT_OPERATION_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ABORT_CMD); + } + case BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST: + { + printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_CHECK_FLASH_CMD); + break; + } + case BOOTLOADER_GET_STORED_FIRMWARE_INFO_REQUEST: + { + printf("BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST\n"); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD); + break; + } + default: + { + break; + } + } +} + +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC) +{ + printf("BootloaderProtocol detected a CRC error. Cmd: %d, RxCRC:0x%x, Expected:[0x%x]\n",Cmd,RxCRC,ExpectedCRC); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_INVALID_CRC_CMD); +} + +void BootloaderInterfaceStateMachine(int Event, int Param) +{ + + switch(BootloaderInterfaceState) + { + case BOOTLOADER_STANDBY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + if(Param == BOOTLOADER_SM_ACTIVATE_CMD) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + printf("Bootloader Interface going into active state\n"); + + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ACTIVE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ERASE_FLASH_CMD: + { + ResetBootloaderFlashEraseStateMachine(); //Setup the state machine + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE); + BootloaderInterfaceState = BOOTLOADER_ERASE_FLASH_STATE; + printf("Bootloader Interface going into Erase Flash state\n"); + break; + } + case BOOTLOADER_SM_INIT_UPLOAD_CMD: + { + + if(BootloaderFlashErased == 0) + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED); + } + else + { + BootloaderProtocolSendInitUploadResponse(BOOTLOADEDR_INIT_TRANSFER_OK); + + //TODO: Shall we prepare something before?? + BootloaderProtocolSendACK(BOOTLOADER_READY_FOR_DATA_RESPONSE); + + BootloaderInterfaceState = BOOTLOADER_RECEIVING_FIRMWARE_STATE; + printf("Bootloader Interface going into Firmware RX state\n"); + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + case BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD: + { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderProtocolSendACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader will now upgrade and reboot!!\n"); + + char Flags[2]; + Flags[BOOTLOADER_FLAGS_ACTION_FLAG_INDEX] = BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE; + Flags[BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX] = BOOTLOADER_FLASH_FIRMWARE_VALIDATOR; + SPIFlashWriteBuffer(Flags,2,FLASH_BTLDR_FLAGS_ADDRESS); + + Sleep(100); + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + + } + else + { + BootloaderProtocolSendNACK(BOOTLOADER_EXECUTE_UPGRADE_RESPONSE); + printf("Bootloader upgrade request denied: Firmware not uploaded\n"); + } + break; + } + case BOOTLOADER_SM_CHECK_FLASH_CMD: + { + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_SUCCESS); + } + else + { + BootloaderProtocolSendFlashCheckResult(FLASH_CHECK_FAILED); + } + break; + } + case BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD: + { + char Response[21]; + memset(Response,0xFF,sizeof(Response)); + + if(BootloaderCheckFlashBootloaderData() != RET_OK) + { + Response[0] = 0; + } + else + { + Response[0] = 1; + BootloaderIntToBytes(&Response[1],mStoredBootloaderInfo.Firmwareflags); + BootloaderIntToBytes(&Response[5],mStoredBootloaderInfo.NbRecords); + BootloaderIntToBytes(&Response[9],mStoredBootloaderInfo.FirmwareSize); + BootloaderIntToBytes(&Response[13],mStoredBootloaderInfo.Versioncode); + BootloaderIntToBytes(&Response[17],mStoredBootloaderInfo.DataCRC32); + } + + BootloaderProtocolSendStoredFirmwareInfoResponse(Response,sizeof(Response)); + + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_ERASE_FLASH_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_ERASE_RUNNING_RES: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_RES: + { + printf("Flash erase finished. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + BootloaderFlashErased = 1; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_RES: + { + printf("Flash erase error. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + case BOOTLOADER_FLASH_ERASE_ABORT_RES: + { + printf("Flash erase abort. Bootloader Interface going into Active state\n"); + BootloaderProtocolSendNACK(BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE); //TODO: send result instead + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + break; + } + } + + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO: stop erasing and reset SM. + //TODO invalidate data in Flash + BootloaderFlashEraseStateMachine(BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT); + printf("Aborting Flash erase, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_RECEIVING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + int res = BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT); + switch(res) + { + case BOOTLOADER_FLASH_WRITING_RES: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_SUCCESS,CurDataChunkIndex); + printf("Bootloader Chunk %d successfuly written to flash\n",CurDataChunkIndex); + CurDataChunkIndex++; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_RES: + { + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR,CurDataChunkIndex); + BootloaderResetStateMachine(); + printf("Bootloader Flash write error. Aborting and going into STANDBY state\n"); + break; + } + case BOOTLOADER_FLASH_WRITE_ABORT_RES: + { + break; + } + } + + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_NEW_DATA_CHUNK_CMD: + { + + //TODO:Check data validity + //TODO: Write data to flash + + //Extract index from buffer + unsigned int DataChunkIndex = 0; + unsigned int DataChunkSize = 0; + DataChunkSize = 0; + + // DataChunkIndex = BootloaderBuffer[0]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[1]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[2]; + // DataChunkIndex <<= 8; + // DataChunkIndex += BootloaderBuffer[3]; + DataChunkIndex = BootloaderBytesToInt(&BootloaderBuffer[0]); + + // DataChunkSize = BootloaderBuffer[4]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[5]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[6]; + // DataChunkSize <<= 8; + // DataChunkSize += BootloaderBuffer[7]; + DataChunkSize = BootloaderBytesToInt(&BootloaderBuffer[4]); + + + BootloaderFlashWriteDataPtr = &BootloaderBuffer[8]; + + //Check CRC + + + + if(CurDataChunkIndex != DataChunkIndex) + { + //Error... abort. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX,CurDataChunkIndex); + printf("Bootloader Interface ABORTING UPLOAD. Received invalid chunk index. Rx: [%d] - Expected: [%d]\n", DataChunkIndex,CurDataChunkIndex); + ResetBootloaderFlashWriteStateMachine(); + + } + else + { + CurDataChunkSize = DataChunkSize; + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT); + printf("Bootloader Interface. Rx new data chunk. Writing to flash. Index: %d\n", DataChunkIndex); + } + + break; + } + case BOOTLOADER_SM_INVALID_CRC_CMD: + { + //BootloaderProtocol determined the CRC of the chunk was invalid. + BootloaderProtocolSendDataChunkResult(BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND,CurDataChunkIndex); + printf("Bootloader Interface invalid chunk CRC. Requesting resend chunk index [%d]\n", CurDataChunkIndex); + break; + } + case BOOTLOADER_SM_UPLOAD_FINISHED_CMD: + { + printf("Bootloader Interface firmware upload finished. Check flash integrity.\n"); + + if(BootloaderCheckFlashBootloaderData() == RET_OK) + { + BootloaderInterfaceState = BOOTLOADER_ACTIVE_STATE; + //BootloaderProtocolSendACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_SUCCESS); + FirmwareUploaded = 1; + } + else + { + printf("Firmware integrity check failed. Going back to STANDBY state.\n"); + // BootloaderProtocolSendNACK(BOOTLOADER_UPLOAD_FINISHED_RESPONSE); + BootloaderProtocolSendFirmwareUploadResult(BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR); + BootloaderResetStateMachine(); + FirmwareUploaded = 0; + } + break; + } + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Bootloader aborting firmware download. Going back to STANDBY state\n"); + BootloaderFlashWriteStateMachine(BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT); + BootloaderResetStateMachine(); + break; + } + default: + { + //WHAT TO DO??? + + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_SENDING_FIRMWARE_COPY_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + case BOOTLOADER_PRINTING_FIRMWARE_STATE: + { + switch(Event) + { + case BOOTLOADER_TICK_EVENT: + { + break; + } + case BOOTLOADER_NEW_CMD_EVENT: + { + switch(Param) + { + case BOOTLOADER_SM_ABORT_CMD: + { + //TODO invalidate data in Flash + printf("Aborting upload, going into STANDBY mode\n"); + BootloaderResetStateMachine(); + break; + } + default: + { + //SEND NACK + BootloaderProtocolSendNACK(Param); + break; + } + } + break; + } + case BOOTLOADER_TIMEOUT_EVENT: + { + break; + } + } + + break; + } + } + +} + +void BootloaderResetStateMachine() +{ + BootloaderInterfaceState = BOOTLOADER_STANDBY_STATE; + DataChunkWritten = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkIndex = 0; + FirmwareUploaded = 0; + CurDataChunkSize = 0; + + + ResetBootloaderFlashEraseStateMachine(); + ResetBootloaderFlashWriteStateMachine(); + + CloseBootloaderServer(); +} + +void BootloaderActivateBootloader() +{ + OpenBootloaderServer(); + BootloaderInterfaceStateMachine(BOOTLOADER_NEW_CMD_EVENT,BOOTLOADER_SM_ACTIVATE_CMD); +} +void BootloaderDeactivateBootloader() +{ + BootloaderResetStateMachine(); + // CloseBootloaderServer(); + // BootloaderIterfaceStateMachine(BOOTLOADER_SM_ABORT_CMD,0); +} + +int BootloaderFlashEraseStateMachine(int event) +{ + if(event == BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT) + { + ResetBootloaderFlashEraseStateMachine(); + return BOOTLOADER_FLASH_ERASE_ABORT_RES; + } + + switch(BooloaderFlashEraseState) + { + case BOOTLOADER_FLASH_ERASE_SECTOR_STATE: + { + if(SPIFlashErase64KSector(BootloaderCurFlashEraseAddress,0) == RET_ERROR) + { + + printf("Bootloader Interface Erasing sector %0x%x\n", BootloaderCurFlashEraseAddress); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + BooloaderFlashErasePollCount = 0; + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE; + break; + } + case BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE: + { + if(IsTimerExpired(BOOTLOADER_FLASH_POLL_TIMER) == 1) + { + if(SPIFlashCheckBusy() == 0) //sector erased + { + if(BootloaderCurFlashEraseAddress == FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD) + { + //Whole bootloader partition is erased. + printf("Bootloader Interface: Last sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_FINISHED_STATE; + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + else + { + printf("Bootloader Interface sector 0x%x erased after %d polls\n",BootloaderCurFlashEraseAddress,BooloaderFlashErasePollCount); + BootloaderCurFlashEraseAddress += SPI_FLASH_64K_SECTOR_SIZE; + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + } + } + else + { + if(BooloaderFlashErasePollCount >= BOOTLOADER_FLASH_ERASE_MAX_POLL_COUNT) + { + printf("Bootloader Interface Flash erase error. Max poll count reached : %d!!!\n",BooloaderFlashErasePollCount); + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_ERROR_STATE; + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + } + else + { + TimerStart(BOOTLOADER_FLASH_POLL_TIMER,BOOTLOADER_FLASH_ERASE_POLL_TIMEOUT); + BooloaderFlashErasePollCount++; + } + } + } + break; + } + case BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_ERASE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_ERASE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_ERASE_ERROR_STATE: + { + return BOOTLOADER_FLASH_ERASE_ERROR_RES; + break; + } + } + + return BOOTLOADER_FLASH_ERASE_RUNNING_RES; +} + +int ResetBootloaderFlashEraseStateMachine() +{ + BooloaderFlashEraseState = BOOTLOADER_FLASH_ERASE_SECTOR_STATE; + BootloaderCurFlashEraseAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BooloaderFlashErasePollCount = 0; + BootloaderFlashErased = 0; +} + +int BootloaderFlashWriteStateMachine(int event) +{ + switch(BootloaderFlashWriteState) + { + case BOOTLOADER_FLASH_WRITE_STANDBY_STATE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + //TODO: timeout + // return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + else if(event == BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT) + { + // printf("Starting writing data to Flash\nFlash Address : Data\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_BUFFER_STATE; + BootloaderFirmwareChunkWriteCount = 0; + return BOOTLOADER_FLASH_WRITING_RES; + } + break; + } + case BOOTLOADER_FLASH_WRITE_BUFFER_STATE: + { + if(BootloaderFlashWriteDataPtr == 0) + { + ResetBootloaderFlashWriteStateMachine(); + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + while(BootloaderFirmwareChunkWriteCount < CurDataChunkSize) + { + + //printf("%d : 0x%x\n",(BootloaderCurFlashWriteAddress-FLASH_BTLDR_FIRMWARE_START_ADDRESS),(unsigned int)*BootloaderFlashWriteDataPtr); + if(SPIFlashWriteByte(BootloaderCurFlashWriteAddress++,*BootloaderFlashWriteDataPtr++,1) == RET_ERROR) + { + printf("Bootloader flash error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + + + int cnt = 0; + while(1) + { + if(SPIFlashCheckBusy() == 0) + { + break; + } + if(cnt++ > 200) + { + printf("Bootloader flash write timeout error. Aborting and going back to STANDBY\n"); + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_ERROR_STATE; + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + } + } + + BootloaderFirmwareChunkWriteCount++; + } + + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE; + return BOOTLOADER_FLASH_WRITING_RES; + + // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + // return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + + + break; + } + case BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE: + { + if(event == BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT) + { + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + // if(SyslogIsBufferEmpty() == RET_OK) + // { + // BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + // return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + // } + // else + // { + // return BOOTLOADER_FLASH_WRITING_RES; + // } + } + break; + } + case BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE: + { + break; + } + case BOOTLOADER_FLASH_WRITE_FINISHED_STATE: + { + return BOOTLOADER_FLASH_WRITE_FINISHED_RES; + break; + } + case BOOTLOADER_FLASH_WRITE_ERROR_STATE: + { + return BOOTLOADER_FLASH_WRITE_ERROR_RES; + break; + } + + } +} + +int BootloaderPrintFlashData() +{ + +} + +int BootloaderCheckFlashBootloaderData() +{ + + unsigned char FlashData[700]; + unsigned int FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + unsigned int FileHeaderCode, FirmwareFlags, NbRecords, FirmwareSize, VersionCode, CRC32; + unsigned int ComputedCRC32 = CRC_START_32; + + //SPIFlashReadBuffer(FlashData,700,FlashAddress); + + + printf("Checking Flash bootloader data integrity... \n"); + SPIFlashReadBuffer(FlashData,FLASH_BTLDR_HEADER_SIZE,FlashAddress); + + FileHeaderCode = BootloaderBytesToInt(FlashData); + FirmwareFlags = BootloaderBytesToInt(&FlashData[4]); + NbRecords = BootloaderBytesToInt(&FlashData[8]); + FirmwareSize = BootloaderBytesToInt(&FlashData[12]); + VersionCode = BootloaderBytesToInt(&FlashData[16]); + CRC32 = BootloaderBytesToInt(&FlashData[20]); + + mStoredBootloaderInfo.Firmwareflags = FirmwareFlags; + mStoredBootloaderInfo.NbRecords = NbRecords; + mStoredBootloaderInfo.FirmwareSize = FirmwareSize; + mStoredBootloaderInfo.Versioncode = VersionCode; + mStoredBootloaderInfo.DataCRC32 = CRC32; + + //printf("File Header: Code:[0x%x] - Flags:[0x%x] - Nb Records:[%d] - Firmware Size:[%d] - Version:[0x%x] - CRC32:[0x%x]\n",FileHeaderCode,FirmwareFlags,NbRecords,FirmwareSize,VersionCode,CRC32); + + + if(FileHeaderCode != BOOTLOADER_FILE_HEADER_CODE) + { + // printf("Invalid file header code, aborting\n"); + return RET_ERROR; + } + if(NbRecords == 0) + { +// printf("No records in file (NbRecords = 0), aborting\n"); + return RET_ERROR; + } + + FlashAddress += FLASH_BTLDR_HEADER_SIZE; //point to the start of bootloader data + + int CurRecord = 0; + bool Done = false; + int RecHeader, RecSize, RecStartAddress; + + //Check the header of each sector. + while(Done == false) + { + SPIFlashReadBuffer(FlashData,12,FlashAddress); + RecHeader = BootloaderBytesToInt(FlashData); + RecSize = BootloaderBytesToInt(&FlashData[4]); + RecStartAddress = BootloaderBytesToInt(&FlashData[8]); + FlashAddress += 12; + + + if(RecHeader != BOOTLOADER_RECORD_HEADER_CODE) + { + // printf("Error in record #%d. Invalid header code : [0x%x]\n",CurRecord,RecHeader); + return RET_ERROR; + } + if(RecSize == 0) + { + // printf("Error in record #%d. Invalid record size (RecordSize = 0) \n"); + return RET_ERROR; + } + + // printf("Record #%d OK! Header:[0x%x] - Size:[%d] - Start Address:[0x%x]\n",CurRecord,RecHeader,RecSize,RecStartAddress); + // while(SyslogIsBufferEmpty() == RET_ERROR) + // { + // SyslogTick(); + // TickWiFi(); + // } + + CurRecord++; + if(CurRecord == NbRecords) + { + // Done = true; + // printf("All records checked OK! Computing CRC...\n"); + Done = true; + break; + //return RET_OK; + } + else + { + FlashAddress += RecSize; + } + } + + //Now, compute whole data CRC + FlashAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS + FLASH_BTLDR_HEADER_SIZE; + char Byte; + int i; + for(i = 0; i < FirmwareSize; i++) + { + SPIFlashReadBuffer(&Byte,1,FlashAddress++); + ComputedCRC32 = update_crc_32(ComputedCRC32,Byte); + } + ComputedCRC32 ^= 0xffffffffL; + + if(ComputedCRC32 == CRC32) + { + // printf("CRC32 matches. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check success. Firmware is valid\n"); + return RET_OK; + } + else + { + // printf("CRC32 mismatch. Computed:[0x%x] - Expected:[0x%x]\n",ComputedCRC32,CRC32); + // printf("Flash check failed.\n"); + return RET_ERROR; + } + + + + + + + + return RET_OK; + +} + +int ResetBootloaderFlashWriteStateMachine() +{ + BootloaderFlashWriteState = BOOTLOADER_FLASH_WRITE_STANDBY_STATE; + BootloaderCurFlashWriteAddress = FLASH_BTLDR_FIRMWARE_START_ADDRESS; + BootloaderFlashWritePollCount = 0; + BootloaderFirmwareChunkWriteCount = 0; + BootloaderFlashWriteDataPtr = 0; + BootloaderFirmwareChunkWriteCount = 0; + return RET_OK; +} + +int BootloaderBytesToInt(unsigned char *Bytes) +{ + if(Bytes == 0) + { + return 0; + } + + int Output = Bytes[0]; + Output <<= 8; + Output += Bytes[1]; + Output <<= 8; + Output += Bytes[2]; + Output <<= 8; + Output += Bytes[3]; + + return Output; +} + +int BootloaderIntToBytes(unsigned char *Buf, unsigned int Input) +{ + if(Buf == 0) + { + return 0; + } + + Buf[3] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[2] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[1] = (unsigned char)(Input & 0xFF); + Input >>= 8; + Buf[0] = (unsigned char)(Input & 0xFF); + Input >>= 8; + + return 1; + +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/BootloaderInterface.h b/ChaloupeLora.X/Source/BootloaderInterface.h new file mode 100644 index 0000000..4dc9508 --- /dev/null +++ b/ChaloupeLora.X/Source/BootloaderInterface.h @@ -0,0 +1,182 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef BOOTLOADERINTERFACE_H +#define BOOTLOADERINTERFACE_H +#include "define.h" + + +#define BOOTLOADER_FILE_HEADER_CODE (int)0xBAADBEEF +#define BOOTLOADER_RECORD_HEADER_CODE (int)0xDEADBEEF +#define BOOTLOADER_FLASH_FIRMWARE_VALIDATOR 0xA8 +#define BOOTLOADER_ENTER_UPLOAD_MODE_VALIDATOR 0x5A + +typedef struct +{ + unsigned char BootloaderAction; + unsigned char BootloaderActionValidator; + +}stBootloaderFlags_t; + +typedef struct +{ + unsigned int Firmwareflags; + unsigned int NbRecords; + unsigned int FirmwareSize; + unsigned int Versioncode; + unsigned int DataCRC32; +}stStoredBootloaderInfo; + +extern stBootloaderFlags_t mBootloaderFlags; +stStoredBootloaderInfo mStoredBootloaderInfo; + +enum eBootloaderFlagsIndex +{ + BOOTLOADER_FLAGS_ACTION_FLAG_INDEX = 0, + BOOTLOADER_FLAGS_ACTION_VALIDATOR_INDEX, + + + BOOTLOADER_FLAGS_MAX_INDEX = 12 +}; + +enum eBootloaderActionFlagValues +{ + BOOTLOADER_ACTION_JUMP_TO_APP_VALUE = 0, + BOOTLOADER_ACTION_FLASH_FIRMWARE_VALUE = 1, + BOOTLOADER_ACTION_ENTER_UPDATE_MODE_VALUE = 2, + + BOOTLOADER_ACTION_MAX_VALUE + +}; + + +enum eBootloaderStates +{ + BOOTLOADER_STANDBY_STATE, + BOOTLOADER_ACTIVE_STATE, + BOOTLOADER_ERASE_FLASH_STATE, + BOOTLOADER_RECEIVING_FIRMWARE_STATE, + BOOTLOADER_SENDING_FIRMWARE_COPY_STATE, + BOOTLOADER_PRINTING_FIRMWARE_STATE, + + BOOTLOADER_MAX_STATE +}; + +enum eBootloaderStateMachineEvents +{ + BOOTLOADER_TICK_EVENT, + BOOTLOADER_NEW_CMD_EVENT, + BOOTLOADER_TIMEOUT_EVENT, + + BOOTLOADER_MAX_EVENT +}; + +enum eBootloaderFlashEraseStates +{ + BOOTLOADER_FLASH_ERASE_SECTOR_STATE, + BOOTLOADER_FLASH_ERASE_WAIT_FOR_SECTOR_DONE, + BOOTLOADER_FLASH_ERASE_CHECKBACK_STATE, + BOOTLOADER_FLASH_ERASE_FINISHED_STATE, + BOOTLOADER_FLASH_ERASE_ERROR_STATE, + + BOOTLOADER_FLASH_ERASE_MAX_STATE +}; + +enum eBootloaderFlashEraseResults +{ + BOOTLOADER_FLASH_ERASE_RUNNING_RES, + BOOTLOADER_FLASH_ERASE_FINISHED_RES, + BOOTLOADER_FLASH_ERASE_ERROR_RES, + BOOTLOADER_FLASH_ERASE_ABORT_RES, + + BOOTLOADER_FLASH_ERASE_MAX_RES +}; + +enum eBootloaderFlahsEraseSMEvents +{ + BOOTLOADER_FLASH_ERASE_SM_TICK_EVENT, + BOOTLOADER_FLASH_ERASE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_ERASE_SM_MAX_EVENT +}; + +enum eBootloaderFlashWriteStates +{ + BOOTLOADER_FLASH_WRITE_STANDBY_STATE, + BOOTLOADER_FLASH_WRITE_BUFFER_STATE, + BOOTLOADER_FLASH_WRITE_WAIT_FOR_BYTE_DONE, + BOOTLOADER_FLASH_WRITE_CHECKBACK_STATE, + BOOTLOADER_FLASH_WRITE_FINISHED_STATE, + BOOTLOADER_FLASH_WRITE_ERROR_STATE, + + BOOTLOADER_FLASH_WRITE_MAX_STATE +}; + +enum eBootloaderFlashWriteResults +{ + BOOTLOADER_FLASH_WRITING_RES, + BOOTLOADER_FLASH_WRITE_FINISHED_RES, + BOOTLOADER_FLASH_WRITE_ERROR_RES, + BOOTLOADER_FLASH_WRITE_ABORT_RES, + + BOOTLOADER_FLASH_WRITE_MAX_RES +}; + +enum eBootloaderFlahsWriteSMEvents +{ + BOOTLOADER_FLASH_WRITE_SM_TICK_EVENT, + BOOTLOADER_FLASH_WRITE_SM_NEW_BUFFER_EVENT, + BOOTLOADER_FLASH_WRITE_SM_ABORT_EVENT, + + BOOTLOADER_FLASH_WRITE_SM_MAX_EVENT +}; + + +enum eBootloaderStateMachineCmds +{ + BOOTLOADER_SM_ACTIVATE_CMD, + BOOTLOADER_SM_ABORT_CMD, + BOOTLOADER_SM_ERASE_FLASH_CMD, + BOOTLOADER_SM_INIT_UPLOAD_CMD, + BOOTLOADER_SM_NEW_DATA_CHUNK_CMD, + BOOTLOADER_SM_UPLOAD_FINISHED_CMD, + BOOTLOADER_SM_EXECUTE_UPGRAGE_CMD, + BOOTLOADER_SM_INVALID_CRC_CMD, + BOOTLOADER_SM_CHECK_FLASH_CMD, + BOOTLOADER_SM_GET_FIRMWARE_DATA_CMD +}; + + +extern unsigned char BootloaderBuffer[300]; + +int BootloaderInterfaceInit(); +void BootloaderExecuteCmd(char Cmd,bool CRCValid); +void BootloaderCRCError(char Cmd, int RxCRC, int ExpectedCRC); + + +void BootloaderInterfaceTick(); +void BootloaderInterfaceStateMachine(int Event, int Param); +void BootloaderResetStateMachine(); +void BootloaderActivateBootloader(); +void BootloaderDeactivateBootloader(); + +int BootloaderFlashEraseStateMachine(int event); +int ResetBootloaderFlashEraseStateMachine(); + +int BootloaderFlashWriteStateMachine(int event); +int ResetBootloaderFlashWriteStateMachine(); + +int BootloaderCheckFlashBootloaderData(); +int BootloaderPrintFlashData(); + +int BootloaderBytesToInt(unsigned char *Bytes); +int BootloaderIntToBytes(unsigned char *Buf, unsigned int Input); + + + +#endif /* BOOTLOADERINTERFACE_H */ + diff --git a/ChaloupeLora.X/Source/BootloaderProtocol.c b/ChaloupeLora.X/Source/BootloaderProtocol.c new file mode 100644 index 0000000..164db64 --- /dev/null +++ b/ChaloupeLora.X/Source/BootloaderProtocol.c @@ -0,0 +1,427 @@ +/********************************************************************** + Project: Automatic cat feeder + Date: march 19 2006 + Author: Jean-Franďż˝ois Martel + Target: PIC 18F252 + Compiler: Microchip mcc18 + Filename: Protocol.c + + File description: Communication protocol implementation. + + + jean-francois.martel@polymtl.ca + **********************************************************************/ +#include "define.h" +#include +#include "ProtocolDefs.h" +#include "BootloaderProtocol.h" +#include "BootloaderInterface.h" +#include "WiFiCtrl.h" +#include "checksum.h" + + +//test +unsigned int BootloaderHeader = 0; +unsigned int BootloaderDataSize = 0; +unsigned int BootloaderDataCtr = 0; +unsigned int BootloaderBufPtr = 0; +unsigned int BootloaderCRC = 0; +unsigned int BtldrComputedCRC = CRC_START_32; +unsigned char *BootloaderRxPtr; +unsigned char BootloaderCommand = 0; +unsigned char BootloaderState = RxHeader1; +const unsigned char *BootloaderDataStartPtr = &BootloaderBuffer[9]; + + +static char MyDeviceID = ID_SPRINKLER_DEVICE; + +void BootloaderProtocolInit(void) +{ + BootloaderProtocolResetStateMachine(); + +} + +void BootloaderProtocolStateMachine(unsigned char Data) +{ + switch(BootloaderState) + { + case Initialization: //Reset all pointers and data... + { + BootloaderDataSize = 0; + BootloaderBufPtr = 0; + BootloaderCommand = 0; + BootloaderCRC = 0; + BootloaderState = RxHeader1; + BtldrComputedCRC = CRC_START_32; + break; + } + case RxHeader1: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xDE + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_1) + { + BootloaderState = RxHeader2; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader2: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xAD + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_2) + { + BootloaderState = RxHeader3; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader3: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xBE + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(Data == BOOTLOADER_FRAME_HEADER_3) + { + BootloaderState = RxHeader4; + } + else + { + BootloaderProtocolResetStateMachine(); + } + break; + } + case RxHeader4: //Wait for data header... + { + BootloaderHeader <<= 8; + BootloaderHeader += Data; //0xEF + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderHeader != BOOTLOADER_FRAME_HEADER) + { + //TODO, send NACK? + BootloaderProtocolResetStateMachine(); + break; + } + else + { + BootloaderState = RxCmd; + } + + break; + } + case RxCmd: + { + BootloaderCommand = Data; + BootloaderState = RxPayloadSize1; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + break; + } + case RxPayloadSize1: + { + BootloaderDataSize = Data; + BootloaderState = RxPayloadSize2; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + break; + } + case RxPayloadSize2: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + BootloaderState = RxPayloadSize3; + break; + } + case RxPayloadSize3: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + BootloaderState = RxPayloadSize4; + break; + } + case RxPayloadSize4: + { + BootloaderDataSize <<= 8; + BootloaderDataSize += Data; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderDataSize > MAX_BOOTLOADER_PAYLOAD_SIZE+8) //+8 bytes for the size and index data + { + //TODO, send NACK? + BootloaderProtocolResetStateMachine(); + break; + } + + if(BootloaderDataSize == 0) + { + BootloaderState = RxCRC1; + } + else + { + BootloaderState = RxPayload; + } + break; + } + case RxPayload: //Data size + { + *BootloaderRxPtr = Data; + BootloaderRxPtr++; + + BootloaderDataCtr++; + BtldrComputedCRC = update_crc_32(BtldrComputedCRC,Data); + + if(BootloaderDataCtr == BootloaderDataSize) + { + BootloaderState = RxCRC1; + break; + } + + break; + } + case RxCRC1: //Data size + { + BootloaderCRC = Data; + BootloaderState = RxCRC2; + break; + } + case RxCRC2: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + BootloaderState = RxCRC3; + break; + } + case RxCRC3: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + BootloaderState = RxCRC4; + break; + } + case RxCRC4: //Data size + { + BootloaderCRC <<= 8; + BootloaderCRC += Data; + + //TODO: Compute and Compare CRC. + + BtldrComputedCRC ^= 0xffffffffL; + //if(BootloaderCRC != 0xBAADCAFE) + if(BootloaderCRC != BtldrComputedCRC) + { + BootloaderExecuteCmd(BootloaderCommand,0); + BootloaderProtocolResetStateMachine(); + return; + } + + BootloaderExecuteCmd(BootloaderCommand,1); + BootloaderProtocolResetStateMachine(); + break; + } + default: + { + BootloaderProtocolResetStateMachine(); + break; + } + } +} + +void BootloaderProtocolProtocolAnalyzeNewData(unsigned char *DataBuf, int size) +{ + int i; + for(i = 0; i < size; i++) + { + BootloaderProtocolStateMachine(*DataBuf++); + } +} + +void BootloaderProtocolResetStateMachine() +{ + BootloaderDataSize = 0; + BootloaderHeader = 0; + BootloaderBufPtr = 0; + BootloaderCommand = 0; + BootloaderCRC = 0; + BootloaderState = RxHeader1; + BootloaderDataCtr = 0; + BtldrComputedCRC = CRC_START_32; + BootloaderRxPtr = &BootloaderBuffer[0]; +} + +void BootloaderProtocolSendFrame(unsigned char Cmd, int Size) +{ + //Header + BootloaderBuffer[0] = BOOTLOADER_FRAME_HEADER_1; //Header + BootloaderBuffer[1] = BOOTLOADER_FRAME_HEADER_2; + BootloaderBuffer[2] = BOOTLOADER_FRAME_HEADER_3; + BootloaderBuffer[3] = BOOTLOADER_FRAME_HEADER_4; + + BootloaderBuffer[4] = Cmd; + + char nibble = (char)((Size >> 24) &0x000000FF); + BootloaderBuffer[5] = nibble; + + nibble = (char)((Size >> 16) &0x000000FF); + BootloaderBuffer[6] = nibble; + + nibble = (char)((Size >> 8) &0x000000FF); + BootloaderBuffer[7] = nibble; + + nibble = (char)(Size &0x000000FF); + BootloaderBuffer[8] = nibble; + + unsigned int CRC = CRC_START_32; + CRC = crc_32((const unsigned char*)BootloaderBuffer,Size+9); + + unsigned char* CRCPtr = (unsigned char*)BootloaderDataStartPtr + Size; + + nibble = (char)((CRC >> 24) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)((CRC >> 16) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)((CRC >> 8) &0x000000FF); + *CRCPtr++ = nibble; + + nibble = (char)(CRC &0x000000FF); + *CRCPtr++ = nibble; + + // *CRCPtr++ = 0xBA; + // *CRCPtr++ = 0xAD; + // *CRCPtr++ = 0xCA; + // *CRCPtr++ = 0xFE; + + SendBootloaderData(&BootloaderBuffer[0],Size + PROTOCOL_INFO_DATA_SIZE); +} + +unsigned char *BootloaderProtocolGetDataBufferPtr() +{ + return (unsigned char*)BootloaderDataStartPtr; +} + +void BootloaderProtocolSendHeartbeat() +{ + *BootloaderProtocolGetDataBufferPtr() = BOOTLOADER_ACK; + BootloaderProtocolSendFrame(BOOTLOADER_HEARTBEAT_RESPONSE,1); +} + +void BootloaderProtocolSendACK(unsigned char Cmd) +{ + *BootloaderProtocolGetDataBufferPtr() = BOOTLOADER_ACK; + BootloaderProtocolSendFrame(Cmd,1); +} + +void BootloaderProtocolSendNACK(unsigned char Cmd) +{ + *BootloaderProtocolGetDataBufferPtr() = 0; + BootloaderProtocolSendFrame(Cmd,1); +} + +void BootloaderProtocolSendInitUploadResponse(char result) +{ + int MaxSize = MAX_BOOTLOADER_PAYLOAD_SIZE; + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = result; + if(result == 1) + { + char nibble = (char)((MaxSize >> 24) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((MaxSize >> 16) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((MaxSize >> 8) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)(MaxSize &0x000000FF); + *DataPtr++ = nibble; + } + else + { + *DataPtr++ = 0; + *DataPtr++ = 0; + *DataPtr++ = 0; + *DataPtr++ = 0; + } + + BootloaderProtocolSendFrame(BOOTLOADER_INIT_UPLOAD_RESPONSE,5); +} + +void BootloaderProtocolSendDataChunkResult(char ErrorCode, int ChunkValue) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = ErrorCode; + + char nibble = (char)((ChunkValue >> 24) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((ChunkValue >> 16) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)((ChunkValue >> 8) &0x000000FF); + *DataPtr++ = nibble; + + nibble = (char)(ChunkValue &0x000000FF); + *DataPtr++ = nibble; + + BootloaderProtocolSendFrame(BOOTLOADER_SEND_DATA_CHUNK_RESPONSE,5); +} + +void BootloaderProtocolSendBootloaderState(char State) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = State; + + BootloaderProtocolSendFrame(BOOTLOADER_GET_STATE_RESPONSE,1); +} + +void BootloaderProtocolSendFirmwareUploadResult(char Result) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = Result; + + BootloaderProtocolSendFrame(BOOTLOADER_UPLOAD_FINISHED_RESPONSE,1); +} + +void BootloaderProtocolSendFlashCheckResult(char Result) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + *DataPtr++ = Result; + + BootloaderProtocolSendFrame(BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_RESPONSE,1); +} + +void BootloaderProtocolSendStoredFirmwareInfoResponse(unsigned char* FirmwareData, int size) +{ + char* DataPtr = BootloaderProtocolGetDataBufferPtr(); + + int i = 0; + for(i = 0; i < size; i++) + { + *DataPtr++ = *FirmwareData++; + } + + + BootloaderProtocolSendFrame(BOOTLOADER_GET_STORED_FIRMWARE_INFO_RESPONSE,size); +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/BootloaderProtocol.h b/ChaloupeLora.X/Source/BootloaderProtocol.h new file mode 100644 index 0000000..d8b777e --- /dev/null +++ b/ChaloupeLora.X/Source/BootloaderProtocol.h @@ -0,0 +1,123 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Franďż˝ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.h + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ + + +#ifndef BOOTLOADERPROTOCOL_H +#define BOOTLOADERPROTOCOL_H + +//Protocol buffer specific definitions + +#define MAX_BOOTLOADER_PAYLOAD_SIZE 150 +#define BOOTLOADER_FRAME_HEADER 0xDEADBEEF +#define BOOTLOADER_FRAME_HEADER_1 0xDE +#define BOOTLOADER_FRAME_HEADER_2 0xAD +#define BOOTLOADER_FRAME_HEADER_3 0xBE +#define BOOTLOADER_FRAME_HEADER_4 0xEF +#define PROTOCOL_INFO_DATA_SIZE 13 //Header + Cmd + Size + CRC = 13 bytes +//State Machine states +enum States +{ + Initialization, + RxHeader1, + RxHeader2, + RxHeader3, + RxHeader4, + RxCmd, + RxPayloadSize1, + RxPayloadSize2, + RxPayloadSize3, + RxPayloadSize4, + RxPayload, + RxCRC1, + RxCRC2, + RxCRC3, + RxCRC4 +}; + +enum eBootloaderProtocolDataTransferError +{ + BOOTLOADER_CHUNK_TRANSFER_SUCCESS = 1, + BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND = 2, + BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_FAILURE = 3, + BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX = 4, + BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR = 5, + + BOOTLOADER_CHUNK_TRANSFER_MAX_ERROR +}; + +enum eBootloaderProtocolInitTransferError +{ + BOOTLOADEDR_INIT_TRANSFER_ERROR = 0, + BOOTLOADEDR_INIT_TRANSFER_OK = 1, + BOOTLOADEDR_INIT_TRANSFER_ERROR_FLASH_NOT_ERASED, + + BOOTLOADEDR_INIT_TRANSFER_MAX_ERROR +}; + +enum eBootloaderUploadResult +{ + BOOTLOADER_UPLOAD_FAILED_UNKNOWN_ERROR = 0, + BOOTLOADER_UPLOAD_SUCCESS = 1, + BOOTLOADER_UPLOAD_FAILED_FLASH_VERIFICATION_ERROR = 2, + + BOOTLOADER_UPLOAD_MAX_ERROR +}; + +enum eFlashCheckResult +{ + FLASH_CHECK_FAILED = 0, + FLASH_CHECK_SUCCESS = 1, + + FLASH_CHECK_MAX_RESULT +}; + +//enum DEVICES_IDS +//{ +// ID_MASTER, //Master Controller +// ID_CONSOLE, //LCD Console +// ID_PC, //PC +// ID_AV_MUX, //Audio Video Multiplexer +// ID_IR_REMOTE, +// ID_DEADBOLT +//}; + +//enum MESSAGE_IDS +//{ +// TX_NETWORK_ACK = 1, +// RX_GET_STATUS, +// TX_DEADBOLT_STATUS, +// +// MAX_NETWORK_CMD +//}; + +//State machine states definition + +void BootloaderProtocolInit(void); +void BootloaderProtocolStateMachine(unsigned char STATE); +void BootloaderProtocolResetStateMachine(void); +void BootloaderProtocolProtocolAnalyzeNewData(unsigned char *DataBuf, int size); +void BootloaderProtocolSendFrame(unsigned char Cmd, int size); +unsigned char *BootloaderProtocolGetDataBufferPtr(); + +void BootloaderProtocolSendHeartbeat(); +void BootloaderProtocolSendACK(unsigned char Cmd); +void BootloaderProtocolSendNACK(unsigned char Cmd); +void BootloaderProtocolSendInitUploadResponse(char result); +void BootloaderProtocolSendDataChunkResult(char ErrorCode, int ChunkValue); +void BootloaderProtocolSendBootloaderState(char State); +void BootloaderProtocolSendFirmwareUploadResult(char Result); +void BootloaderProtocolSendFlashCheckResult(char Result); +void BootloaderProtocolSendStoredFirmwareInfoResponse(unsigned char* FirmwareData, int size); + +#endif \ No newline at end of file diff --git a/ChaloupeLora.X/Source/ChaletPowerRelay.c b/ChaloupeLora.X/Source/ChaletPowerRelay.c new file mode 100644 index 0000000..e6ba667 --- /dev/null +++ b/ChaloupeLora.X/Source/ChaletPowerRelay.c @@ -0,0 +1,79 @@ +//#include + +#include "ChaletPowerRelay.h" +#include "BoardCfg.h" +#include "timer.h" + +#define PIN_ACTIVE 1 +#define PIN_INACTIVE 0 + +bool PowerRelayState; + +void InitChaletPowerRelay() +{ + POWER_RELAY_ON_PIN = PIN_INACTIVE; + POWER_RELAY_OFF_PIN = PIN_INACTIVE; + PowerRelayState = CHALET_POWER_RELAY_UNKNOWN_STATE; + TimerStop(CHALET_POWER_RELAY_COIL_TIMER); +} + +void ChaletPowerRelayTick() +{ + if(CHALET_12V_PRESENCE_PIN == CHALET_12V_POWER_STATE_ON) + { + if(PowerRelayState == CHALET_POWER_RELAY_OFF_STATE) + { + printf("Inverter turned ON\n"); + } + PowerRelayState = CHALET_POWER_RELAY_ON_STATE; + } + else + { + if(PowerRelayState == CHALET_POWER_RELAY_ON_STATE) + { + printf("Inverter turned OFF\n"); + } + PowerRelayState = CHALET_POWER_RELAY_OFF_STATE; + } + + if(IsTimerRunning(CHALET_POWER_RELAY_COIL_TIMER) == true) + { + if(IsTimerExpired(CHALET_POWER_RELAY_COIL_TIMER)) + { + POWER_RELAY_ON_PIN = PIN_INACTIVE; + POWER_RELAY_OFF_PIN = PIN_INACTIVE; + TimerStop(CHALET_POWER_RELAY_COIL_TIMER); + } + } + + if(IsTimerExpired(CHALET_POWER_RELAY_AUTOTURNOFF_TIMER)) + { + ChaletPowerRelayTurnOff(); + } +} + +void ChaletPowerRelayKickTimer() +{ + TimerStartSeconds(CHALET_POWER_RELAY_AUTOTURNOFF_TIMER,CHALET_OFFLINE_POWER_RELAY_RESET_TIMEOUT); +} + +bool ChaletPowerRelayTurnOn() +{ + POWER_RELAY_ON_PIN = PIN_ACTIVE; + TimerStart(CHALET_POWER_RELAY_COIL_TIMER,CHALET_POWER_RELAY_COIL_TIMEOUT); + // PowerRelayState = CHALET_POWER_RELAY_ON_STATE; + return true; +} + +bool ChaletPowerRelayTurnOff() +{ + POWER_RELAY_OFF_PIN = PIN_ACTIVE; + TimerStart(CHALET_POWER_RELAY_COIL_TIMER,CHALET_POWER_RELAY_COIL_TIMEOUT); + // PowerRelayState = CHALET_POWER_RELAY_OFF_STATE; + return true; +} + +char GetChaletPowerRelayState() +{ + return (char)PowerRelayState; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/ChaletPowerRelay.h b/ChaloupeLora.X/Source/ChaletPowerRelay.h new file mode 100644 index 0000000..92a94e1 --- /dev/null +++ b/ChaloupeLora.X/Source/ChaletPowerRelay.h @@ -0,0 +1,37 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef CHALETPOWERRELAY_H +#define CHALETPOWERRELAY_H +#include "define.h" + +#define CHALET_OFFLINE_POWER_RELAY_RESET_TIMEOUT 43200 //43,200 = 12 hours in seconds + +enum eChaletPowerRelayState +{ + CHALET_POWER_RELAY_OFF_STATE = 0, + CHALET_POWER_RELAY_ON_STATE, + CHALET_POWER_RELAY_UNKNOWN_STATE +}; + +#define CHALET_12V_POWER_STATE_ON 0 +#define CHALET_12V_POWER_STATE_OFF 1 + +#define CHALET_POWER_RELAY_COIL_TIMEOUT 200 //ms + +void InitChaletPowerRelay(); + +void ChaletPowerRelayTick(); +bool ChaletPowerRelayTurnOn(); +bool ChaletPowerRelayTurnOff(); +char GetChaletPowerRelayState(); +void ChaletPowerRelayKickTimer(); + + + +#endif /* CHALETPOWERRELAY_H */ + diff --git a/ChaloupeLora.X/Source/ChaletduinoBoard.c b/ChaloupeLora.X/Source/ChaletduinoBoard.c new file mode 100644 index 0000000..134f061 --- /dev/null +++ b/ChaloupeLora.X/Source/ChaletduinoBoard.c @@ -0,0 +1,130 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; + HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + + HEARTBEAT_LED_2_PIN = LED_OFF; + HEARTBEAT_LED_1_PIN = LED_ON; + + LORA_ACTIVITY_LED_PIN_DIR = PIN_OUTPUT; + LORA_ACTIVITY_LED_PIN = LED_OFF; + +// GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; +// GP_DEBUG_1_PIN = 0; +// GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; +// GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + FLASH_SS_PIN_DIR = PIN_OUTPUT; + FLASH_SS_PIN = 1; + + + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; + // WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + // WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + // DOOR_PAD_D0_PIN_DIR = PIN_INPUT; + // DOOR_PAD_D1_PIN_DIR + // DOOR_PAD_D1_PIN + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Falling edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 1; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); +// SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 50000); + SPI2CONbits.ON = 1; + + + //Chalet inverter power relay + POWER_RELAY_ON_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_OFF_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_ON_PIN = 0; + POWER_RELAY_OFF_PIN = 0; + + //Harakiri relay + HARAKIRI_RELAY_ON_PIN_DIR = PIN_OUTPUT; + HARAKIRI_RELAY_ON_PIN= 0; + + //12V presence detection input + CHALET_12V_PRESENCE_PIN_DIR = PIN_INPUT; + + //Battery voltage measurement (analog input) + BATTERY_VOLTAGE_ANALOG_PIN_DIR = PIN_INPUT; + + IEC0bits.INT1IE = 0; + IFS0bits.INT1IF = 0; + INTCONbits.INT1EP = 1; //Rising edge + IPC1bits.INT1IP = 2; + IPC1bits.INT1IS = 1; + // IEC0bits.INT1IE = 1; + + +// OC3CON = 0; +// OC3R = 0; +// OC3RS = 2000; //50% PWM +// OC3CONbits.OCTSEL = 0; +// OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + +//#ifdef __32MX330F064H__ +// RPD2Rbits.RPD2R = 0b1011; //RD2 peripheral selection = OC3 +//#endif +// +// T2CONbits.TON = 0; // Disable Timer +// // T2CONbits.TCS = 0; // Select internal instruction cycle clock +// T2CONbits.TGATE = 0; // Disable Gated Timer mode +// T2CONbits.TCKPS = 0b011; // Select 1:1 Prescaler +// TMR2 = 0x00; // Clear timer register +// +// +// IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level +// IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag +// IEC0bits.T2IE = 0; // Disable Timer 2 interrupt +// T2CONbits.TON = 1; // Start Timer +// +// OC3CONbits.ON = 1; + + + //ADC test + + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + AD1PCFGbits.PCFG1 = 0; + TRISBbits.TRISB1 = PIN_INPUT; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + AD1CHS = 0; + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON3bits.ADCS = 0xF0; + AD1CON3bits.SAMC = 0x01; + AD1CON1bits.ON = 1; + AD1CON1bits.SAMP = 1; + + return RET_OK; +} diff --git a/ChaloupeLora.X/Source/ChaletduinoV2Board.c b/ChaloupeLora.X/Source/ChaletduinoV2Board.c new file mode 100644 index 0000000..907bac6 --- /dev/null +++ b/ChaloupeLora.X/Source/ChaletduinoV2Board.c @@ -0,0 +1,204 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; + HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + + HEARTBEAT_LED_2_PIN = LED_OFF; + HEARTBEAT_LED_1_PIN = LED_ON; + +// LORA_ACTIVITY_LED_PIN_DIR = PIN_OUTPUT; +// LORA_ACTIVITY_LED_PIN = LED_OFF; + + // GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_1_PIN = 0; + // GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; + // GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + + //////////////// SPI FLASH ////////////////// + + FLASH_SS_PIN_DIR = PIN_OUTPUT; + FLASH_SS_PIN = 1; + + /////////////////////////// WIFI /////////////////// + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; + // WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + // WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Falling edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 1; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); + // SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 50000); + SPI2CONbits.ON = 1; + + + //////////////// INVERTER RELAY ////////////////// + //Chalet inverter power relay + POWER_RELAY_ON_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_OFF_PIN_DIR = PIN_OUTPUT; + POWER_RELAY_ON_PIN = 0; + POWER_RELAY_OFF_PIN = 0; + + + //////////////// HARAKIRI RELAY ////////////////// + //Harakiri relay + HARAKIRI_RELAY_ON_PIN_DIR = PIN_OUTPUT; + HARAKIRI_RELAY_ON_PIN= 0; + + //12V presence detection input + CHALET_12V_PRESENCE_PIN_DIR = PIN_INPUT; + + + //////////////// BATTERY MONITOR ////////////////// + //Battery voltage measurement (analog input) + BATTERY_VOLTAGE_ANALOG_PIN_DIR = PIN_INPUT; + + //ADC Config + + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O + AD1PCFGbits.PCFG1 = 0; + AD1PCFGbits.PCFG2 = 0; + TRISBbits.TRISB1 = PIN_INPUT; + TRISBbits.TRISB2 = PIN_INPUT; + + AD1CON1 = 0; + AD1CON2 = 0; + AD1CON3 = 0; + + AD1CHS = 0; + AD1CHSbits.CH0SA = 1; //AN1 + AD1CON3bits.ADCS = 0xF0; + AD1CON3bits.SAMC = 0x01; + AD1CON1bits.ON = 1; + AD1CON1bits.SAMP = 1; + + + //////////////// TEMPERATURE SENSOR ////////////////// + //Onboard temperature sensor (SPI) + TEMP_SENSOR_CS_PIN_DIR = PIN_OUTPUT; + TEMP_SENSOR_CS_PIN = 1; + TEMP_SENSOR_SPI_SDO_PIN_DIR = PIN_OUTPUT; + TEMP_SENSOR_SPI_SDI_PIN_DIR = PIN_INPUT; + TEMP_SENSOR_SPI_SCK_PIN_DIR = PIN_OUTPUT; + SPI3CON = 0; + SPI3CONbits.MSTEN = 1; + SPI3CONbits.CKE = 1; + SPI3CONbits.SMP = 0; + SPI3CONbits.CKP = 0; + SPI3BRG = SPICalculateBRG(PERIPHERAL_FREQ, 1000000); + SPI3CONbits.ON = 1; + + //////////////// CURRENT SENSOR ////////////////// + //Analog (Hall effect) current sensor + CURRENT_SENSOR_IN1_PIN_DIR = PIN_INPUT; //AN2 + CURRENT_SENSOR_IN2_PIN_DIR = PIN_INPUT; //AN0 + + //TODO + // AD1CHS = 0; + // AD1CHSbits.CH0SA = 1; //AN2 + // AD1CON3bits.ADCS = 0xF0; + // AD1CON3bits.SAMC = 0x01; + // AD1CON1bits.ON = 1; + // AD1CON1bits.SAMP = 1; + + + //////////////// LORA ////////////////// + LORA_MODULE_RELAY_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_RELAY_PIN = 0; +// LORA_MODULE_M0_PIN_DIR = PIN_INPUT; +// LORA_MODULE_M0_PIN = 0; +// LORA_MODULE_M1_PIN_DIR = PIN_INPUT; +// LORA_MODULE_M1_PIN = 0; + LORA_MODULE_INT_PIN_DIR = PIN_INPUT; + LORA_MODULE_RX_LED_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_RX_LED_PIN = LED_OFF; + LORA_MODULE_TX_LED_PIN_DIR = PIN_OUTPUT; + LORA_MODULE_TX_LED_PIN = LED_OFF; + + //////////////// LCD SCREEN ////////////////// + //LCD Screen + LCD_RS_PIN_DIR = PIN_OUTPUT; + LCD_RS_PIN = 0; + LCD_RW_PIN_DIR = PIN_OUTPUT; + LCD_RW_PIN = 0; + LCD_E_PIN_DIR = PIN_OUTPUT; + LCD_E_PIN = 0; + LCD_DB4_PIN_DIR = PIN_OUTPUT; + LCD_DB4_PIN = 0; + LCD_DB5_PIN_DIR = PIN_OUTPUT; + LCD_DB5_PIN = 0; + LCD_DB6_PIN_DIR = PIN_OUTPUT; + LCD_DB6_PIN = 0; + LCD_DB7_PIN_DIR = PIN_OUTPUT; + LCD_DB7_PIN = 0; + + LCD_SCROLL_BTN_PIN_DIR = PIN_INPUT; + + + + + ////// MISC UNUSED STUFF /////////// + // IEC0bits.INT1IE = 0; + // IFS0bits.INT1IF = 0; + // INTCONbits.INT1EP = 1; //Rising edge + // IPC1bits.INT1IP = 2; + // IPC1bits.INT1IS = 1; + // IEC0bits.INT1IE = 1; + + + // OC3CON = 0; + // OC3R = 0; + // OC3RS = 2000; //50% PWM + // OC3CONbits.OCTSEL = 0; + // OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + + //#ifdef __32MX330F064H__ + // RPD2Rbits.RPD2R = 0b1011; //RD2 peripheral selection = OC3 + //#endif + // + // T2CONbits.TON = 0; // Disable Timer + // // T2CONbits.TCS = 0; // Select internal instruction cycle clock + // T2CONbits.TGATE = 0; // Disable Gated Timer mode + // T2CONbits.TCKPS = 0b011; // Select 1:1 Prescaler + // TMR2 = 0x00; // Clear timer register + // + // + // IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level + // IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag + // IEC0bits.T2IE = 0; // Disable Timer 2 interrupt + // T2CONbits.TON = 1; // Start Timer + // + // OC3CONbits.ON = 1; + + + + + return RET_OK; +} diff --git a/ChaloupeLora.X/Source/CurrentSensor.c b/ChaloupeLora.X/Source/CurrentSensor.c new file mode 100644 index 0000000..8e059f5 --- /dev/null +++ b/ChaloupeLora.X/Source/CurrentSensor.c @@ -0,0 +1,15 @@ + +#include "define.h" +#include "CurrentSensor.h" +#include "ina219.h" + +int CurrentSensorInit() +{ + ina219SetCalibration_16V_200mA(); + return RET_OK; +} + +int GetSolarPanelCurrent() +{ + return ina219GetCurrent(); +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/CurrentSensor.h b/ChaloupeLora.X/Source/CurrentSensor.h new file mode 100644 index 0000000..8b79e4a --- /dev/null +++ b/ChaloupeLora.X/Source/CurrentSensor.h @@ -0,0 +1,16 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef CURRENTSENSOR_H +#define CURRENTSENSOR_H + +int CurrentSensorInit(); + +int GetSolarPanelCurrent(); + +#endif /* CURRENTSENSOR_H */ + diff --git a/ChaloupeLora.X/Source/DigitalIO.c b/ChaloupeLora.X/Source/DigitalIO.c new file mode 100644 index 0000000..f9ff8f8 --- /dev/null +++ b/ChaloupeLora.X/Source/DigitalIO.c @@ -0,0 +1,42 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "DigitalIO.h" +//#include "define.h" + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InitDigitalIO(void) +{ + + +} + + +//EOF + + diff --git a/ChaloupeLora.X/Source/DigitalIO.h b/ChaloupeLora.X/Source/DigitalIO.h new file mode 100644 index 0000000..1371b6f --- /dev/null +++ b/ChaloupeLora.X/Source/DigitalIO.h @@ -0,0 +1,36 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef DIGITAL_IO_H +#define DIGITAL_IO_H +#include "BoardCfg.h" + + + + +#endif +//EOF + + diff --git a/ChaloupeLora.X/Source/FatFS/diskio.c b/ChaloupeLora.X/Source/FatFS/diskio.c new file mode 100644 index 0000000..f94ac20 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/diskio.c @@ -0,0 +1,225 @@ +/*-----------------------------------------------------------------------*/ +/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ +/*-----------------------------------------------------------------------*/ +/* If a working storage control module is available, it should be */ +/* attached to the FatFs via a glue function rather than modifying it. */ +/* This is an example of glue functions to attach various exsisting */ +/* storage control modules to the FatFs module with a defined API. */ +/*-----------------------------------------------------------------------*/ + +#include "diskio.h" /* FatFs lower layer API */ + +/* Definitions of physical drive number for each drive */ +#define DEV_RAM 1 /* Example: Map Ramdisk to physical drive 0 */ +#define DEV_MMC 0 /* Example: Map MMC/SD card to physical drive 1 */ +#define DEV_USB 2 /* Example: Map USB MSD to physical drive 2 */ + + +/*-----------------------------------------------------------------------*/ +/* Get Drive Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + int result; + + switch (pdrv) { + case DEV_RAM : + // result = RAM_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + // result = MMC_disk_status(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + // result = USB_disk_status(); + + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Inidialize a Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat; + int result; + + switch (pdrv) { + case DEV_RAM : + //result = RAM_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_MMC : + // result = MMC_disk_initialize(); + + // translate the reslut code here + + return stat; + + case DEV_USB : + // result = USB_disk_initialize(); + + // translate the reslut code here + + return stat; + } + return STA_NOINIT; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to read */ +) +{ + DRESULT res; + int result; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + // result = RAM_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + // result = MMC_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + // result = USB_disk_read(buff, sector, count); + + // translate the reslut code here + + return res; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Start sector in LBA */ + UINT count /* Number of sectors to write */ +) +{ + DRESULT res; + int result; + + switch (pdrv) { + case DEV_RAM : + // translate the arguments here + + // result = RAM_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_MMC : + // translate the arguments here + + // result = MMC_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + + case DEV_USB : + // translate the arguments here + + // result = USB_disk_write(buff, sector, count); + + // translate the reslut code here + + return res; + } + + return RES_PARERR; +} + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0..) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + int result; + + switch (pdrv) { + case DEV_RAM : + + // Process of the command for the RAM drive + + return res; + + case DEV_MMC : + + // Process of the command for the MMC/SD card + + return res; + + case DEV_USB : + + // Process of the command the USB drive + + return res; + } + + return RES_PARERR; +} + diff --git a/ChaloupeLora.X/Source/FatFS/diskio.h b/ChaloupeLora.X/Source/FatFS/diskio.h new file mode 100644 index 0000000..f083cc7 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/diskio.h @@ -0,0 +1,101 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" + + +#define _USE_WRITE 1 +#define _USE_IOCTL 1 + +#define _USE +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); + +void disk_timerproc(void); + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ + +///* Generic command (Not used by FatFs) */ +//#define CTRL_POWER 5 /* Get/Set power status */ +//#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +//#define CTRL_EJECT 7 /* Eject media */ +//#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_FORMAT 5 /* Create physical format on the media */ +#define CTRL_POWER_IDLE 6 /* Put the device idle state */ +#define CTRL_POWER_OFF 7 /* Put the device off state */ +#define CTRL_LOCK 8 /* Lock media removal */ +#define CTRL_UNLOCK 9 /* Unlock media removal */ +#define CTRL_EJECT 10 /* Eject media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* MMC card type flags (MMC_GET_TYPE) */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ChaloupeLora.X/Source/FatFS/ff.c b/ChaloupeLora.X/Source/FatFS/ff.c new file mode 100644 index 0000000..d29601d --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/ff.c @@ -0,0 +1,6555 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module R0.13a / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2017, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if FF_DEFINED != 89352 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Character code support macros */ +#define IsUpper(c) ((c) >= 'A' && (c) <= 'Z') +#define IsLower(c) ((c) >= 'a' && (c) <= 'z') +#define IsDigit(c) ((c) >= '0' && (c) <= '9') +#define IsSurrogate(c) ((c) >= 0xD800 && (c) <= 0xDFFF) +#define IsSurrogateH(c) ((c) >= 0xD800 && (c) <= 0xDBFF) +#define IsSurrogateL(c) ((c) >= 0xDC00 && (c) <= 0xDFFF) + + +/* Additional file attribute bits for internal use */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Additional file access control and file status flags for internal use */ +#define FA_SEEKEND 0x20 /* Seek to end of the file on file open */ +#define FA_MODIFIED 0x40 /* File has been modified */ +#define FA_DIRTY 0x80 /* FIL.buf[] needs to be written-back */ + + +/* Name status flags in fn[11] */ +#define NSFLAG 11 /* Index of the name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NOLFN 0x40 /* Do not find LFN */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* Limits and boundaries */ +#define MAX_DIR 0x200000 /* Max size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Max size of exFAT directory */ +#define MAX_FAT12 0xFF5 /* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT16 0xFFF5 /* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT32 0x0FFFFFF5 /* Max FAT32 clusters (not specified, practical limit) */ +#define MAX_EXFAT 0x7FFFFFFD /* Max exFAT clusters (differs from specs, implementation limit) */ + + +/* FatFs refers the FAT structure as simple byte array instead of structure member +/ because the C structure is not binary compatible between different platforms */ + +#define BS_JmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor byte (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Number of sectors per track for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* WindowsNT error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* Filesystem type string (8-byte) */ +#define BS_BootCode 62 /* Boot code (448-byte) */ +#define BS_55AA 510 /* Signature word (WORD) */ + +#define BPB_FATSz32 36 /* FAT32: FAT size [sector] (DWORD) */ +#define BPB_ExtFlags32 40 /* FAT32: Extended flags (WORD) */ +#define BPB_FSVer32 42 /* FAT32: Filesystem version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: Filesystem type string (8-byte) */ +#define BS_BootCode32 90 /* FAT32: Boot code (420-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: MBZ field (53-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory start cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: Filesystem version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (WORD) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in unit of byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in unit of sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ +#define BPB_RsvdEx 113 /* exFAT: Reserved (7-byte) */ +#define BS_BootCodeEx 120 /* exFAT: Boot code (390-byte) */ + +#define DIR_Name 0 /* Short file name (11-byte) */ +#define DIR_Attr 11 /* Attribute (BYTE) */ +#define DIR_NTres 12 /* Lower case flag (BYTE) */ +#define DIR_CrtTime10 13 /* Created time sub-second (BYTE) */ +#define DIR_CrtTime 14 /* Created time (DWORD) */ +#define DIR_LstAccDate 18 /* Last accessed date (WORD) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_ModTime 22 /* Modified time (DWORD) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN: LFN order and LLE flag (BYTE) */ +#define LDIR_Attr 11 /* LFN: LFN attribute (BYTE) */ +#define LDIR_Type 12 /* LFN: Entry type (BYTE) */ +#define LDIR_Chksum 13 /* LFN: Checksum of the SFN (BYTE) */ +#define LDIR_FstClusLO 26 /* LFN: MBZ field (WORD) */ +#define XDIR_Type 0 /* exFAT: Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* exFAT: Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* exFAT: Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* exFAT: Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* exFAT: Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* exFAT: Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* exFAT: File attribute (WORD) */ +#define XDIR_CrtTime 8 /* exFAT: Created time (DWORD) */ +#define XDIR_ModTime 12 /* exFAT: Modified time (DWORD) */ +#define XDIR_AccTime 16 /* exFAT: Last accessed time (DWORD) */ +#define XDIR_CrtTime10 20 /* exFAT: Created time subsecond (BYTE) */ +#define XDIR_ModTime10 21 /* exFAT: Modified time subsecond (BYTE) */ +#define XDIR_CrtTZ 22 /* exFAT: Created timezone (BYTE) */ +#define XDIR_ModTZ 23 /* exFAT: Modified timezone (BYTE) */ +#define XDIR_AccTZ 24 /* exFAT: Last accessed timezone (BYTE) */ +#define XDIR_GenFlags 33 /* exFAT: General secondary flags (BYTE) */ +#define XDIR_NumName 35 /* exFAT: Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* exFAT: Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* exFAT: Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* exFAT: First cluster of the file data (DWORD) */ +#define XDIR_FileSize 56 /* exFAT: File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define DDEM 0xE5 /* Deleted directory entry mark set to DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Offset of partition table in the MBR */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define PTE_Boot 0 /* MBR PTE: Boot indicator */ +#define PTE_StHead 1 /* MBR PTE: Start head */ +#define PTE_StSec 2 /* MBR PTE: Start sector */ +#define PTE_StCyl 3 /* MBR PTE: Start cylinder */ +#define PTE_System 4 /* MBR PTE: System ID */ +#define PTE_EdHead 5 /* MBR PTE: End head */ +#define PTE_EdSec 6 /* MBR PTE: End sector */ +#define PTE_EdCyl 7 /* MBR PTE: End cylinder */ +#define PTE_StLba 8 /* MBR PTE: Start in LBA */ +#define PTE_SizLba 12 /* MBR PTE: Size in LBA */ + + +/* Post process on fatal error in the file operations */ +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Re-entrancy related */ +#if FF_FS_REENTRANT +#if FF_USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define LEAVE_FF(fs, res) return res +#endif + + +/* Definitions of volume - physical location conversion */ +#if FF_MULTI_PARTITION +#define LD2PD(vol) VolToPart[vol].pd /* Get physical drive number */ +#define LD2PT(vol) VolToPart[vol].pt /* Get partition index */ +#else +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Find first valid partition or in SFD */ +#endif + + +/* Definitions of sector size */ +#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if FF_MAX_SS == FF_MIN_SS +#define SS(fs) ((UINT)FF_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if FF_FS_NORTC == 1 +#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31 +#error Invalid FF_FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if FF_FS_LOCK != 0 +#if FF_FS_READONLY +#error FF_FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, containing directory (0:root) */ + DWORD ofs; /* Object ID 3, offset in the directory */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* SBCS up-case tables (\x80-\xFF) */ +#define TBL_CT437 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT720 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT737 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT771 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT775 {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT850 {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT852 {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT855 {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT857 {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT860 {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT861 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT862 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT863 {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT864 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT865 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT866 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT869 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + + +/* DBCS code range |----- 1st byte -----| |----------- 2nd byte -----------| */ +#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00} +#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00} +#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE} +#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00} + + +/* Macros for table definitions */ +#define MERGE_2STR(a, b) a ## b +#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp) + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ +/* Remark: Variables defined here without initial value shall be guaranteed +/ zero/null at start-up. If not, the linker option or start-up routine is +/ not compliance with C standard. */ + +/*--------------------------------*/ +/* File/Volume controls */ +/*--------------------------------*/ + +#if FF_VOLUMES < 1 || FF_VOLUMES > 10 +#error Wrong FF_VOLUMES setting +#endif +static FATFS *FatFs[FF_VOLUMES]; /* Pointer to the filesystem objects (logical drives) */ +static WORD Fsid; /* File system mount ID */ + +#if FF_FS_RPATH != 0 && FF_VOLUMES >= 2 +static BYTE CurrVol; /* Current drive */ +#endif + +#if FF_FS_LOCK != 0 +static FILESEM Files[FF_FS_LOCK]; /* Open object lock semaphores */ +#endif + + + +/*--------------------------------*/ +/* LFN/Directory working buffer */ +/*--------------------------------*/ + +#if FF_USE_LFN == 0 /* Non-LFN configuration */ +#if FF_FS_EXFAT +#error LFN must be enabled when enable exFAT +#endif +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#else /* LFN configurations */ +#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255 +#error Wrong setting of FF_MAX_LFN +#endif +#if FF_LFN_BUF < 12 || FF_SFN_BUF < 12 || FF_LFN_BUF < FF_SFN_BUF +#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +#endif +#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2 +#error Wrong setting of FF_LFN_UNICODE +#endif +static const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* FAT: Offset of LFN characters in the directory entry */ +#define MAXDIRB(nc) ((nc + 44U) / 15 * SZDIRE) /* exFAT: Size of directory entry block scratchpad buffer needed for the name length */ + +#if FF_USE_LFN == 1 /* LFN enabled with static working buffer */ +#if FF_FS_EXFAT +static BYTE DirBuf[MAXDIRB(FF_MAX_LFN)]; /* Directory entry block scratchpad buffer */ +#endif +static WCHAR LfnBuf[FF_MAX_LFN + 1]; /* LFN working buffer */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)]; /* LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; } +#define FREE_NAMBUF() +#else +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; /* LFN working buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; } +#define FREE_NAMBUF() +#endif +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#else +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#endif +#define LEAVE_MKFS(res) { if (!work) ff_memfree(buf); return res; } +#define MAX_MALLOC 0x8000 + +#else +#error Wrong setting of FF_USE_LFN + +#endif /* FF_USE_LFN == 1 */ +#endif /* FF_USE_LFN == 0 */ + + + +/*--------------------------------*/ +/* Code conversion tables */ +/*--------------------------------*/ + +#if FF_CODE_PAGE == 0 /* Run-time code page configuration */ +#define CODEPAGE CodePage +static WORD CodePage; /* Current code page */ +static const BYTE *ExCvt, *DbcTbl; /* Pointer to current SBCS up-case table and DBCS code range table below */ +static const BYTE Ct437[] = TBL_CT437; +static const BYTE Ct720[] = TBL_CT720; +static const BYTE Ct737[] = TBL_CT737; +static const BYTE Ct771[] = TBL_CT771; +static const BYTE Ct775[] = TBL_CT775; +static const BYTE Ct850[] = TBL_CT850; +static const BYTE Ct852[] = TBL_CT852; +static const BYTE Ct855[] = TBL_CT855; +static const BYTE Ct857[] = TBL_CT857; +static const BYTE Ct860[] = TBL_CT860; +static const BYTE Ct861[] = TBL_CT861; +static const BYTE Ct862[] = TBL_CT862; +static const BYTE Ct863[] = TBL_CT863; +static const BYTE Ct864[] = TBL_CT864; +static const BYTE Ct865[] = TBL_CT865; +static const BYTE Ct866[] = TBL_CT866; +static const BYTE Ct869[] = TBL_CT869; +static const BYTE Dc932[] = TBL_DC932; +static const BYTE Dc936[] = TBL_DC936; +static const BYTE Dc949[] = TBL_DC949; +static const BYTE Dc950[] = TBL_DC950; + +#elif FF_CODE_PAGE < 900 /* Static code page configuration (SBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE); + +#else /* Static code page configuration (DBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE); + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static +WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static +DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if FF_FS_EXFAT +static +QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !FF_FS_READONLY +static +void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static +void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if FF_FS_EXFAT +static +void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !FF_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt != 0) { + do { + *d++ = *s++; + } while (--cnt); + } +} + + +/* Fill memory block */ +static +void mem_set (void* dst, int val, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + + do { + *d++ = (BYTE)val; + } while (--cnt); +} + + +/* Compare memory block */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) /* ZR:same, NZ:different */ +{ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) /* NZ:contained, ZR:not contained */ +{ + while (*str && *str != chr) str++; + return *str; +} + + +/* Test if the character is DBC 1st byte */ +static +int dbc_1st (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; /* 1st byte range 1 */ + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; /* 1st byte range 2 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +/* Test if the character is DBC 2nd byte */ +static +int dbc_2nd (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; /* 2nd byte range 1 */ + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; /* 2nd byte range 2 */ + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; /* 2nd byte range 3 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +#if FF_USE_LFN + +/* Get a character from TCHAR string in defined API encodeing */ +static +DWORD tchar2uni ( /* Returns character in UTF-16 encoding (>=0x10000 on double encoding unit, 0xFFFFFFFF on decode error) */ + const TCHAR** str /* Pointer to pointer to TCHAR string in configured encoding */ +) +{ + DWORD uc; + const TCHAR *p = *str; + +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + WCHAR wc; + + uc = *p++; + if (IsSurrogate(uc)) { /* Surrogate? */ + wc = *p++; /* Get low surrogate */ + if (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF; /* Wrong surrogate? */ + uc = uc << 16 | wc; + } + +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + BYTE b; + int nf; + + uc = (BYTE)*p++; /* Get a byte */ + if (uc & 0x80) { /* Multiple byte code? */ + if ((uc & 0xE0) == 0xC0) { /* 2-byte sequence? */ + uc &= 0x1F; nf = 1; + } else { + if ((uc & 0xF0) == 0xE0) { /* 3-byte sequence? */ + uc &= 0x0F; nf = 2; + } else { + if ((uc & 0xF8) == 0xF0) { /* 4-byte sequence? */ + uc &= 0x07; nf = 3; + } else { /* Wrong sequence */ + return 0xFFFFFFFF; + } + } + } + do { /* Get trailing bytes */ + b = (BYTE)*p++; + if ((b & 0xC0) != 0x80) return 0xFFFFFFFF; /* Wrong sequence? */ + uc = uc << 6 | (b & 0x3F); + } while (--nf != 0); + if (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x10000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + } + +#else /* ANSI/OEM input */ + BYTE b; + WCHAR wc; + + wc = (BYTE)*p++; /* Get a byte */ + if (dbc_1st((BYTE)wc)) { /* Is it a DBC 1st byte? */ + b = (BYTE)*p++; /* Get 2nd byte */ + if (!dbc_2nd(b)) return 0xFFFFFFFF; /* Invalid code? */ + wc = (wc << 8) + b; /* Make a DBC */ + } + if (wc != 0) { + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM ==> Unicode */ + if (wc == 0) return 0xFFFFFFFF; /* Invalid code? */ + } + uc = wc; + +#endif + *str = p; /* Next read pointer */ + return uc; +} + + +/* Output a TCHAR string in defined API encoding */ +static +BYTE put_utf ( /* Returns number of encoding units written (0:buffer overflow or wrong encoding) */ + DWORD chr, /* UTF-16 encoded character (Double encoding unit char if >=0x10000) */ + TCHAR* buf, /* Output buffer */ + UINT szb /* Size of the buffer */ +) +{ +#if FF_LFN_UNICODE == 1 /* UTF-16 output */ + WCHAR hs, wc; + + hs = (WCHAR)(chr >> 16); + wc = (WCHAR)chr; + if (hs == 0) { /* Single encoding unit? */ + if (szb < 1 || IsSurrogate(wc)) return 0; /* Buffer overflow or wrong code? */ + *buf = wc; + return 1; + } + if (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0; /* Buffer overflow or wrong surrogate? */ + *buf++ = hs; + *buf++ = wc; + return 2; + +#elif FF_LFN_UNICODE == 2 /* UTF-8 output */ + DWORD hc; + + if (chr < 0x80) { /* Single byte code? */ + if (szb < 1) return 0; /* Buffer overflow? */ + *buf = (TCHAR)chr; + return 1; + } + if (chr < 0x800) { /* 2-byte sequence? */ + if (szb < 2) return 0; /* Buffer overflow? */ + *buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 2; + } + if (chr < 0x10000) { /* 3-byte sequence? */ + if (szb < 3 || IsSurrogate(chr)) return 0; /* Buffer overflow or wrong code? */ + *buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 3; + } + /* 4-byte sequence */ + if (szb < 4) return 0; /* Buffer overflow? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + *buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07)); + *buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 4; + +#else /* ANSI/OEM output */ + WCHAR wc; + + wc = ff_uni2oem(chr, CODEPAGE); + if (wc >= 0x100) { /* Is this a DBC? */ + if (szb < 2) return 0; + *buf++ = (char)(wc >> 8); /* Store DBC 1st byte */ + *buf++ = (TCHAR)wc; /* Store DBC 2nd byte */ + return 2; + } + if (wc == 0 || szb < 1) return 0; /* Invalid char or buffer overflow? */ + *buf++ = (TCHAR)wc; /* Store the character */ + return 1; +#endif +} +#endif /* FF_USE_LFN */ + + +#if FF_FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +static +int lock_fs ( /* 1:Ok, 0:timeout */ + FATFS* fs /* Filesystem object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS* fs, /* Filesystem object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} + +#endif + + + +#if FF_FS_LOCK != 0 +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */ +) +{ + UINT i, be; + + /* Search open object table for the object */ + be = 0; + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matches with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == FF_FS_LOCK) { /* The object has not been opened */ + return (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK; /* Is there a blank entry for new object? */ + } + + /* The object was opened. Reject any open against writing file and all write mode open */ + return (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + return (i == FF_FS_LOCK) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < FF_FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == FF_FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + if (i == FF_FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc >= 1 && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; /* Index number origin from 1 */ +} + + +static +FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < FF_FS_LOCK) { /* Index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} + +#endif /* FF_FS_LOCK != 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the filesystem object */ +/*-----------------------------------------------------------------------*/ +#if !FF_FS_READONLY +static +FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Is the disk access window dirty */ + if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { /* Write back the window */ + fs->wflag = 0; /* Clear window dirty flag */ + if (fs->winsect - fs->fatbase < fs->fsize) { /* Is it in the 1st FAT? */ + if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); /* Reflect it to 2nd FAT if needed */ + } + } else { + res = FR_DISK_ERR; + } + } + return res; +} +#endif + + +static +FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs, /* Filesystem object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !FF_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if read data is not valid */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize filesystem and data on the storage */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT sync_fs ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ + /* Create FSInfo structure */ + mem_set(fs->win, 0, SS(fs)); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->pdrv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the lower layer */ + if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Get physical sector number from cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clst2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* Filesystem object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; /* Cluster number is origin from 2 */ + if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ + return fs->database + fs->csize * clst; /* Start sector number of the cluster */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; /* Get 1st byte of the entry */ + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; /* Merge 2nd byte of the entry */ + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); /* Adjust bit position */ + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; /* Simple DWORD array but mask out upper 4 bits */ + break; +#if FF_FS_EXFAT + case FS_EXFAT : + if (obj->objsize != 0) { + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2 && cofs <= clen) { /* Is it a contiguous chain? */ + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* No data on the FAT, generate the value */ + break; + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the 1st fragment? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (obj->n_frag != 0) { /* Is it on the growing edge? */ + val = 0x7FFFFFFF; /* Generate EOC */ + } else { + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF; + } + break; + } + } + /* go to default */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding filesystem object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; /* bc: byte offset of the entry */ + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Put 1st byte */ + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Put 2nd byte */ + fs->wflag = 1; + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); /* Simple WORD array */ + fs->wflag = 1; + break; + + case FS_FAT32 : +#if FF_FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_FS_EXFAT && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*--------------------------------------*/ +/* Find a contiguous free cluster block */ +/*--------------------------------------*/ + +static +DWORD find_bitmap ( /* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; /* (assuming bitmap is located top of the cluster heap) */ + i = val / 8 % SS(fs); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = SS(fs); + } + if (bv == 0) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check if run length is sufficient for required */ + } else { + scl = val; ctr = 0; /* Encountered a cluster in-use, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm != 0); + bm = 1; + } while (++i < SS(fs)); + } +} + + +/*----------------------------------------*/ +/* Set/Clear a block of allocation bitmap */ +/*----------------------------------------*/ + +static +FRESULT change_bitmap ( + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->database + clst / 8 / SS(fs); /* Sector address (assuming bitmap is located top of the cluster heap) */ + i = clst / 8 % SS(fs); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + i = 0; + } +} + + +/*---------------------------------------------*/ +/* Fill the first fragment of the FAT chain */ +/*---------------------------------------------*/ + +static +FRESULT fill_first_frag ( + FFOBJID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + + if (obj->stat == 3) { /* Has the object been changed 'fragmented' in this session? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + + +/*---------------------------------------------*/ +/* Fill the last fragment of the FAT chain */ +/*---------------------------------------------*/ + +static +FRESULT fill_last_frag ( + FFOBJID* obj, /* Pointer to the corresponding object */ + DWORD lcl, /* Last cluster of the fragment */ + DWORD term /* Value to set the last FAT entry */ +) +{ + FRESULT res; + + + while (obj->n_frag > 0) { /* Create the chain of last fragment */ + res = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term); + if (res != FR_OK) return res; + obj->n_frag--; + } + return FR_OK; +} + +#endif /* FF_FS_EXFAT && !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +static +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0:entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if FF_FS_EXFAT || FF_USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if FF_USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if FF_FS_EXFAT || FF_USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if FF_USE_TRIM + rt[0] = clst2sect(fs, scl); /* Start of data area freed */ + rt[1] = clst2sect(fs, ecl) + fs->csize - 1; /* End of data area freed */ + disk_ioctl(fs->pdrv, CTRL_TRIM, rt); /* Inform device the data in the block is no longer needed */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if FF_FS_EXFAT + /* Some post processes for chain status */ + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Has the entire chain been removed? */ + obj->stat = 0; /* Change the chain status 'initial' */ + } else { + if (obj->stat == 0) { /* Is it a fragmented chain from the beginning of this session? */ + clst = obj->sclust; /* Follow the chain to check if it gets contiguous */ + while (clst != pclst) { + nxt = get_fat(obj, clst); + if (nxt < 2) return FR_INT_ERR; + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; + if (nxt != clst + 1) break; /* Not contiguous? */ + clst++; + } + if (clst == pclst) { /* Has the chain got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Was the chain fragmented in this session and got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } + } + } +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Suggested cluster to start to find */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch a chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Test for insanity */ + if (cs == 0xFFFFFFFF) return cs; /* Test for disk error */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; /* Cluster to start to find */ + } + if (fs->free_clst == 0) return 0; /* No free cluster */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous' */ + } else { /* It is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + if (obj->stat != 2) { /* Is the file non-contiguous? */ + if (ncl == clst + 1) { /* Is the cluster next to previous one? */ + obj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2; /* Increment size of last framgent */ + } else { /* New fragment */ + if (obj->n_frag == 0) obj->n_frag = 1; + res = fill_last_frag(obj, clst, ncl); /* Fill last fragment on the FAT and link it to new one */ + if (res == FR_OK) obj->n_frag = 1; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + ncl = 0; + if (scl == clst) { /* Stretching an existing chain? */ + ncl = scl + 1; /* Test if next cluster is free */ + if (ncl >= fs->n_fatent) ncl = 2; + cs = get_fat(obj, ncl); /* Get next cluster status */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (cs != 0) { /* Not free? */ + cs = fs->last_clst; /* Start at suggested cluster if it is valid */ + if (cs >= 2 && cs < fs->n_fatent) scl = cs; + ncl = 0; + } + } + if (ncl == 0) { /* The new cluster cannot be contiguous and find another fragment */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster found? */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster? */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (ncl == scl) return 0; /* No free cluster found? */ + } + } + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Generate error status */ + } + + return ncl; /* Return new cluster number or error status */ +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +static +DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = (DWORD)(ofs / SS(fs) / fs->csize); /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} + +#endif /* FF_USE_FASTSEEK */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Fill a cluster with zeros */ +/*-----------------------------------------------------------------------*/ + +#if !FF_FS_READONLY +static +FRESULT dir_clear ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS *fs, /* Filesystem object */ + DWORD clst /* Directory table to clear */ +) +{ + DWORD sect; + UINT n, szb; + BYTE *ibuf; + + + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + sect = clst2sect(fs, clst); /* Top of the cluster */ + fs->winsect = sect; /* Set window to top of the cluster */ + mem_set(fs->win, 0, SS(fs)); /* Clear window buffer */ +#if FF_USE_LFN == 3 /* Quick table clear by using multi-secter write */ + /* Allocate a temporary buffer */ + for (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs); szb > SS(fs) && !(ibuf = ff_memalloc(szb)); szb /= 2) ; + if (szb > SS(fs)) { /* Buffer allocated? */ + mem_set(ibuf, 0, szb); + szb /= SS(fs); /* Bytes -> Sectors */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + ff_memfree(ibuf); + } else +#endif + { + ibuf = fs->win; szb = 1; /* Use window buffer (single-sector writes may take a time) */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + } + return (n == fs->csize) ? FR_OK : FR_DISK_ERR; +} +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (FF_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory on the FAT volume) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clst2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (dp->sect == 0) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; + + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (dp->sect == 0 || ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE; /* Report EOT when offset has reached max value */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (dp->clust == 0) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* It reached end of dynamic table */ +#if !FF_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ + if (FF_FS_EXFAT) dp->obj.stat |= 4; /* exFAT: The directory has been stretched */ +#else + if (!stretch) dp->sect = 0; /* (this line is to suppress compiler warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clst2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if FF_FS_EXFAT + if ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !FF_FS_READONLY +static +void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + +#if FF_USE_LFN +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ +static +int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ +static +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO is 0 */ + + i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= FF_MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + + +#if !FF_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ +static +void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LFN */ + + + +#if FF_USE_LFN && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static +void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number to the SFN body */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (dbc_1st(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* FF_USE_LFN && !FF_FS_READONLY */ + + + +#if FF_USE_LFN +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static +BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do { + sum = (sum >> 1) + (sum << 7) + *dir++; + } while (--n); + return sum; +} + +#endif /* FF_USE_LFN */ + + + +#if FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +static +WORD xdir_sum ( /* Get checksum of the directoly entry block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static +WORD xname_sum ( /* Get check sum (to be used as hash) of the name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = (WCHAR)ff_wtoupper(chr); /* File name needs to be upper-case converted */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +#if !FF_FS_READONLY && FF_USE_MKFS +static +DWORD xsum32 ( + BYTE dat, /* Byte to be calculated */ + DWORD sum /* Previous sum */ +) +{ + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +#endif + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ + +static +void get_xfileinfo ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + WCHAR wc, hs; + UINT di, si, nc; + + /* Get file name from the entry block */ + si = SZDIRE * 2; /* 1st C1 entry */ + nc = hs = di = 0; + while (nc < dirb[XDIR_NumName]) { + if (si >= MAXDIRB(FF_MAX_LFN)) { di = 0; break; } /* Truncated directory block? */ + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + wc = ld_word(dirb + si); si += 2; nc++; /* Get a character */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in UTF-16 or UTF-8 encoding */ + if (wc == 0) { di = 0; break; } /* Buffer overflow or wrong encoding? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object name? */ + fno->fname[di] = 0; /* Terminate the name */ + fno->altname[0] = 0; /* exFAT does not have SFN */ + + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ + +static +FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Reading direcotry object pointing top of the entry block to load */ +) +{ + FRESULT res; + UINT i, sz_ent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load 85 entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0x85) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE); + sz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE; + if (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR; + + /* Load C0 entry */ + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC0) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE); + if (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR; + + /* Load C1 entries */ + i = 2 * SZDIRE; /* C1 offset to load */ + do { + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != 0xC1) return FR_INT_ERR; /* Invalid order */ + if (i < MAXDIRB(FF_MAX_LFN)) mem_cpy(dirb + i, dp->dir, SZDIRE); + } while ((i += SZDIRE) < sz_ent); + + /* Sanity check (do it for only accessible object) */ + if (i <= MAXDIRB(FF_MAX_LFN)) { + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + } + return FR_OK; +} + + +/*------------------------------------------------------------------*/ +/* exFAT: Initialize object allocation info with loaded entry block */ +/*------------------------------------------------------------------*/ + +static +void init_alloc_info ( + FATFS* fs, /* Filesystem object */ + FFOBJID* obj /* Object allocation information to be initialized */ +) +{ + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Start cluster */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); /* Size */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; /* Allocation status */ + obj->n_frag = 0; /* No last fragment info */ +} + + + +#if !FF_FS_READONLY || FF_FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ +static +FRESULT load_obj_xdir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const FFOBJID* obj /* Object with its containing directory information */ +) +{ + FRESULT res; + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->obj.n_frag = 0; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto object's entry block */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !FF_FS_READONLY +/*----------------------------------------*/ +/* exFAT: Store the directory entry block */ +/*----------------------------------------*/ +static +FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + /* Store the direcotry entry block to the directory */ + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) break; + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ + +static +void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the object name */ +) +{ + UINT i; + BYTE nc1, nlen; + WCHAR wc; + + + /* Create 85,C0 entry */ + mem_set(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = 0x85; /* 85 entry */ + dirb[1 * SZDIRE + XDIR_Type] = 0xC0; /* C0 entry */ + + /* Create C1 entries */ + i = SZDIRE * 2; /* Top of C1 entries */ + nlen = nc1 = 0; wc = 1; + do { + dirb[i++] = 0xC1; dirb[i++] = 0; /* Entry type C1 */ + do { /* Fill name field */ + if (wc != 0 && (wc = lfn[nlen]) != 0) nlen++; /* Get a character if exist */ + st_word(dirb + i, wc); /* Store it */ + i += 2; + } while (i % SZDIRE != 0); + nc1++; + } while (lfn[nlen]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nlen; /* Set name length */ + dirb[XDIR_NumSec] = 1 + nc1; /* Set secondary count (C0 + C1s) */ + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); /* Set name hash */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_EXFAT */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +#define dir_read_file(dp) dir_read(dp, 0) +#define dir_read_label(dp) dir_read(dp, 1) + +static +FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE a, c; +#if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; /* Test for the entry type */ + if (c == 0) { + res = FR_NO_FILE; break; /* Reached to end of the directory */ + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + if (FF_USE_LABEL && vol) { + if (c == 0x83) break; /* Volume label entry? */ + } else { + if (c == 0x85) { /* Start of the file entry block? */ + dp->blk_ofs = dp->dptr; /* Get location of the block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if FF_USE_LFN /* LFN configuration */ + if (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord != 0 || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if FF_USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(fs->lfnbuf); /* Hash value of the name to find */ + + while ((res = dir_read_file(dp)) == FR_OK) { /* Read an item */ +#if FF_MAX_LFN < 255 + if (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue; /* Skip comparison if inaccessible object name */ +#endif + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip comparison if hash mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break; + } + if (nc == 0 && !fs->lfnbuf[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* On the FAT/FAT32 volume */ +#if FF_USE_LFN + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if FF_USE_LFN /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (ord == 0 && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], sum; + + + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set the allocated entry block offset */ + + if (dp->obj.stat & 4) { /* Has the directory been stretched? */ + dp->obj.stat &= ~4; + res = fill_first_frag(&dp->obj); /* Fill the first fragment on the FAT if needed */ + if (res != FR_OK) return res; + res = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF); /* Fill the last fragment on the FAT if needed */ + if (res != FR_OK) return res; + if (dp->obj.sclust != 0) { /* Is it a sub directory? */ + DIR dj; + + res = load_obj_xdir(&dj, &dp->obj); /* Load the object status */ + if (res != FR_OK) return res; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase the directory size by cluster size */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + } + + create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* On the FAT/FAT32 volume */ + mem_cpy(sn, dp->fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if FF_USE_LFN + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} + +#endif /* !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + DWORD last = dp->dptr; + + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + dp->dir[XDIR_Type] &= 0x7F; /* Clear the entry InUse flag. */ + } else { /* On the FAT/FAT32 volume */ + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'. */ + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'.*/ + fs->wflag = 1; + } +#endif + + return res; +} + +#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ + +static +void get_fileinfo ( + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT si, di; +#if FF_USE_LFN + WCHAR wc, hs; + FATFS *fs = dp->obj.fs; +#else + TCHAR c; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (dp->sect == 0) return; /* Exit if read pointer has reached end of directory */ + +#if FF_USE_LFN /* LFN configuration */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + get_xfileinfo(fs->dirbuf, fno); + return; + } else +#endif + { /* On the FAT/FAT32 volume */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + si = di = hs = 0; + while (fs->lfnbuf[si] != 0) { + wc = fs->lfnbuf[si++]; /* Get an LFN character (UTF-16) */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in UTF-16 or UTF-8 encoding */ + if (wc == 0) { di = 0; break; } /* Invalid char or buffer overflow? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + fno->fname[di] = 0; /* Terminate the LFN (null string means LFN is invalid) */ + } + } + + si = di = 0; + while (si < 11) { /* Get SFN from SFN entry */ + wc = dp->dir[si++]; /* Get a char */ + if (wc == ' ') continue; /* Skip padding spaces */ + if (wc == RDDEM) wc = DDEM; /* Restore replaced DDEM character */ + if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ +#if FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) { /* Make a DBC if needed */ + wc = wc << 8 | dp->dir[si++]; + } + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM -> Unicode */ + if (wc == 0) { di = 0; break; } /* Wrong char in the current code page? */ + wc = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di); /* Store it in UTF-16 or UTF-8 */ + if (wc == 0) { di = 0; break; } /* Buffer overflow? */ + di += wc; +#else /* ANSI/OEM output */ + fno->altname[di++] = (TCHAR)wc; /* Store it without any conversion */ +#endif + } + fno->altname[di] = 0; /* Terminate the SFN (null string means SFN is invalid) */ + + if (fno->fname[0] == 0) { /* If LFN is invalid, altname[] needs to be copied to fname[] */ + if (di == 0) { /* If LFN and SFN both are invalid, this object is inaccesible */ + fno->fname[di++] = '?'; + } else { + for (si = di = 0; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ + wc = (WCHAR)fno->altname[si]; + if (IsUpper(wc) && (dp->dir[DIR_NTres] & ((si >= 9) ? NS_EXT : NS_BODY))) wc += 0x20; + fno->fname[di] = (TCHAR)wc; + } + } + fno->fname[di] = 0; /* Terminate the LFN */ + if (!dp->dir[DIR_NTres]) fno->altname[0] = 0; /* Altname is not needed if neither LFN nor case info is exist. */ + } + +#else /* Non-LFN configuration */ + si = di = 0; + while (si < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[si++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = DDEM; /* Restore replaced DDEM character */ + if (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */ + fno->fname[di++] = c; + } + fno->fname[di] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + + +#if FF_USE_FIND && FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +static +DWORD get_achar ( /* Get a character and advances ptr */ + const TCHAR** ptr /* Pointer to pointer to the ANSI/OEM or Unicode string */ +) +{ + DWORD chr; + + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode input */ + chr = tchar2uni(ptr); + if (chr == 0xFFFFFFFF) chr = 0; /* Wrong UTF encoding is recognized as end of the string */ + chr = ff_wtoupper(chr); + +#else /* ANSI/OEM input */ + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#if FF_CODE_PAGE == 0 + if (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#elif FF_CODE_PAGE < 900 + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900 + if (dbc_1st((BYTE)chr)) { /* Get DBC 2nd byte if needed */ + chr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0; + } +#endif + +#endif + return chr; +} + + +static +int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + DWORD pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (*pat == 0 && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard block */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} + +#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */ + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if FF_USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR wc, *lfn; + DWORD uc; + UINT i, ni, si, di; + const TCHAR *p; + + + /* Create LFN into LFN working buffer */ + p = *path; lfn = dp->obj.fs->lfnbuf; di = 0; + for (;;) { + uc = tchar2uni(&p); /* Get a character */ + if (uc == 0xFFFFFFFF) return FR_INVALID_NAME; /* Invalid code or UTF decode error */ + if (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16); /* Store high surrogate if needed */ + wc = (WCHAR)uc; + if (wc < ' ' || wc == '/' || wc == '\\') break; /* Break if end of the path or a separator is found */ + if (wc < 0x80 && chk_chr("\"*:<>\?|\x7F", wc)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + if (di >= FF_MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ + lfn[di++] = wc; /* Store the Unicode character */ + } + while (*p == '/' || *p == '\\') p++; /* Skip duplicated separators if exist */ + *path = p; /* Return pointer to the next segment */ + cf = (wc < ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + +#if FF_FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) { /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + } + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + wc = lfn[di - 1]; + if (wc != ' ' && wc != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created into the working buffer */ + if (di == 0) return FR_INVALID_NAME; /* Reject null name */ + + /* Create SFN in directory form */ + for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ + if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ + while (di > 0 && lfn[di - 1] != '.') di--; /* Find last dot (di<=si: no extension) */ + + mem_set(dp->fn, ' ', 11); + i = b = 0; ni = 8; + for (;;) { + wc = lfn[si++]; /* Get an LFN character */ + if (wc == 0) break; /* Break on end of the LFN */ + if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ + cf |= NS_LOSS | NS_LFN; + continue; + } + + if (i >= ni || si == di) { /* End of field? */ + if (ni == 11) { /* Name extension overflow? */ + cf |= NS_LOSS | NS_LFN; + break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Name body overflow? */ + if (si > di) break; /* No name extension? */ + si = di; i = 8; ni = 11; b <<= 2; /* Enter name extension */ + continue; + } + + if (wc >= 0x80) { /* Is this a non-ASCII character? */ + cf |= NS_LFN; /* LFN entry needs to be created */ +#if FF_CODE_PAGE == 0 + if (ExCvt) { /* At SBCS */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ + } else { /* At DBCS */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ + } +#elif FF_CODE_PAGE < 900 /* SBCS cfg */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ +#else /* DBCS cfg */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ +#endif + } + + if (wc >= 0x100) { /* Is this a DBC? */ + if (i >= ni - 1) { /* Field overflow? */ + cf |= NS_LOSS | NS_LFN; + i = ni; continue; /* Next field */ + } + dp->fn[i++] = (BYTE)(wc >> 8); /* Put 1st byte */ + } else { /* SBC */ + if (wc == 0 || chk_chr("+,;=[]", wc)) { /* Replace illegal characters for SFN if needed */ + wc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(wc)) { /* ASCII upper case? */ + b |= 2; + } + if (IsLower(wc)) { /* ASCII lower case? */ + b |= 1; wc -= 0x20; + } + } + } + dp->fn[i++] = (BYTE)wc; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; /* Shift capital flags if no extension */ + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* LFN entry needs to be created if composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if (b & 0x01) cf |= NS_EXT; /* NT flag (Extension has small capital letters only) */ + if (b & 0x04) cf |= NS_BODY; /* NT flag (Body has small capital letters only) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created into dp->fn[] */ + + return FR_OK; + + +#else /* FF_USE_LFN : Non-LFN configuration */ + BYTE c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = 0; ni = 8; +#if FF_FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = p + si; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of the path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; /* Get a byte */ + if (c <= ' ') break; /* Break if end of the path name */ + if (c == '/' || c == '\\') { /* Break if a separator is found */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator if exist */ + break; + } + if (c == '.' || i >= ni) { /* End of body or field overflow? */ + if (ni == 11 || c != '.') return FR_INVALID_NAME; /* Field overflow or invalid dot? */ + i = 8; ni = 11; /* Enter file extension field */ + continue; + } +#if FF_CODE_PAGE == 0 + if (ExCvt && c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#elif FF_CODE_PAGE < 900 + if (c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#endif + if (dbc_1st(c)) { /* Check if it is a DBC 1st byte */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsLower(c)) c -= 0x20; /* To upper */ + sfn[i++] = c; + } + } + *path = p + si; /* Return pointer to the next segment */ + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + + return FR_OK; +#endif /* FF_USE_LFN */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + FATFS *fs = dp->obj.fs; + + +#if FF_FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + dp->obj.sclust = fs->cdir; /* Start from current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + dp->obj.sclust = 0; /* Start from root directory */ + } +#if FF_FS_EXFAT + dp->obj.n_frag = 0; /* Invalidate last fragment counter of the object */ +#if FF_FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && dp->obj.sclust) { /* exFAT: Retrieve the sub-directory's status */ + DIR dj; + + dp->obj.c_scl = fs->cdc_scl; + dp->obj.c_size = fs->cdc_size; + dp->obj.c_ofs = fs->cdc_ofs; + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) return res; + dp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + dp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (FF_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(dp->obj.attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Save containing directory information for next dir */ + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Open next directory */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static +int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + UINT i; + int vol = -1; +#if FF_STR_VOLUME_ID /* Find string drive id */ + static const char* const volid[] = {FF_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif + + + if (*path != 0) { /* If the pointer is not a null */ + for (tt = *path; (UINT)*tt >= (FF_USE_LFN ? ' ' : '!') && *tt != ':'; tt++) ; /* Find a colon in the path */ + if (*tt == ':') { /* If a colon is exist in the path name */ + tp = *path; + i = *tp++; + if (IsDigit(i) && tp == tt) { /* Is there a numeric drive id + colon? */ + if ((i -= '0') < FF_VOLUMES) { /* If drive id is found, get the value and strip it */ + vol = (int)i; + *path = ++tt; + } + } +#if FF_STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ + i = 0; tt++; + do { + sp = volid[i]; tp = *path; + do { /* Compare a string drive id with path name */ + c = *sp++; tc = *tp++; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < FF_VOLUMES); /* Repeat for each id until pattern match */ + if (i < FF_VOLUMES) { /* If a drive id is found, get the value and strip it */ + vol = (int)i; + *path = tt; + } + } +#endif + } else { /* No volume id and use default drive */ +#if FF_FS_RPATH != 0 && FF_VOLUMES >= 2 + vol = CurrVol; /* Current drive */ +#else + vol = 0; /* Drive 0 */ +#endif + } + } + return vol; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT VBR */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD sect /* Sector# (lba) to load and check if it is an FAT-VBR or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3; /* Check boot record signature (always placed here even if the sector size is >512) */ + +#if FF_FS_EXFAT + if (!mem_cmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; /* Check if exFAT VBR */ +#endif + if (fs->win[BS_JmpBoot] == 0xE9 || fs->win[BS_JmpBoot] == 0xEB || fs->win[BS_JmpBoot] == 0xE8) { /* Valid JumpBoot code? */ + if (!mem_cmp(fs->win + BS_FilSysType, "FAT", 3)) return 0; /* Is it an FAT VBR? */ + if (!mem_cmp(fs->win + BS_FilSysType32, "FAT32", 5)) return 0; /* Is it an FAT32 VBR? */ + } + return 2; /* Valid BS but not FAT */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Determine logical drive number and mount the volume if needed */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found filesystem object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the filesystem object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the filesystem object */ + if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ +#if FF_FS_REENTRANT + if (!lock_fs(fs)) return FR_TIMEOUT; /* Lock the volume */ +#endif + *rfs = fs; /* Return pointer to the filesystem object */ + + mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type != 0) { /* If the volume has been mounted */ + stat = disk_status(fs->pdrv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The filesystem object is valid */ + } + } + + /* The filesystem object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */ + + fs->fs_type = 0; /* Clear the filesystem object */ + fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; + if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; +#endif + + /* Find an FAT partition on the drive. Supports only generic partitioning rules, FDISK and SFD. */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT-VBR as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) { /* Not an FAT-VBR or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + (MBR_Table + i * SZ_PTE); + br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i != 0) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (LD2PT(vol) == 0 && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found (bsect). Following code initializes the filesystem object */ + +#if FF_FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + } + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA + 1 of the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + if (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + fs->n_fatent = nclst + 2; + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Check if bitmap location is in assumption (at the first cluster) */ + if (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR; + for (i = 0; i < SS(fs); i += SZDIRE) { + if (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break; /* 81 entry with cluster #2? */ + } + if (i == SS(fs)) return FR_NO_FILESYSTEM; +#if !FF_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif /* FF_FS_EXFAT */ + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = 0; + if (nclst <= MAX_FAT32) fmt = FS_FAT32; + if (nclst <= MAX_FAT16) fmt = FS_FAT16; + if (nclst <= MAX_FAT12) fmt = FS_FAT12; + if (fmt == 0) return FR_NO_FILESYSTEM; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !FF_FS_READONLY + /* Get FSInfo if available */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ + fs->fsi_flag = 0x80; +#if (FF_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Allow to update FSInfo only if BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSInfo data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (FF_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (FF_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif /* (FF_FS_NOFSINFO & 3) != 3 */ +#endif /* !FF_FS_READONLY */ + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* Volume mount ID */ +#if FF_USE_LFN == 1 + fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ +#if FF_FS_EXFAT + fs->dirbuf = DirBuf; /* Static directory block scratchpad buuffer */ +#endif +#endif +#if FF_FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if FF_FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + FFOBJID* obj, /* Pointer to the FFOBJID, the 1st member in the FIL/DIR object, to check validity */ + FATFS** rfs /* Pointer to pointer to the owner filesystem object to return */ +) +{ + FRESULT res = FR_INVALID_OBJECT; + + + if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { /* Test if the object is valid */ +#if FF_FS_REENTRANT + if (lock_fs(obj->fs)) { /* Obtain the filesystem object */ + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } else { + unlock_fs(obj->fs, FR_OK); + } + } else { + res = FR_TIMEOUT; + } +#else + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } +#endif + } + *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + /* Get logical drive number */ + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if FF_FS_LOCK != 0 + clear_lock(cfs); +#endif +#if FF_FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if FF_FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (opt == 0) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !FF_FS_READONLY + DWORD dw, cl, bcs, clst, sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + + if (!fp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + mode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ +#if !FF_FS_READONLY /* Read/Write configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if FF_FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Check if the file can be used */ + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) { /* There is no file to open, create a new entry */ +#if FF_FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + } + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object with the same name is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + init_alloc_info(fs, &fp->obj); + /* Set directory entry block initial state */ + mem_set(fs->dirbuf + 2, 0, 30); /* Clear 85 entry except for NumSec */ + mem_set(fs->dirbuf + 38, 0, 26); /* Clear C0 entry except for NumName and NameHash */ + fs->dirbuf[XDIR_Attr] = AM_ARC; + st_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME()); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust != 0) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Set directory entry initial state */ + cl = ld_clust(fs, dj.dir); /* Get current cluster chain */ + st_dword(dj.dir + DIR_CrtTime, GET_FATTIME()); /* Set created time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + if (cl != 0) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Is the object exsiting? */ + if (dj.obj.attr & AM_DIR) { /* File open against a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED; /* Set file change flag if created or overwritten */ + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if FF_FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Lock the file for this session */ + if (fp->obj.lockid == 0) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* Is it a directory? */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.c_scl = dj.obj.sclust; /* Get containing directory info */ + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + init_alloc_info(fs, &fp->obj); + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get object allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if FF_USE_FASTSEEK + fp->cltbl = 0; /* Disable fast seek mode */ +#endif + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + fp->flag = mode; /* Set file access mode */ + fp->err = 0; /* Clear error flag */ + fp->sect = 0; /* Invalidate current data sector */ + fp->fptr = 0; /* Set file pointer top of the file */ +#if !FF_FS_READONLY +#if !FF_FS_TINY + mem_set(fp->buf, 0, FF_MAX_SS); /* Clear sector buffer */ +#endif + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ + fp->fptr = fp->obj.objsize; /* Offset to seek */ + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ + clst = fp->obj.sclust; /* Follow the cluster chain */ + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) res = FR_INT_ERR; + if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; + } + fp->clust = clst; + if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ + if ((sc = clst2sect(fs, clst)) == 0) { + res = FR_INT_ERR; + } else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +#if !FF_FS_TINY + if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; +#endif + } + } + } +#endif + } + + FREE_NAMBUF(); + } + + if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data read */ + btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if FF_FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !FF_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btr) rcnt = btr; /* Clip it by btr if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#else + mem_cpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */ + if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if FF_FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Write-back sector cache */ +#else + if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if FF_FS_MINIMIZE <= 2 +#if FF_FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if FF_FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling on the growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect && /* Fill sector cache with file data */ + fp->fptr < fp->obj.objsize && + disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fs->wflag = 1; +#else + mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fp->flag |= FA_DIRTY; +#endif + } + + fp->flag |= FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { + if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ +#if !FF_FS_TINY + if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_first_frag(&fp->obj); /* Fill first fragment on the FAT if needed */ + if (res == FR_OK) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } + if (res == FR_OK) { + DIR dj; + DEF_NAMBUF + + INIT_NAMBUF(fs); + res = load_obj_xdir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation information */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation information */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_ModTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !FF_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(&fp->obj, &fs); /* Lock volume */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) fp->obj.fs = 0; /* Invalidate file object */ +#else + fp->obj.fs = 0; /* Invalidate file object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +#if FF_FS_RPATH >= 1 +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +#if FF_VOLUMES >= 2 +FRESULT f_chdrive ( + const TCHAR* path /* Drive number */ +) +{ + int vol; + + + /* Get logical drive number */ + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + + CurrVol = (BYTE)vol; /* Set it as current volume */ + + return FR_OK; +} +#endif + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { + fs->cdir = dj.obj.sclust; /* It is the start directory itself */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(fs, res); +} + + +#if FF_FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMBUF + + + *buff = 0; + /* Get logical drive */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + i = len; /* Bottom of buffer (directory stack base) */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = dir_read_file(&dj); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; + buff[--i] = '/'; + } + } + tp = buff; + if (res == FR_OK) { +#if FF_VOLUMES >= 2 + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; +#endif + if (i == len) { /* Root-directory */ + *tp++ = '/'; + } else { /* Sub-directroy */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_FS_RPATH >= 2 */ +#endif /* FF_FS_RPATH >= 1 */ + + + +#if FF_FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File Read/Write Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if FF_USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) res = (FRESULT)fp->err; +#if FF_FS_EXFAT && !FF_FS_READONLY + if (res == FR_OK && fs->fs_type == FS_EXFAT) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } +#endif + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->obj.sclust; /* Origin of the chain */ + if (cl != 0) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->obj.objsize) ofs = fp->obj.objsize; /* Clip offset at the file size */ + fp->fptr = ofs; /* Set file pointer */ + if (ofs > 0) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clst2sect(fs, fp->clust); + if (dsc == 0) ABORT(fs, FR_INT_ERR); + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Load current sector */ +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF; /* Clip at 4 GiB - 1 if at FATxx */ +#endif + if (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) { /* In read-only mode, clip offset with the file size */ + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs > 0) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !FF_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ + ofs -= bcs; fp->fptr += bcs; +#if !FF_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + if (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) { /* No FAT chain object needs correct objsize to generate FAT value */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ + if (clst == 0) { /* Clip file size in case of disk full */ + ofs = 0; break; + } + } else +#endif + { + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + } + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clst2sect(fs, clst); /* Current sector */ + if (nsect == 0) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ +#endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + + + +#if FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dp->obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (dp->obj.attr & AM_DIR) { /* This object is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + dp->obj.c_scl = dp->obj.sclust; /* Get containing directory inforamation */ + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Get object allocation info */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, dp->dir); /* Get object allocation info */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dp->obj.id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + if (dp->obj.sclust != 0) { + dp->obj.lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + dp->obj.lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(&dp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + if (dp->obj.lockid) res = dec_lock(dp->obj.lockid); /* Decrement sub-directory open counter */ + if (res == FR_OK) dp->obj.fs = 0; /* Invalidate directory object */ +#else + dp->obj.fs = 0; /* Invalidate directory object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + res = validate(&dp->obj, &fs); /* Check validity of the directory object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(fs); + res = dir_read_file(dp); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if FF_USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if FF_USE_LFN && FF_USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* FF_USE_FIND */ + + + +#if FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding filesystem object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + FFOBJID obj; + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full FAT scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Scan FAT to obtain number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Scan bit field FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan allocation bitmap */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; /* Number of clusters */ + sect = fs->database; /* Assuming bitmap starts at cluster 2 */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of bits with zero in the bitmap */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } else +#endif + { /* FAT16/32: Scan WORD/DWORD FAT entries */ + clst = fs->n_fatent; /* Number of entries */ + sect = fs->fatbase; /* Top of the FAT */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of entries with zero in the FAT */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(fs->win + i) == 0) nfree++; + i += 2; + } else { + if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++; + i += 4; + } + i %= SS(fs); + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FAT32: FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->fptr < fp->obj.objsize) { /* Process when fptr is not on the eof */ + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current read/write point */ + fp->flag |= FA_MODIFIED; +#if !FF_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if FF_FS_EXFAT + FFOBJID obj; +#endif + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if FF_FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + init_alloc_info(fs, &obj); + dclst = obj.sclust; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory? */ +#if FF_FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = dir_read_file(&sdj); /* Test if the directory is empty */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst != 0) { /* Remove the cluster chain if exist */ +#if FF_FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE *dir; + DWORD dcl, pcl, tm; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(&dj.obj, 0); /* Allocate a cluster for the new directory table */ + dj.obj.objsize = (DWORD)fs->csize * SS(fs); + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) res = sync_window(fs); /* Flush FAT */ + tm = GET_FATTIME(); + if (res == FR_OK) { /* Initialize the new directory table */ + res = dir_clear(fs, dcl); /* Clean up the new table */ + if (res == FR_OK && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT)) { /* Create dot entries (FAT only) */ + dir = fs->win; + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + st_dword(dir + DIR_ModTime, tm); + st_clust(fs, dir, dcl); + mem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create ".." entry */ + dir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + st_clust(fs, dir + SZDIRE, pcl); + fs->wflag = 1; + } + } + if (res == FR_OK) { + res = dir_register(&dj); /* Register the object to the directoy */ + } + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Created time */ + st_dword(fs->dirbuf + XDIR_FstClus, dcl); /* Table start cluster */ + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)dj.obj.objsize); /* File size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + dir = dj.dir; + st_dword(dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dir, dcl); /* Table start cluster */ + dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } else { + remove_chain(&dj.obj, dcl, 0); /* Could not register, remove cluster chain */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir; + DWORD dw; + DEF_NAMBUF + + + get_ldnumber(&path_new); /* Snip the drive number of new name off */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + res = chk_lock(&djo, 2); + } +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT volume */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); /* Restore 85+C0 entry */ + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); + if (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ +/* Start of critical section where an interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT/FAT32 volume */ + mem_cpy(buf, djo.dir, SZDIRE); /* Save directory entry of the object */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy directory entry of the object except name */ + mem_cpy(dir + 13, buf + 13, SZDIRE - 13); + dir[DIR_Attr] = buf[DIR_Attr]; + if (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clst2sect(fs, ld_clust(fs, dir)); + if (dw == 0) { + res = FR_INT_ERR; + } else { +/* Start of critical section where an interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of the critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_MINIMIZE == 0 */ +#endif /* FF_FS_MINIMIZE <= 1 */ +#endif /* FF_FS_MINIMIZE <= 2 */ + + + +#if FF_USE_CHMOD && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_CHMOD && !FF_FS_READONLY */ + + + +#if FF_USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Logical drive number */ + TCHAR* label, /* Buffer to store the volume label */ + DWORD* vsn /* Variable to store the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; + WCHAR wc; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read_label(&dj); /* Find a volume label entry */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + WCHAR hs; + + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + wc = ld_word(dj.dir + XDIR_Label + si * 2); + if (hs == 0 && IsSurrogate(wc)) { /* Is the code a surrogate? */ + hs = wc; continue; + } + wc = put_utf((DWORD)hs << 16 | wc, &label[di], 4); + if (wc == 0) { di = 0; break; } + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry */ + while (si < 11) { + wc = dj.dir[si++]; +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++]; /* Is it a DBC? */ + wc = ff_oem2uni(wc, CODEPAGE); + if (wc != 0) wc = put_utf(wc, &label[di], 4); + if (wc == 0) { di = 0; break; } + di += wc; +#else /* ANSI/OEM output */ + label[di++] = (TCHAR)wc; +#endif + } + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: + di = BPB_VolIDEx; break; + + case FS_FAT32: + di = BS_VolID32; break; + + default: + di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Volume label to set with heading logical drive number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT di; + WCHAR wc; + static const char badchr[] = "+.,;=[]\"*:<>\?|\x7F"; /* [0..] for FAT, [7..] for exFAT */ +#if FF_USE_LFN + DWORD dc; +#endif + + /* Get logical drive */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + mem_set(dirvn, 0, 22); + di = 0; + while (*label) { /* Create volume label in directory form */ + dc = tchar2uni(&label); /* Get a Unicode character */ + if (dc >= 0x10000) { + if (dc == 0xFFFFFFFF || di >= 10) { /* Wrong surrogate or buffer overflow */ + dc = 0; + } else { + st_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++; + } + } + if (dc == 0 || chk_chr(badchr + 7, (int)dc) || di >= 11) { /* Check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + di * 2, (WCHAR)dc); di++; + } + } else +#endif + { /* On the FAT/FAT32 volume */ + mem_set(dirvn, ' ', 11); + di = 0; + while (*label) { /* Create volume label in directory form */ +#if FF_USE_LFN + dc = tchar2uni(&label); + wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; +#else /* ANSI/OEM input */ + wc = (BYTE)*label++; + if (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0; + if (IsLower(wc)) wc -= 0x20; /* To upper ASCII characters */ +#if FF_CODE_PAGE == 0 + if (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#elif FF_CODE_PAGE < 900 + if (wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#endif +#endif + if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8); + dirvn[di++] = (BYTE)wc; + } + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + while (di && dirvn[di - 1] == ' ') di--; /* Snip trailing spaces */ + } + + /* Set volume label */ + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read_label(&dj); /* Get volume label entry */ + if (res == FR_OK) { + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = (BYTE)di; /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + if (di != 0) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry or an error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (di != 0) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clean the entry */ + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = 0x83; /* Create 83 entry */ + dj.dir[XDIR_NumLabel] = (BYTE)di; + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LABEL */ + + + +#if FF_USE_EXPAND && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + n = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + lclst = scl + tcl - 1; + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (n == 1) { res = FR_INT_ERR; break; } + if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (n == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block is found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* No contiguous cluster? */ + } + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + for (clst = scl, n = tcl; n; clst++, n--) { /* Create a cluster chain on the FAT */ + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) break; + lclst = clst; + } + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + fs->last_clst = lclst; /* Set suggested start cluster to start next */ + if (opt) { /* Is it allocated now? */ + fp->obj.sclust = scl; /* Update object allocation information */ + fp->obj.objsize = fsz; + if (FF_FS_EXFAT) fp->obj.stat = 2; /* Set status 'contiguous chain' */ + fp->flag |= FA_MODIFIED; + if (fs->free_clst <= fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_EXPAND && !FF_FS_READONLY */ + + + +#if FF_USE_FORWARD +/*-----------------------------------------------------------------------*/ +/* Forward Data to the Stream Directly */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE *dbuf; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->obj.objsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream goes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->obj.sclust : get_fat(&fp->obj, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clst2sect(fs, fp->clust); /* Get current data sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; +#if FF_FS_TINY + if (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window to the file data */ + dbuf = fs->win; +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + } + dbuf = fp->buf; +#endif + fp->sect = sect; + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btf) rcnt = btf; /* Clip it by btr if needed */ + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); /* Forward the file data */ + if (rcnt == 0) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* FF_USE_FORWARD */ + + + +#if FF_USE_MKFS && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create an FAT/exFAT volume */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE opt, /* Format option */ + DWORD au, /* Size of allocation unit (cluster) [byte] */ + void* work, /* Pointer to working buffer (null: use heap memory) */ + UINT len /* Size of working buffer [byte] */ +) +{ + const UINT n_fats = 1; /* Number of FATs for FAT/FAT32 volume (1 or 2) */ + const UINT n_rootdir = 512; /* Number of root directory entries for FAT volume */ + static const WORD cst[] = {1, 4, 16, 64, 256, 512, 0}; /* Cluster size boundary for FAT volume (4Ks unit) */ + static const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0}; /* Cluster size boundary for FAT32 volume (128Ks unit) */ + BYTE fmt, sys, *buf, *pte, pdrv, part; + WORD ss; /* Sector size */ + DWORD szb_buf, sz_buf, sz_blk, n_clst, pau, sect, nsect, n; + DWORD b_vol, b_fat, b_data; /* Base LBA for volume, fat, data */ + DWORD sz_vol, sz_rsv, sz_fat, sz_dir; /* Size for volume, fat, dir, data */ + UINT i; + int vol; + DSTATUS stat; +#if FF_USE_TRIM || FF_FS_EXFAT + DWORD tbl[3]; +#endif + + + /* Check mounted drive and clear work area */ + vol = get_ldnumber(&path); /* Get target logical drive */ + if (vol < 0) return FR_INVALID_DRIVE; + if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the volume if mounted */ + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:create as new, 1-4:get from partition table) */ + + /* Check physical drive status */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK || !sz_blk || sz_blk > 32768 || (sz_blk & (sz_blk - 1))) sz_blk = 1; /* Erase block to align data area */ +#if FF_MAX_SS != FF_MIN_SS /* Get sector size of the medium if variable sector size cfg. */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = FF_MAX_SS; +#endif + if ((au != 0 && au < ss) || au > 0x1000000 || (au & (au - 1))) return FR_INVALID_PARAMETER; /* Check if au is valid */ + au /= ss; /* Cluster size in unit of sector */ + + /* Get working buffer */ +#if FF_USE_LFN == 3 + if (!work) { /* Use heap memory for working buffer */ + for (szb_buf = MAX_MALLOC, buf = 0; szb_buf >= ss && !(buf = ff_memalloc(szb_buf)); szb_buf /= 2) ; + sz_buf = szb_buf / ss; /* Size of working buffer (sector) */ + } else +#endif + { + buf = (BYTE*)work; /* Working buffer */ + sz_buf = len / ss; /* Size of working buffer (sector) */ + szb_buf = sz_buf * ss; /* Size of working buffer (byte) */ + } + if (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE; + + /* Determine where the volume to be located (b_vol, sz_vol) */ + if (FF_MULTI_PARTITION && part != 0) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */ + if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */ + pte = buf + (MBR_Table + (part - 1) * SZ_PTE); + if (pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* No partition? */ + b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ + sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + b_vol = (opt & FM_SFD) ? 0 : 63; /* Volume start sector */ + if (sz_vol < b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); + sz_vol -= b_vol; /* Volume size */ + } + if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ + + /* Pre-determine the FAT type */ + do { + if (FF_FS_EXFAT && (opt & FM_EXFAT)) { /* exFAT possible? */ + if ((opt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || au > 128) { /* exFAT only, vol >= 64Ms or au > 128s ? */ + fmt = FS_EXFAT; break; + } + } + if (au > 128) LEAVE_MKFS(FR_INVALID_PARAMETER); /* Too large au for FAT/FAT32 */ + if (opt & FM_FAT32) { /* FAT32 possible? */ + if ((opt & FM_ANY) == FM_FAT32 || !(opt & FM_FAT)) { /* FAT32 only or no-FAT? */ + fmt = FS_FAT32; break; + } + } + if (!(opt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ + fmt = FS_FAT16; + } while (0); + +#if FF_FS_EXFAT + if (fmt == FS_EXFAT) { /* Create an exFAT volume */ + DWORD szb_bit, szb_case, sum, nb, cl; + WCHAR ch, si; + UINT j, st; + BYTE b; + + if (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area may be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Determine FAT location, data location and number of clusters */ + if (au == 0) { /* au auto-selection */ + au = 8; + if (sz_vol >= 0x80000) au = 64; /* >= 512Ks */ + if (sz_vol >= 0x4000000) au = 256; /* >= 64Ms */ + } + b_fat = b_vol + 32; /* FAT start at offset 32 */ + sz_fat = ((sz_vol / au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + b_data = (b_fat + sz_fat + sz_blk - 1) & ~(sz_blk - 1); /* Align data area to the erase block boundary */ + if (b_data >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ + n_clst = (sz_vol - (b_data - b_vol)) / au; /* Number of clusters */ + if (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too few clusters? */ + if (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters? */ + + szb_bit = (n_clst + 7) / 8; /* Size of allocation bitmap */ + tbl[0] = (szb_bit + au * ss - 1) / (au * ss); /* Number of allocation bitmap clusters */ + + /* Create a compressed up-case table */ + sect = b_data + au * tbl[0]; /* Table start sector */ + sum = 0; /* Table checksum to be stored in the 82 entry */ + st = si = i = j = szb_case = 0; + do { + switch (st) { + case 0: + ch = (WCHAR)ff_wtoupper(si); /* Get an up-case char */ + if (ch != si) { + si++; break; /* Store the up-case char if exist */ + } + for (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ; /* Get run length of no-case block */ + if (j >= 128) { + ch = 0xFFFF; st = 2; break; /* Compress the no-case block if run is >= 128 */ + } + st = 1; /* Do not compress short run */ + /* go to next case */ + case 1: + ch = si++; /* Fill the short run */ + if (--j == 0) st = 0; + break; + + default: + ch = (WCHAR)j; si += j; /* Number of chars to skip */ + st = 0; + } + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); /* Put it into the write buffer */ + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; szb_case += 2; + if (si == 0 || i == szb_buf) { /* Write buffered data when buffer full or end of process */ + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; i = 0; + } + } while (si); + tbl[1] = (szb_case + au * ss - 1) / (au * ss); /* Number of up-case table clusters */ + tbl[2] = 1; /* Number of root dir clusters */ + + /* Initialize the allocation bitmap */ + sect = b_data; nsect = (szb_bit + ss - 1) / ss; /* Start of bitmap and number of sectors */ + nb = tbl[0] + tbl[1] + tbl[2]; /* Number of clusters in-use by system */ + do { + mem_set(buf, 0, szb_buf); + for (i = 0; nb >= 8 && i < szb_buf; buf[i++] = 0xFF, nb -= 8) ; + for (b = 1; nb != 0 && i < szb_buf; buf[i] |= b, b <<= 1, nb--) ; + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the FAT */ + sect = b_fat; nsect = sz_fat; /* Start of FAT and number of FAT sectors */ + j = nb = cl = 0; + do { + mem_set(buf, 0, szb_buf); i = 0; /* Clear work area and reset write index */ + if (cl == 0) { /* Set entry 0 and 1 */ + st_dword(buf + i, 0xFFFFFFF8); i += 4; cl++; + st_dword(buf + i, 0xFFFFFFFF); i += 4; cl++; + } + do { /* Create chains of bitmap, up-case and root dir */ + while (nb != 0 && i < szb_buf) { /* Create a chain */ + st_dword(buf + i, (nb > 1) ? cl + 1 : 0xFFFFFFFF); + i += 4; cl++; nb--; + } + if (nb == 0 && j < 3) nb = tbl[j++]; /* Next chain */ + } while (nb != 0 && i < szb_buf); + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the root directory */ + mem_set(buf, 0, szb_buf); + buf[SZDIRE * 0 + 0] = 0x83; /* 83 entry (volume label) */ + buf[SZDIRE * 1 + 0] = 0x81; /* 81 entry (allocation bitmap) */ + st_dword(buf + SZDIRE * 1 + 20, 2); + st_dword(buf + SZDIRE * 1 + 24, szb_bit); + buf[SZDIRE * 2 + 0] = 0x82; /* 82 entry (up-case table) */ + st_dword(buf + SZDIRE * 2 + 4, sum); + st_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]); + st_dword(buf + SZDIRE * 2 + 24, szb_case); + sect = b_data + au * (tbl[0] + tbl[1]); nsect = au; /* Start of the root directory and number of sectors */ + do { /* Fill root directory sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + + /* Create two set of the exFAT VBR blocks */ + sect = b_vol; + for (n = 0; n < 2; n++) { + /* Main record (+0) */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11); /* Boot jump code (x86), OEM name */ + st_dword(buf + BPB_VolOfsEx, b_vol); /* Volume offset in the physical drive [sector] */ + st_dword(buf + BPB_TotSecEx, sz_vol); /* Volume size [sector] */ + st_dword(buf + BPB_FatOfsEx, b_fat - b_vol); /* FAT offset [sector] */ + st_dword(buf + BPB_FatSzEx, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */ + st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ + st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */ + st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */ + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ + for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ + buf[BPB_NumFATsEx] = 1; /* Number of FATs */ + buf[BPB_DrvNumEx] = 0x80; /* Drive number (for int13) */ + st_word(buf + BS_BootCodeEx, 0xFEEB); /* Boot code (x86) */ + st_word(buf + BS_55AA, 0xAA55); /* Signature (placed here regardless of sector size) */ + for (i = sum = 0; i < ss; i++) { /* VBR checksum */ + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + /* Extended bootstrap record (+1..+8) */ + mem_set(buf, 0, ss); + st_word(buf + ss - 2, 0xAA55); /* Signature (placed at end of sector) */ + for (j = 1; j < 9; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* OEM/Reserved record (+9..+10) */ + mem_set(buf, 0, ss); + for ( ; j < 11; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* Sum record (+11) */ + for (i = 0; i < ss; i += 4) st_dword(buf + i, sum); /* Fill with checksum value */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + + } else +#endif /* FF_FS_EXFAT */ + { /* Create an FAT/FAT32 volume */ + do { + pau = au; + /* Pre-determine number of clusters and FAT sub-type */ + if (fmt == FS_FAT32) { /* FAT32 volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x20000; /* Volume size in unit of 128KS */ + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; /* Number of clusters */ + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 32; /* Number of reserved sectors */ + sz_dir = 0; /* No static directory */ + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); + } else { /* FAT volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x1000; /* Volume size in unit of 4KS */ + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; + if (n_clst > MAX_FAT12) { + n = n_clst * 2 + 4; /* FAT size [byte] */ + } else { + fmt = FS_FAT12; + n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ + } + sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 1; /* Number of reserved sectors */ + sz_dir = (DWORD)n_rootdir * SZDIRE / ss; /* Rootdir size [sector] */ + } + b_fat = b_vol + sz_rsv; /* FAT base */ + b_data = b_fat + sz_fat * n_fats + sz_dir; /* Data base */ + + /* Align data base to erase block boundary (for flash memory media) */ + n = ((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data; /* Next nearest erase block from current data base */ + if (fmt == FS_FAT32) { /* FAT32: Move FAT base */ + sz_rsv += n; b_fat += n; + } else { /* FAT: Expand FAT size */ + sz_fat += n / n_fats; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume */ + n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau; + if (fmt == FS_FAT32) { + if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32 */ + if (au == 0 && (au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT16) { + if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ + if (au == 0 && (pau * 2) <= 64) { + au = pau * 2; continue; /* Adjust cluster size and retry */ + } + if ((opt & FM_FAT32)) { + fmt = FS_FAT32; continue; /* Switch type to FAT32 and retry */ + } + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ + + /* Ok, it is the valid cluster configuration */ + break; + } while (1); + +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area can be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Create FAT VBR */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ + st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ + buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ + buf[BPB_NumFATs] = (BYTE)n_fats; /* Number of FATs */ + st_word(buf + BPB_RootEntCnt, (WORD)((fmt == FS_FAT32) ? 0 : n_rootdir)); /* Number of root directory entries */ + if (sz_vol < 0x10000) { + st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ + } else { + st_dword(buf + BPB_TotSec32, sz_vol); /* Volume size in 32-bit LBA */ + } + buf[BPB_Media] = 0xF8; /* Media descriptor byte */ + st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ + st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ + st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */ + if (fmt == FS_FAT32) { + st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */ + st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ + st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ + st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */ + buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ + buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ + + /* Create FSINFO record if needed */ + if (fmt == FS_FAT32) { + disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ + mem_set(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(buf + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(buf + BS_55AA, 0xAA55); + disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ + disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ + } + + /* Initialize FAT area */ + mem_set(buf, 0, (UINT)szb_buf); + sect = b_fat; /* FAT start sector */ + for (i = 0; i < n_fats; i++) { /* Initialize FATs each */ + if (fmt == FS_FAT32) { + st_dword(buf + 0, 0xFFFFFFF8); /* Entry 0 */ + st_dword(buf + 4, 0xFFFFFFFF); /* Entry 1 */ + st_dword(buf + 8, 0x0FFFFFFF); /* Entry 2 (root directory) */ + } else { + st_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* Entry 0 and 1 */ + } + nsect = sz_fat; /* Number of FAT sectors */ + do { /* Fill FAT sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + } + + /* Initialize root directory (fill with zero) */ + nsect = (fmt == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + } + + /* Determine system ID in the partition table */ + if (FF_FS_EXFAT && fmt == FS_EXFAT) { + sys = 0x07; /* HPFS/NTFS/exFAT */ + } else { + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (sz_vol >= 0x10000) { + sys = 0x06; /* FAT12/16 (large) */ + } else { + sys = (fmt == FS_FAT16) ? 0x04 : 0x01; /* FAT16 : FAT12 */ + } + } + } + + /* Update partition information */ + if (FF_MULTI_PARTITION && part != 0) { /* Created in the existing partition */ + /* Update system ID in the partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */ + buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it back to the MBR */ + } else { /* Created as a new single partition */ + if (!(opt & FM_SFD)) { /* Create partition table if in FDISK format */ + mem_set(buf, 0, ss); + st_word(buf + BS_55AA, 0xAA55); /* MBR signature */ + pte = buf + MBR_Table; /* Create partition table for single partition in the drive */ + pte[PTE_Boot] = 0; /* Boot indicator */ + pte[PTE_StHead] = 1; /* Start head */ + pte[PTE_StSec] = 1; /* Start sector */ + pte[PTE_StCyl] = 0; /* Start cylinder */ + pte[PTE_System] = sys; /* System type */ + n = (b_vol + sz_vol) / (63 * 255); /* (End CHS may be invalid) */ + pte[PTE_EdHead] = 254; /* End head */ + pte[PTE_EdSec] = (BYTE)(((n >> 2) & 0xC0) | 63); /* End sector */ + pte[PTE_EdCyl] = (BYTE)n; /* End cylinder */ + st_dword(pte + PTE_StLba, b_vol); /* Start offset in LBA */ + st_dword(pte + PTE_SizLba, sz_vol); /* Size in sectors */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the MBR */ + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + + LEAVE_MKFS(FR_OK); +} + + + +#if FF_MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create Partition Table on the Physical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD* szt, /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer (null: use heap memory) */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf; = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + FRESULT res; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + buf = (BYTE*)work; +#if FF_USE_LFN == 3 + if (!buf) buf = ff_memalloc(FF_MAX_SS); /* Use heap memory for working buffer */ +#endif + if (!buf) return FR_NOT_ENOUGH_CORE; + + /* Determine the CHS without any consideration of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = n - 1; + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, FF_MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; /* Number of cylinders */ + if (p_cyl == 0) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; /* End cylinder */ + if (e_cyl >= tot_cyl) LEAVE_MKFS(FR_INVALID_PARAMETER); + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)(((b_cyl >> 2) & 0xC0) | 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x07; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)(((e_cyl >> 2) & 0xC0) | 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Number of sectors */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); /* MBR signature (always at offset 510) */ + + /* Write it to the MBR */ + res = (disk_write(pdrv, buf, 0, 1) == RES_OK && disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; + LEAVE_MKFS(res); +} + +#endif /* FF_MULTI_PARTITION */ +#endif /* FF_USE_MKFS && !FF_FS_READONLY */ + + + + +#if FF_USE_STRFUNC +#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3) +#error Wrong FF_STRF_ENCODE setting +#endif +/*-----------------------------------------------------------------------*/ +/* Get a String from the File */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (items) */ + FIL* fp /* Pointer to the file object */ +) +{ + int nc = 0; + TCHAR *p = buff; + BYTE s[2]; + UINT rc; + WCHAR wc; +#if FF_USE_LFN && ((FF_LFN_UNICODE == 1 && FF_STRF_ENCODE == 3) || (FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3)) + DWORD dc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE == 1 && FF_STRF_ENCODE == 3 + UINT ct; +#endif + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* UTF-16 output */ +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + while (nc < len - 1) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (dbc_1st((BYTE)wc)) { + f_read(fp, s, 1, &rc); + if (rc != 1 || !dbc_2nd(s[0])) continue; + wc = wc << 8 | s[0]; + } + wc = ff_oem2uni(wc, CODEPAGE); + if (wc == 0) continue; +#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 /* Read a character in UTF-16LE/BE */ + while (nc < len - 1) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; +#elif FF_STRF_ENCODE == 3 /* Read a character in UTF-8 */ + while (nc < len - 2) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (dc >= 0x80) { + ct = 0; + if ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; } + if ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; } + if ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; } + if (ct == 0) continue; + do { + f_read(fp, s, 1, &rc); + if (rc != 1 || (s[0] & 0xC0) != 0x80) break; + dc = dc << 6 | (s[0] & 0x3F); + } while (--ct); + if (ct || dc < 0x80 || dc >= 0x110000) continue; + } + if (dc >= 0x10000) { + wc = (WCHAR)(0xD800 | ((dc >> 10) - 0x40)); + *p++ = wc; nc++; + wc = (WCHAR)(0xDC00 | (dc & 0x3FF)); + } else { + wc = (WCHAR)dc; + } +#endif + /* Output it in UTF-16 encoding */ + if (FF_USE_STRFUNC == 2 && wc == '\r') continue; + *p++ = wc; nc++; + if (wc == '\n') break; + } + +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3 /* UTF-8 output */ + while (nc < len - 4) { +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (dbc_1st((BYTE)wc)) { + f_read(fp, s, 1, &rc); + if (rc != 1 || !dbc_2nd(s[0])) continue; + wc = wc << 8 | s[0]; + } + dc = ff_oem2uni(wc, CODEPAGE); + if (dc == 0) continue; +#else /* Read a character in UTF-16LE/BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + dc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; + if (IsSurrogate(dc)) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? s[1] << 8 | s[0] : s[0] << 8 | s[1]; + if (!IsSurrogateH(dc) || !IsSurrogateL(wc)) continue; + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); + } +#endif + /* Output it in UTF-8 encoding */ + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; + if (dc < 0x80) { /* 1-byte */ + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') break; + } else { + if (dc < 0x800) { /* 2-byte */ + *p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 2; + } else { + if (dc < 0x10000) { /* 3-byte */ + *p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 3; + } else { /* 4-byte */ + *p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07)); + *p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 4; + } + } + } + } + +#else /* Byte-by-byte without any conversion (ANSI/OEM API or UTF-8 to UTF-8) */ + while (nc < len - 1) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (FF_USE_STRFUNC == 2 && wc == '\r') continue; + *p++ = (TCHAR)wc; nc++; + if (wc == '\n') break; + } +#endif + + *p = 0; + return nc ? buff : 0; /* When no data read (EOF or error), return with error. */ +} + + + + +#if !FF_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a Character to the File */ +/*-----------------------------------------------------------------------*/ + +typedef struct { /* Putchar output buffer and work area */ + FIL *fp; /* Ptr to the writing file */ + int idx, nchr; /* Write index of buf[] (-1:error), number of encoding units written */ +#if FF_USE_LFN && FF_LFN_UNICODE == 1 + WCHAR hs; +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 + BYTE bs[4]; + UINT wi, ct; +#endif + BYTE buf[64]; /* Write buffer */ +} putbuff; + + +static +void putc_bfd ( /* Buffered write with code conversion */ + putbuff* pb, + TCHAR c +) +{ + UINT n; + int i, nc; +#if FF_USE_LFN && (FF_LFN_UNICODE == 1 || (FF_LFN_UNICODE == 2 && (FF_STRF_ENCODE != 3))) + WCHAR hs, wc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE == 2 && FF_STRF_ENCODE != 3 + DWORD dc; + TCHAR *tp; +#endif + + if (FF_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Write index of pb->buf[] */ + if (i < 0) return; + nc = pb->nchr; /* Write unit count */ + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* UTF-16 input */ + if (IsSurrogateH(c)) { + pb->hs = c; return; + } + wc = c; hs = pb->hs; pb->hs = 0; + if (hs != 0) { + if (!IsSurrogateL(wc)) hs = 0; + } else { + if (IsSurrogateL(wc)) return; + } +#if FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + if (hs != 0) { /* 4-byte */ + nc += 4; + hs = (hs & 0x3FF) + 0x40; + pb->buf[i++] = (BYTE)(0xF0 | hs >> 8); + pb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F)); + pb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F)); + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } else { + if (wc < 0x80) { /* 1-byte */ + nc++; + pb->buf[i++] = (BYTE)wc; + } else { + if (wc < 0x800) { /* 2-byte */ + nc += 2; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + } else { /* 3-byte */ + nc += 3; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } +#endif +#else /* UTF-8 input */ + for (;;) { + if (pb->ct == 0) { /* Out of multi-byte sequence? */ + pb->bs[pb->wi = 0] = (BYTE)c; /* Save 1st byte */ + if ((BYTE)c < 0x80) break; /* 1-byte? */ + if (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1; /* 2-byte? */ + if (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2; /* 3-byte? */ + if (((BYTE)c & 0xF1) == 0xF0) pb->ct = 3; /* 4-byte? */ + return; + } else { /* In the multi-byte sequence */ + if (((BYTE)c & 0xC0) != 0x80) { /* Broken sequence? */ + pb->ct = 0; continue; + } + pb->bs[++pb->wi] = (BYTE)c; /* Save the trailing byte */ + if (--pb->ct == 0) break; /* End of sequence? */ + return; + } + } +#if FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + pb->buf[i++] = pb->bs[0]; nc++; + if (pb->bs[0] >= 0xC0) { + pb->buf[i++] = pb->bs[1]; nc++; + } + if (pb->bs[0] >= 0xE0) { + pb->buf[i++] = pb->bs[2]; nc++; + } + if (pb->bs[0] >= 0xF0) { + pb->buf[i++] = pb->bs[3]; nc++; + } +#else /* Write it in UTF-16 or ANSI/OEM */ + tp = (TCHAR*)pb->bs; + dc = tchar2uni(&tp); /* UTF-8 ==> UTF-16 */ + if (dc == 0xFFFFFFFF) return; + wc = (WCHAR)dc; + hs = (WCHAR)(dc >> 16); +#endif +#endif +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 && FF_STRF_ENCODE != 3 +#if FF_STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + if (hs != 0) { + pb->buf[i++] = (BYTE)(hs >> 8); + pb->buf[i++] = (BYTE)hs; + nc++; + } + pb->buf[i++] = (BYTE)(wc >> 8); + pb->buf[i++] = (BYTE)wc; + nc++; +#elif FF_STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + if (hs != 0) { + pb->buf[i++] = (BYTE)hs; + pb->buf[i++] = (BYTE)(hs >> 8); + nc++; + } + pb->buf[i++] = (BYTE)wc; + pb->buf[i++] = (BYTE)(wc >> 8); + nc++; +#else /* Write a character in ANSI/OEM */ + if (hs != 0) return; + wc = ff_uni2oem(wc, CODEPAGE); /* UTF-16 ==> ANSI/OEM */ + if (wc == 0) return;; + if (wc >= 0x100) { + pb->buf[i++] = (BYTE)(wc >> 8); nc++; + } + pb->buf[i++] = (BYTE)wc; nc++; +#endif +#endif + +#else /* ANSI/OEM input */ + pb->buf[i++] = (BYTE)c; + nc++; +#endif + + if (i >= (int)(sizeof pb->buf) - 4) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &n); + i = (n == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr = nc; +} + + +static +int putc_flush ( /* Flush left characters in the buffer */ + putbuff* pb +) +{ + UINT nw; + + if ( pb->idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) return pb->nchr; + return EOF; +} + + +static +void putc_init ( /* Initialize write buffer */ + putbuff* pb, + FIL* fp +) +{ + mem_set(pb, 0, sizeof (putbuff)); + pb->fp = fp; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + putc_bfd(&pb, c); /* Put the character */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + while (*str) putc_bfd(&pb, *str++); /* Put the string */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a Formatted String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + putbuff pb; + BYTE f, r; + UINT i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + if (c == '*') { /* Minimum width by argument */ + w = va_arg(arp, int); + c = *fmt++; + } else { + while (IsDigit(c)) { /* Minimum width */ + w = w * 10 + c - '0'; + c = *fmt++; + } + } + if (c == 'l' || c == 'L') { /* Type prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (c == 0) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Atgument type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { /* Right padded */ + while (j++ < w) putc_bfd(&pb, ' ') ; + } + while (*p) putc_bfd(&pb, *p++) ; /* String body */ + while (j++ < w) putc_bfd(&pb, ' ') ; /* Left padded */ + continue; + + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + + case 'B' : /* Unsigned binary */ + r = 2; break; + + case 'O' : /* Unsigned octal */ + r = 8; break; + + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + + case 'X' : /* Unsigned hexdecimal */ + r = 16; break; + + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof *str); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, d); /* Right pad */ + } + do { + putc_bfd(&pb, str[--i]); /* Number body */ + } while (i); + while (j++ < w) putc_bfd(&pb, d); /* Left pad */ + } + + va_end(arp); + + return putc_flush(&pb); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_STRFUNC */ + + + +#if FF_CODE_PAGE == 0 +/*-----------------------------------------------------------------------*/ +/* Set Active Codepage for the Path Name */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setcp ( + WORD cp /* Value to be set as active code page */ +) +{ + static const WORD validcp[] = { 437, 720, 737, 771, 775, 850, 852, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 949, 950, 0}; + static const BYTE *const tables[] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0}; + UINT i; + + + for (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ; /* Find the code page */ + if (validcp[i] != cp) return FR_INVALID_PARAMETER; /* Not found? */ + + CodePage = cp; + if (cp >= 900) { /* DBCS */ + ExCvt = 0; + DbcTbl = tables[i]; + } else { /* SBCS */ + ExCvt = tables[i]; + DbcTbl = 0; + } + return FR_OK; +} +#endif /* FF_CODE_PAGE == 0 */ + diff --git a/ChaloupeLora.X/Source/FatFS/ff.h b/ChaloupeLora.X/Source/FatFS/ff.h new file mode 100644 index 0000000..da57ca8 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/ff.h @@ -0,0 +1,366 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem module R0.13a / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2017, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#ifndef FF_DEFINED +#define FF_DEFINED 89352 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if FF_DEFINED != FFCONF_DEF +#error Wrong configuration file (ffconf.h). +#endif + + + +/* Definitions of volume management */ + +#if FF_MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#endif + + + +/* Type of path name strings on FatFs API */ + +#ifndef _INC_TCHAR +#define _INC_TCHAR + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ +typedef char TCHAR; +#define _T(x) u8 ## x +#define _TEXT(x) u8 ## x +#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2) +#error Wrong FF_LFN_UNICODE setting +#else /* ANSI/OEM code in SBCS/DBCS */ +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* Type of file size variables */ + +#if FF_FS_EXFAT +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* Filesystem object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* Filesystem type (0:N/A) */ + BYTE pdrv; /* Physical drive number */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* Volume mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if FF_MAX_SS != FF_MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if FF_USE_LFN + WCHAR* lfnbuf; /* LFN working buffer */ +#endif +#if FF_FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ +#endif +#if FF_FS_REENTRANT + FF_SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !FF_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if FF_FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#if FF_FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + DWORD volbase; /* Volume base sector */ + DWORD fatbase; /* FAT base sector */ + DWORD dirbase; /* Root directory base sector/cluster */ + DWORD database; /* Data base sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Object ID and allocation information (FFOBJID) */ + +typedef struct { + FATFS* fs; /* Pointer to the hosting volume of this object */ + WORD id; /* Hosting volume mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:flagmented in this session, b2:sub-directory stretched) */ + DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if FF_FS_EXFAT + DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ + DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ +#endif +#if FF_FS_LOCK + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} FFOBJID; + + + +/* File object structure (FIL) */ + +typedef struct { + FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ + DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !FF_FS_READONLY + DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ +#endif +#if FF_USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ +#endif +#if !FF_FS_TINY + BYTE buf[FF_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FFOBJID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector (0:Read operation has terminated) */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ +#if FF_USE_LFN + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ +#endif +#if FF_USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if FF_USE_LFN + TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ + TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ +#else + TCHAR fname[12 + 1]; /* File name */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ +FRESULT f_truncate (FIL* fp); /* Truncate the file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ +FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ +FRESULT f_setcp (WORD cp); /* Set current code page */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) +#define f_rmdir(path) f_unlink(path) +#define f_unmount(path) f_mount(0, path, 0) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !FF_FS_READONLY && !FF_FS_NORTC +DWORD get_fattime (void); +#endif + +/* LFN support functions */ +#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ +WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ +WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ +DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ +#endif +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif + +/* Sync functions */ +#if FF_FS_REENTRANT +int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access mode and open method flags (3rd argument of f_open) */ +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA_OPEN_APPEND 0x30 + +/* Fast seek controls (2nd argument of f_lseek) */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + +/* Format options (2nd argument of f_mkfs) */ +#define FM_FAT 0x01 +#define FM_FAT32 0x02 +#define FM_EXFAT 0x04 +#define FM_ANY 0x07 +#define FM_SFD 0x08 + +/* Filesystem type (FATFS.fs_type) */ +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + +/* File attribute bits for directory entry (FILINFO.fattrib) */ +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ + + +#ifdef __cplusplus +} +#endif + +#endif /* FF_DEFINED */ diff --git a/ChaloupeLora.X/Source/FatFS/ffconf.h b/ChaloupeLora.X/Source/FatFS/ffconf.h new file mode 100644 index 0000000..643a286 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/ffconf.h @@ -0,0 +1,283 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - Configuration file +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 89352 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define FF_USE_STRFUNC 0 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define FF_USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define FF_USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 437 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + + +#define FF_USE_LFN 0 +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() in ffsystem.c, need to be added to the project. */ + + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + + +#define FF_STRF_ENCODE 3 +/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(), +/ f_putc(), f_puts and f_printf() convert the character encoding in it. +/ This option selects assumption of character encoding ON THE FILE to be +/ read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + + +#define FF_FS_RPATH 0 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define FF_VOLUMES 1 +/* Number of volumes (logical drives) to be used. (1-10) */ + + +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" +/* FF_STR_VOLUME_ID switches string support for volume ID. +/ When FF_STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to FF_VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + + +#define FF_FS_EXFAT 0 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ When enable exFAT, also LFN needs to be enabled. +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2017 +/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable +/ the timestamp function. All objects modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (FF_FS_READONLY = 1). */ + + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t HANDLE +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + +/* #include // O/S definitions */ + + + +/*--- End of configuration options ---*/ diff --git a/ChaloupeLora.X/Source/FatFS/ffsystem.c b/ChaloupeLora.X/Source/FatFS/ffsystem.c new file mode 100644 index 0000000..b0170a8 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/ffsystem.c @@ -0,0 +1,171 @@ +/*------------------------------------------------------------------------*/ +/* Sample Code of OS Dependent Functions for FatFs */ +/* (C)ChaN, 2017 */ +/*------------------------------------------------------------------------*/ + + +#include "ff.h" + + + +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ + +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block (null on not enough core) */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); /* Allocate a new memory block with POSIX API */ +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free (nothing to do for null) */ +) +{ + free(mblock); /* Free the memory block with POSIX API */ +} + +#endif + + + +#if FF_FS_REENTRANT /* Mutal exclusion */ + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to create a new +/ synchronization object for the volume, such as semaphore and mutex. +/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. +*/ + +//const osMutexDef_t Mutex[FF_VOLUMES]; /* CMSIS-RTOS */ + + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ + BYTE vol, /* Corresponding volume (logical drive number) */ + FF_SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + /* Win32 */ + *sobj = CreateMutex(NULL, FALSE, NULL); + return (int)(*sobj != INVALID_HANDLE_VALUE); + + /* uITRON */ +// T_CSEM csem = {TA_TPRI,1,1}; +// *sobj = acre_sem(&csem); +// return (int)(*sobj > 0); + + /* uC/OS-II */ +// OS_ERR err; +// *sobj = OSMutexCreate(0, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// *sobj = xSemaphoreCreateMutex(); +// return (int)(*sobj != NULL); + + /* CMSIS-RTOS */ +// *sobj = osMutexCreate(Mutex + vol); +// return (int)(*sobj != NULL); +} + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to delete a synchronization +/ object that created with ff_cre_syncobj() function. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */ + FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + /* Win32 */ + return (int)CloseHandle(sobj); + + /* uITRON */ +// return (int)(del_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// vSemaphoreDelete(sobj); +// return 1; + + /* CMSIS-RTOS */ +// return (int)(osMutexDelete(sobj) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a 0 is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ + FF_SYNC_t sobj /* Sync object to wait */ +) +{ + /* Win32 */ + return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0); + + /* uITRON */ +// return (int)(wai_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexPend(sobj, FF_FS_TIMEOUT, &err)); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE); + + /* CMSIS-RTOS */ +// return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + FF_SYNC_t sobj /* Sync object to be signaled */ +) +{ + /* Win32 */ + ReleaseMutex(sobj); + + /* uITRON */ +// sig_sem(sobj); + + /* uC/OS-II */ +// OSMutexPost(sobj); + + /* FreeRTOS */ +// xSemaphoreGive(sobj); + + /* CMSIS-RTOS */ +// osMutexRelease(sobj); +} + +#endif + diff --git a/ChaloupeLora.X/Source/FatFS/ffunicode.c b/ChaloupeLora.X/Source/FatFS/ffunicode.c new file mode 100644 index 0000000..901affe --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/ffunicode.c @@ -0,0 +1,15586 @@ +/*------------------------------------------------------------------------*/ +/* Unicode handling functions for FatFs R0.13a */ +/*------------------------------------------------------------------------*/ +/* This module will occupy a huge memory in the .const section when the / +/ FatFs is configured for LFN with DBCS. If the system has any Unicode / +/ utilitiy for the code conversion, this module should be modified to use / +/ that function to avoid silly memory consumption. / +/-------------------------------------------------------------------------*/ +/* +/ Copyright (C) 2017, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +*/ + + +#include "ff.h" + +#if FF_USE_LFN /* This module is blanked when non-LFN configuration */ + +#if FF_DEFINED != 89352 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + +#define MERGE2(a, b) a ## b +#define CVTBL(tbl, cp) MERGE2(tbl, cp) + + +/*------------------------------------------------------------------------*/ +/* Code Conversion Tables */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0 /* Japanese */ +static +const WCHAR uni2oem932[] = { /* Unicode --> Shift_JIS pairs */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +static +const WCHAR oem2uni932[] = { /* Shift_JIS --> Unicode pairs */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0 /* Simplified Chinese */ +static +const WCHAR uni2oem936[] = { /* Unicode --> GBK pairs */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static +const WCHAR oem2uni936[] = { /* GBK --> Unicode pairs */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0 /* Korean */ +static +const WCHAR uni2oem949[] = { /* Unicode --> Korean pairs */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static +const WCHAR oem2uni949[] = { /* Korean --> Unicode pairs */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0 /* Traditional Chinese */ +static +const WCHAR uni2oem950[] = { /* Unicode --> Big5 pairs */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static +const WCHAR oem2uni950[] = { /* Big5 --> Unicode pairs */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0 +static +const WCHAR uc437[] = { /* CP437(U.S.) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0 +static +const WCHAR uc720[] = { /* CP720(Arabic) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0 +static +const WCHAR uc737[] = { /* CP737(Greek) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0 +static +const WCHAR uc771[] = { /* CP771(KBL) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0 +static +const WCHAR uc775[] = { /* CP775(Baltic) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0 +static +const WCHAR uc850[] = { /* CP850(Latin 1) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0 +static +const WCHAR uc852[] = { /* CP852(Latin 2) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0 +static +const WCHAR uc855[] = { /* CP855(Cyrillic) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0 +static +const WCHAR uc857[] = { /* CP857(Turkish) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0 +static +const WCHAR uc860[] = { /* CP860(Portuguese) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0 +static +const WCHAR uc861[] = { /* CP861(Icelandic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0 +static +const WCHAR uc862[] = { /* CP862(Hebrew) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0 +static +const WCHAR uc863[] = { /* CP863(Canadian French) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0 +static +const WCHAR uc864[] = { /* CP864(Arabic) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; +#endif +#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0 +static +const WCHAR uc865[] = { /* CP865(Nordic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0 +static +const WCHAR uc866[] = { /* CP866(Russian) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0 +static +const WCHAR uc869[] = { /* CP869(Greek 2) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 +}; +#endif + + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* SBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it a valid code? */ + for (c = 0; c < 0x80 && uni != p[c]; c++) ; + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } + + return c; +} + +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* DBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE >= 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code? */ + uc = (WCHAR)uni; + p = CVTBL(uni2oem, FF_CODE_PAGE); + hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ + p = CVTBL(oem2uni, FF_CODE_PAGE); + hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for dynamic code page configuration */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 0 + +static const WORD cp_code[] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 0}; +static const WCHAR *const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0}; + + +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WCHAR)uni; + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + for (c = 0; c < 0x80 && uc != p[c]; c++) ; /* Find OEM code in the table */ + c = (c + 0x80) & 0xFF; + } + } else { /* DBCS */ + switch (cp) { + case 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break; + case 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break; + case 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break; + case 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break; + } + if (p) { /* Is it a valid code page? */ + li = 0; + for (n = 16; n; n--) { /* Find OEM code */ + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted (DBC if >=0x100) */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } else { /* DBCS */ + switch (cp) { + case 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break; + case 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break; + case 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break; + case 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break; + } + if (p) { + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* Unicode up-case conversion */ +/*------------------------------------------------------------------------*/ + +DWORD ff_wtoupper ( /* Returns up-converted code point */ + DWORD uni /* Unicode code point to be up-converted */ +) +{ + /* Compressed upper conversion table */ + static const WORD cvt1[] = { /* U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, 0x00F8,0x0307, 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, 0x0132,0x0106, 0x0139,0x0110, 0x014A,0x012E, 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, 0x01DD,0x0001,0x018E, 0x01DE,0x0112, 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, 0x01F8,0x0128, + 0x0222,0x0112, 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, 0x03C4,0x0308, 0x03CC,0x0003,0x038C,0x038E,0x038F, 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, 0x0450,0x0710, 0x0460,0x0122, 0x048A,0x0136, 0x04C1,0x010E, 0x04CF,0x0001,0x04C0, 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 + }; + static const WORD cvt2[] = { /* U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, 0x1F10,0x0606, 0x1F20,0x0608, 0x1F30,0x0608, 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, 0x1F90,0x0608, 0x1FA0,0x0608, 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, 0x1FD0,0x0602, 0x1FE0,0x0602, 0x1FE5,0x0001,0x1FEC, 0x1FF3,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 + }; + const WORD *p; + WORD uc, bc, nc, cmd; + + + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WORD)uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get block base */ + if (!bc || uc < bc) break; + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (uc < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: uc = p[uc - bc]; break; /* Table conversion */ + case 1: uc -= (uc - bc) & 1; break; /* Case pairs */ + case 2: uc -= 16; break; /* Shift -16 */ + case 3: uc -= 32; break; /* Shift -32 */ + case 4: uc -= 48; break; /* Shift -48 */ + case 5: uc -= 26; break; /* Shift -26 */ + case 6: uc += 8; break; /* Shift +8 */ + case 7: uc -= 80; break; /* Shift -80 */ + case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (!cmd) p += nc; + } + uni = uc; + } + + return uni; +} + + +#endif /* #if FF_USE_LFN */ diff --git a/ChaloupeLora.X/Source/FatFS/integer.h b/ChaloupeLora.X/Source/FatFS/integer.h new file mode 100644 index 0000000..4fcf5c4 --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/integer.h @@ -0,0 +1,38 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef FF_INTEGER +#define FF_INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include +#include +typedef unsigned __int64 QWORD; + + +#else /* Embedded platform */ + +/* These types MUST be 16-bit or 32-bit */ +typedef int INT; +typedef unsigned int UINT; + +/* This type MUST be 8-bit */ +typedef unsigned char BYTE; + +/* These types MUST be 16-bit */ +typedef short SHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types MUST be 32-bit */ +typedef long LONG; +typedef unsigned long DWORD; + +/* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */ +typedef unsigned long long QWORD; + +#endif + +#endif diff --git a/ChaloupeLora.X/Source/FatFS/mmc_drv.c b/ChaloupeLora.X/Source/FatFS/mmc_drv.c new file mode 100644 index 0000000..4e67eed --- /dev/null +++ b/ChaloupeLora.X/Source/FatFS/mmc_drv.c @@ -0,0 +1,660 @@ +/*------------------------------------------------------------------------/ +/ MMCv3/SDv1/SDv2+ (in SPI mode) control module +/-------------------------------------------------------------------------/ +/ +/ Copyright (C) 2014, ChaN, all right reserved. +/ +/ * This software is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-------------------------------------------------------------------------*/ + + +//#include +//#include +#include "DigitalIO.h" +#include "diskio.h" + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk); +static void set_fast_clk(void); +static void set_slow_clk(void); + + +/* Socket controls (Platform dependent) */ +#define CS_LOW() SD_SPI_CS_PIN = 0 /* MMC CS = L */ +#define CS_HIGH() SD_SPI_CS_PIN = 1 /* MMC CS = H */ +#define MMC_CD (true) /* Card detected (yes:true, no:false, default:true) */ +#define MMC_WP (false) /* Write protected (yes:true, no:false, default:false) */ + +/* SPI bit rate controls */ +#define FCLK_SLOW() set_slow_clk() /* Set slow clock for card initialization (100k-400k) */ +#define FCLK_FAST() set_fast_clk() /* Set fast clock for generic read/write */ + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +/* Definitions for MMC/SDC command */ +#define CMD0 (0) /* GO_IDLE_STATE */ +#define CMD1 (1) /* SEND_OP_COND */ +#define ACMD41 (41|0x80) /* SEND_OP_COND (SDC) */ +#define CMD8 (8) /* SEND_IF_COND */ +#define CMD9 (9) /* SEND_CSD */ +#define CMD10 (10) /* SEND_CID */ +#define CMD12 (12) /* STOP_TRANSMISSION */ +#define ACMD13 (13|0x80) /* SD_STATUS (SDC) */ +#define CMD16 (16) /* SET_BLOCKLEN */ +#define CMD17 (17) /* READ_SINGLE_BLOCK */ +#define CMD18 (18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (23) /* SET_BLOCK_COUNT */ +#define ACMD23 (23|0x80) /* SET_WR_BLK_ERASE_COUNT (SDC) */ +#define CMD24 (24) /* WRITE_BLOCK */ +#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (55) /* APP_CMD */ +#define CMD58 (58) /* READ_OCR */ + + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +UINT Timer1, Timer2; /* 1000Hz decrement timer */ + +static +UINT CardType; + + + +static inline __attribute__((always_inline)) unsigned char SPICalculateBRG(unsigned int pb_clk, unsigned int spi_clk) +{ + unsigned int brg; + + brg = pb_clk / (2 * spi_clk); + + if(pb_clk % (2 * spi_clk)) + brg++; + + if(brg > 0x100) + brg = 0x100; + + if(brg) + brg--; + + return (unsigned char) brg; +} + +/*-----------------------------------------------------------------------*/ +/* Interface Controls (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions. */ + +static void power_on (void) +{ + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 0; + SPI2CONbits.CKP = 1; + + FCLK_SLOW(); + + SPI2CONbits.ON = 1; + + return; +} + +static void power_off (void) +{ + SPI2CONbits.ON = 0; /* Disable SPI2 */ +} + +static void set_slow_clk(void) +{ + unsigned WasON = SPI2CONbits.ON; + + SPI2CONbits.ON = 0; + SPI2BRG = SPICalculateBRG(80000000,40000); + + SPI2CONbits.ON = WasON; +} + +static void set_fast_clk(void) +{ + unsigned WasON = SPI2CONbits.ON; + SPI2CONbits.ON = 0; + + SPI2BRG = SPICalculateBRG(80000000,20000000); + + SPI2CONbits.ON = WasON; +} + +/*-----------------------------------------------------------------------*/ +/* SPI Transactions (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +/* Single byte SPI transaction */ +static BYTE xchg_spi (BYTE dat) +{ + +#ifndef USE_PINGUINO + while( SPI2STATbits.SPITBF == 1 ) + { + } +#endif + // ---------------- + // sending data + // ---------------- + SPI2BUF = dat; + + while(SPI2STATbits.SPIRBF == 0) + { + } + + + return (BYTE)SPI2BUF; /* Get received byte */ +} + + +/* Multi-byte SPI transaction (transmit) */ +static +void xmit_spi_multi ( + const BYTE* buff, /* Data to be sent */ + UINT cnt /* Number of bytes to send */ +) +{ + do { + SPI2BUF = *buff++; /* Initiate an SPI transaction */ + while (SPI2STATbits.SPIRBF == 0) ; /* Wait for end of the SPI transaction */ + SPI2BUF; /* Discard received byte */ + SPI2BUF = *buff++; + while (SPI2STATbits.SPIRBF == 0) ; + SPI2BUF; + } while (cnt -= 2); +} + + +/* Multi-byte SPI transaction (receive) */ +static +void rcvr_spi_multi ( + BYTE* buff, /* Buffer to store received data */ + UINT cnt /* Number of bytes to receive */ +) +{ + do { + SPI2BUF = 0xFF; /* Initiate an SPI transaction */ + while (SPI2STATbits.SPIRBF == 0) ; /* Wait for end of the SPI transaction */ + *buff++ = SPI2BUF; /* Get received byte */ + SPI2BUF = 0xFF; + while (SPI2STATbits.SPIRBF == 0) ; + *buff++ = SPI2BUF; + } while (cnt -= 2); +} + + + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +int wait_ready (void) +{ + BYTE d; + + Timer2 = 500; /* Wait for ready in timeout of 500ms */ + do { + d = xchg_spi(0xFF); + } while ((d != 0xFF) && Timer2); + + return (d == 0xFF) ? 1 : 0; +} + + + +/*-----------------------------------------------------------------------*/ +/* Deselect the card and release SPI bus */ +/*-----------------------------------------------------------------------*/ + +static +void deselect (void) +{ + CS_HIGH(); /* Set CS# high */ + xchg_spi(0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Select the card and wait ready */ +/*-----------------------------------------------------------------------*/ + +static +int select (void) /* 1:Successful, 0:Timeout */ +{ + CS_LOW(); /* Set CS# low */ + xchg_spi(0xFF); /* Dummy clock (force DO enabled) */ + + if (wait_ready()) return 1; /* Wait for card ready */ + + deselect(); + return 0; /* Timeout */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +int rcvr_datablock ( /* 1:OK, 0:Failed */ + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be multiple of 4) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = xchg_spi(0xFF); + } while ((token == 0xFF) && Timer1); + + if(token != 0xFE) return 0; /* If not valid data token, retutn with error */ + + rcvr_spi_multi(buff, btr); /* Receive the data block into buffer */ + xchg_spi(0xFF); /* Discard CRC */ + xchg_spi(0xFF); + + return 1; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _USE_WRITE +static +int xmit_datablock ( /* 1:OK, 0:Failed */ + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data token */ +) +{ + BYTE resp; + + + if (!wait_ready()) return 0; + + xchg_spi(token); /* Xmit a token */ + if (token != 0xFD) { /* Not StopTran token */ + xmit_spi_multi(buff, 512); /* Xmit the data block to the MMC */ + xchg_spi(0xFF); /* CRC (Dummy) */ + xchg_spi(0xFF); + resp = xchg_spi(0xFF); /* Receive a data response */ + if ((resp & 0x1F) != 0x05) return 0; /* If not accepted, return with error */ + } + + return 1; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (cmd & 0x80) { /* ACMD is the command sequense of CMD55-CMD */ + cmd &= 0x7F; + res = send_cmd(CMD55, 0); + if (res > 1) return res; + } + + /* Select the card and wait for ready except to stop multiple block read */ + if (cmd != CMD12) { + deselect(); + if (!select()) return 0xFF; + } + + /* Send command packet */ + xchg_spi(0x40 | cmd); /* Start + Command index */ + xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xchg_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xchg_spi((BYTE)arg); /* Argument[7..0] */ + n = 0x01; /* Dummy CRC + Stop */ + if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) + Stop */ + if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) + Stop */ + xchg_spi(n); + + /* Receive command response */ + if (cmd == CMD12) xchg_spi(0xFF); /* Skip a stuff byte on stop to read */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do { + res = xchg_spi(0xFF); + } while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + + + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE pdrv /* Physical drive nmuber (0) */ +) +{ + if (pdrv != 0) return STA_NOINIT; /* Supports only single drive */ + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber (0) */ +) +{ + BYTE n, cmd, ty, ocr[4]; + + + if (pdrv != 0) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Initialize memory card interface */ + FCLK_SLOW(); + for (n = 10; n; n--) xchg_spi(0xFF); /* 80 dummy clocks */ + + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 1000; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get trailing return value of R7 resp */ + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + while (Timer1 && send_cmd(ACMD41, 0x40000000)); /* Wait for leaving idle state (ACMD41 with HCS bit) */ + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); + ty = (ocr[0] & 0x40) ? CT_SD2|CT_BLOCK : CT_SD2; /* SDv2+ */ + } + } + } else { /* SDv1 or MMCv3 */ + if (send_cmd(ACMD41, 0) <= 1) { + ty = CT_SD1; cmd = ACMD41; /* SDv1 */ + } else { + ty = CT_MMC; cmd = CMD1; /* MMCv3 */ + } + while (Timer1 && send_cmd(cmd, 0)); /* Wait for leaving idle state */ + if (!Timer1 || send_cmd(CMD16, 512) != 0) ty = 0; /* Set read/write block length to 512 */ + } + } + CardType = ty; + deselect(); + + if (ty) { /* Function succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + FCLK_FAST(); + } else { /* Function failed */ + power_off(); /* Deinitialize interface */ + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Sector count (1..128) */ +) +{ + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) { + count = 0; + } + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _USE_WRITE +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Sector count (1..128) */ +) +{ + if (pdrv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & CT_BLOCK)) sector *= 512; /* Convert to byte address if needed */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) { + count = 0; + } + } + else { /* Multiple block write */ + if (CardType & CT_SDC) send_cmd(ACMD23, count); + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) count = 1; /* STOP_TRAN token */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +#if _USE_IOCTL +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive data block */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + DWORD csz; + + + if (pdrv) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + res = RES_ERROR; + switch (cmd) { + case CTRL_SYNC : /* Flush write-back cache, Wait for end of internal process */ + if (select()) res = RES_OK; + break; + + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (WORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDv2? */ + csz = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1; + *(DWORD*)buff = csz << 10; + } else { /* SDv1 or MMCv3 */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csz = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = csz << (n - 9); + } + res = RES_OK; + } + break; + + case GET_BLOCK_SIZE : /* Get erase block size in unit of sectors (DWORD) */ + if (CardType & CT_SD2) { /* SDv2+? */ + if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */ + xchg_spi(0xFF); + if (rcvr_datablock(csd, 16)) { /* Read partial block */ + for (n = 64 - 16; n; n--) xchg_spi(0xFF); /* Purge trailing data */ + *(DWORD*)buff = 16UL << (csd[10] >> 4); + res = RES_OK; + } + } + } else { /* SDv1 or MMCv3 */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */ + if (CardType & CT_SD1) { /* SDv1 */ + *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); + } else { /* MMCv3 */ + *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); + } + res = RES_OK; + } + } + break; + + case MMC_GET_TYPE : /* Get card type flags (1 byte) */ + *ptr = CardType; + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if ((send_cmd(CMD9, 0) == 0) /* READ_CSD */ + && rcvr_datablock(buff, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if ((send_cmd(CMD10, 0) == 0) /* READ_CID */ + && rcvr_datablock(buff, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *((BYTE*)buff+n) = xchg_spi(0xFF); + res = RES_OK; + } + break; + + case MMC_GET_SDSTAT : /* Receive SD statsu as a data block (64 bytes) */ + if ((CardType & CT_SD2) && send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */ + xchg_spi(0xFF); + if (rcvr_datablock(buff, 64)) res = RES_OK; + } + break; + + case CTRL_POWER_OFF : /* Power off */ + power_off(); + Stat |= STA_NOINIT; + res = RES_OK; + break; + + default: + res = RES_PARERR; + } + + deselect(); + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Driven Procedure */ +/*-----------------------------------------------------------------------*/ +/* This function must be called by timer interrupt in period of 1ms */ + +void disk_timerproc (void) +{ + BYTE s; + UINT n; + + + n = Timer1; /* 1000Hz decrement timer with zero stopped */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + + + /* Update socket status */ + + s = Stat; + if (MMC_WP) { + s |= STA_PROTECT; + } else { + s &= ~STA_PROTECT; + } + if (MMC_CD) { + s &= ~STA_NODISK; + } else { + s |= (STA_NODISK | STA_NOINIT); + } + Stat = s; +} + diff --git a/ChaloupeLora.X/Source/FlashMapping.h b/ChaloupeLora.X/Source/FlashMapping.h new file mode 100644 index 0000000..db98898 --- /dev/null +++ b/ChaloupeLora.X/Source/FlashMapping.h @@ -0,0 +1,34 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef FLASHMAPPING_H +#define FLASHMAPPING_H +#include "define.h" + +/* +0x180000 Firmware flags +0x180004 Nb Records +0x180008 Firmware Size +0x18000C Version code +*/ + +#define FLASH_END_ADDRESS 180000 + +#define FLASH_BTLDR_FIRMWARE_START_ADDRESS 0x180000 +#define FLASH_BTLDR_FIRMWARE_LAST_64K_SECTOR_ADD 0x1F0000 +#define FLASH_BTLDR_FLAGS_ADDRESS 0x000000 +#define FLASH_WIFI_IP_ADDRESS 0X00000C +#define FLASH_WIFI_GATEWAY_ADDRESS 0x000010 + + + + +#define FLASH_BTLDR_HEADER_SIZE 24 + + + +#endif /* HARAKIRIRELAY_H */ diff --git a/ChaloupeLora.X/Source/FubarinoBoard.c b/ChaloupeLora.X/Source/FubarinoBoard.c new file mode 100644 index 0000000..9ae2325 --- /dev/null +++ b/ChaloupeLora.X/Source/FubarinoBoard.c @@ -0,0 +1,6 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + return RET_OK; +} diff --git a/ChaloupeLora.X/Source/HarakiriRelay.c b/ChaloupeLora.X/Source/HarakiriRelay.c new file mode 100644 index 0000000..fcf1643 --- /dev/null +++ b/ChaloupeLora.X/Source/HarakiriRelay.c @@ -0,0 +1,21 @@ +//#include + +#include "HarakiriRelay.h" +#include "BoardCfg.h" +#include "timer.h" + +#define PIN_ACTIVE 1 +#define PIN_INACTIVE 0 + + +void InitHarakiriRelay() +{ + HARAKIRI_RELAY_ON_PIN = PIN_INACTIVE; //Very important!! +} + + +bool HarakiriRelayTurnOff() +{ + HARAKIRI_RELAY_ON_PIN = PIN_ACTIVE; //Just wait for the power to be killed... + return true; +} diff --git a/ChaloupeLora.X/Source/HarakiriRelay.h b/ChaloupeLora.X/Source/HarakiriRelay.h new file mode 100644 index 0000000..5b7f2fa --- /dev/null +++ b/ChaloupeLora.X/Source/HarakiriRelay.h @@ -0,0 +1,19 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef HARAKIRIRELAY_H +#define HARAKIRIRELAY_H +#include "define.h" + + +void InitHarakiriRelay(); + +bool HarakiriRelayTurnOff(); + + +#endif /* HARAKIRIRELAY_H */ + diff --git a/ChaloupeLora.X/Source/I2C.c b/ChaloupeLora.X/Source/I2C.c new file mode 100644 index 0000000..9070d16 --- /dev/null +++ b/ChaloupeLora.X/Source/I2C.c @@ -0,0 +1,171 @@ +#include "define.h" +#include "BoardCfg.h" +#include "I2C.h" + +int mLastTransactionOK; +int mI2CWaitCounter; + +int I2CInit() +{ + //SPI and I2C BRG work the same way. So let's reuse some code! + // int BaudRateGenerator = SPICalculateBRG(80000000,100000); //PBclk is 80MHz, I2C clk = 100KHz + int BaudRateGenerator = 398; + + I2C3CON = 0; + + I2C3CONbits.DISSLW = 1; //disable slew rate control since we are only at 100KHz + I2C3BRG = BaudRateGenerator; + + I2C3CONbits.ON = 1; + + mLastTransactionOK = 0; + mI2CWaitCounter = 0; +} + + +int I2CWrite(unsigned char* OutBuf, unsigned char length) +{ + int RET = RET_OK; + int i; + + //Emit start event + I2C3CONbits.SEN = 1; + while(I2C3CONbits.SEN == 1) + { + + } + + if(I2C3STATbits.BCL == 1) + { + mLastTransactionOK = false; + return RET_ERROR; + } + + for(i = 0; i < length; i++) + { + I2C3TRN = OutBuf[i]; + mI2CWaitCounter = 0; + while(I2C3STATbits.TRSTAT == 1) + { + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + RET = RET_ERROR; + break; + } + } + + // if(I2C3STATbits.ACKSTAT == 1) + // { + // RET = RET_ERROR; + // } + } + + //Emit stop event + I2C3CONbits.PEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.PEN == 1) + { + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + RET = RET_ERROR; + break; + } + } + + mLastTransactionOK = true; + return RET; +} + +int I2CTransmitByte(unsigned char Byte) +{ + + + return RET_ERROR; +} + +int I2CRead(unsigned char SlaveAddress,unsigned char* InputBuf,unsigned char length) +{ + int RET = RET_OK; + int i; + //Emit start event + + I2C3CONbits.SEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.SEN == 1) + + if(I2C3STATbits.BCL == 1) + { + mLastTransactionOK = false; + return RET_ERROR; + } + + //Transmit slave address and write bit + I2C3TRN = SlaveAddress; + mI2CWaitCounter = 0; + while(I2C3STATbits.TRSTAT == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + for(i = 0; i < length; i++) + { + // + I2C3CONbits.RCEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.RCEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + InputBuf[i] = I2C3RCV; + + //Acknowledge reception + I2C3CONbits.ACKDT = 1; + I2C3CONbits.ACKEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.ACKEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + } + + //Emit stop event + I2C3CONbits.PEN = 1; + mI2CWaitCounter = 0; + while(I2C3CONbits.PEN == 1) + { + + if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT) + { + mLastTransactionOK = false; + return RET_ERROR; + } + } + + + mLastTransactionOK = true; + return RET; +} + +bool I2CWasLastTransactionOK() +{ + return mLastTransactionOK; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/I2C.h b/ChaloupeLora.X/Source/I2C.h new file mode 100644 index 0000000..192235d --- /dev/null +++ b/ChaloupeLora.X/Source/I2C.h @@ -0,0 +1,21 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef I2C_H +#define I2C_H + +#define I2C_BUFSIZE 10 +#define I2C_TRANSACTION_TIMEOUT_COUNT 800000 //around 10ms + +int I2CInit(); +int I2CWrite(unsigned char* OutBuf, unsigned char length); +int I2CRead(unsigned char SlaveAddress, unsigned char* InputBuf,unsigned char length); + +bool I2CWasLastTransactionOK(); + +#endif /* SPI_H */ + diff --git a/ChaloupeLora.X/Source/InternalUart.c b/ChaloupeLora.X/Source/InternalUart.c new file mode 100644 index 0000000..68ed8bd --- /dev/null +++ b/ChaloupeLora.X/Source/InternalUart.c @@ -0,0 +1,597 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "InternalUart.h" +#include "uart.h" +#include +//#include "Watchdog.h" +#include "digitalio.h" +#include "NetworkProtocol.h" + +/* ************************************************************************** */ +/* Local variables */ +char acIntUartRxBuff[MAX_INTERNAL_UART_PORT][INTERNAL_UART_BUFFER_DEPTH]; //Rx Buffers +stInternalUartData astInternalUartData[MAX_INTERNAL_UART_PORT]; //port management data + +unsigned int LoraData = 0; + +void process(void); +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InternalUartInit(void) +{ + //Setup port 1 + // +// U1MODEbits.ON = 0; //disable module +// U1STA = 0; +// U1STAbits.UTXEN = 0; //disable transmitter +// IPC6bits.U1IP = 7; //priority 7 +// IPC6bits.U1IS = 3; //sub-priority 3 +// U1STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted +//// U1STAbits.UTXSEL = 0b01; // //JFM 2012-08-27 +// IFS0bits.U1TXIF = 0; //clear interrupt flag +// IEC0bits.U1TXIE = 1; //enable tx interrupt +// U1STAbits.URXISEL = 0b00; //interrupt for each character received +// IFS0bits.U1RXIF = 0; +//#ifdef POLL_UART1_RX +// IEC0bits.U1RXIE = 0; //disable rx interrupts +//#else +// IEC0bits.U1RXIE = 1; //enable rx interrupts +//#endif +// U1STAbits.URXEN = 1; //enable receiver +// U1MODEbits.ON = 0; //disable module + + //Setup port 2 + // + U2MODEbits.ON = 0; //disable module + U2STA = 0; + U2STAbits.UTXEN = 0; //disable transmitter + IPC8bits.U2IP = 7; //priority 7 + IPC8bits.U2IS = 0; //sub-priority 2 + U2STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted + IFS1bits.U2TXIF = 0; //clear interrupt flag + IEC1bits.U2TXIE = 0; //enable tx interrupt + U2STAbits.URXISEL = 0b00; //interrupt for each character received + IFS1bits.U2RXIF = 0; +#ifdef POLL_UART2_RX + IEC1bits.U2RXIE = 0; //disable rx interrupts +#else + IEC1bits.U2RXIE = 1; //enable rx interrupts +#endif + U2STAbits.URXEN = 1; //enable receiver + U2STAbits.UTXEN = 1; + U2MODEbits.ON = 0; //disable module + + + int i; + for(i = 0; i < MAX_INTERNAL_UART_PORT; i++) + { + astInternalUartData[i].pcTxDataPtr = 0; + astInternalUartData[i].iNbFIFOPendingBytes = 0; + astInternalUartData[i].iTxDataSize = 0; + astInternalUartData[i].iTxDataCounter = 0; + astInternalUartData[i].iIsBusy = 0; + astInternalUartData[i].iIsOpened = 0; + astInternalUartData[i].iUartHandle = 0; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//int SetIntalUartInterrupts(int p_iUartPort, int p_iRxInterrupt,int p_iTxInterrupt) +//{ +// if(p_iUartPort > MAX_INTERNAL_UART_PORT) +// return UART_INVALID_PORT; +// +// switch(p_iUartPort) +// { +// case INTERNAL_UART_PORT_1: +// { +// if(p_iTxInterrupt) +// { +// IFS0bits.U1TXIF = 0; //clear interrupt flag +// IEC0bits.U1TXIE = 1; //enable tx interrupt +// } +// else +// { +// IEC0bits.U1TXIE = 0; //disable tx interrupt +// U1STAbits.UTXEN = 1; //This bit must be set when working without interrupts +// } +// if(p_iRxInterrupt) +// { +// IFS0bits.U1RXIF = 0; +// IEC0bits.U1RXIE = 1; //enable rx interrupt +// } +// else +// { +// IEC0bits.U1RXIE = 0; //disable rx interrupt +// } +// break; +// } +// case INTERNAL_UART_PORT_2: +// { +// if(p_iTxInterrupt) +// { +// IFS1bits.U2TXIF = 0; //clear interrupt flag +// IEC1bits.U2TXIE = 1; //enable tx interrupt +// } +// else +// { +// IEC1bits.U2TXIE = 0; //disable tx interrupt +// U2STAbits.UTXEN = 1; //This bit must be set when working without interrupts +// } +// if(p_iRxInterrupt) +// { +// IFS1bits.U2RXIF = 0; +// IEC1bits.U2RXIE = 1; //enable rx interrupt +// } +// else +// { +// IEC1bits.U2RXIE = 0; //disable rx interrupt +// } +// break; +// } +// default: +// { +// return UART_INVALID_PORT; +// } +// } +// return UART_OK; +//} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int OpenInternalPort(int p_iUartPort,int p_iUartHandle,char *p_pcHeadPtr, char *p_pcTailPtr, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable) +{ + if(p_iUartPort > MAX_INTERNAL_UART_PORT) + return UART_INVALID_PORT; + + int iBRG = (PERIPHERAL_FREQ/(4*p_iBaudRate)) - 1; + int iMask = 0; + + switch(p_iNbStopBits) + { + case INT_UART_ONE_STOP_BIT: + { + break; + } + case INT_UART_TWO_STOP_BITS: + { + iMask |= 0x00000001; + break; + } + } + + astInternalUartData[p_iUartPort].iUartHandle = p_iUartHandle; + + switch(p_iParityEnable) + { + case INT_UART_NO_PARITY: + { + break; + } + case INT_UART_EVEN_PARITY: + { + iMask |= 0x00000002; + break; + } + case INT_UART_ODD_PARITY: + { + iMask |= 0x00000004; + break; + } + } + + switch(p_iUartPort) + { + case INTERNAL_UART_PORT_1: + { + INTERNAL_UART1_TX_PIN_DIR = PIN_OUTPUT; + INTERNAL_UART1_TX_PIN = 1; + U1MODE = iMask; + U1MODEbits.BRGH = 1; + U1BRG = iBRG; + U1MODEbits.ON = 1; //enable module + break; + } + case INTERNAL_UART_PORT_2: + { + INTERNAL_UART2_TX_PIN_DIR = PIN_OUTPUT; + INTERNAL_UART2_TX_PIN = 1; + U2MODE = iMask; + U2MODEbits.BRGH = 1; + U2BRG = iBRG; + U2MODEbits.ON = 1; //enable module + break; + } + } + + astInternalUartData[p_iUartPort].iIsOpened = 1; + + return UART_OK; +} + +//----------------------------------------------------------------------------- + + + + +//----------------------------------------------------------------------------- +int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, char *p_pcSourceBufferHead, char *p_pcSourceBufferTail) +{ + int iBufSize; + int iAvailableBufSize; + char *p_cDataPointer; + int i; + stInternalUartData *p_stUartDataPtr = &astInternalUartData[p_iUartPort]; + + if(p_stUartDataPtr->iIsOpened == 0) + return UART_PORT_NOT_OPENED; + + //We use a FIFO stack that must be empty before a new transaction can occur + //if(p_stUartDataPtr->iNbFIFOPendingBytes != 0) //If FIFO not empty + if(p_stUartDataPtr->iIsBusy == 1) + return UART_PORT_BUSY; //no space is available so flag the port as BUSY... + + iBufSize = p_iDataSize; + if(iBufSize > INTERNAL_UART_BUFFER_DEPTH) + iBufSize = INTERNAL_UART_BUFFER_DEPTH; + + p_cDataPointer = p_stUartDataPtr->pcTxDataPtr = &p_stUartDataPtr->acIntUartTxFIFO[0]; + p_stUartDataPtr->iNbFIFOPendingBytes = iBufSize; + + //Fill FIFO with data; + for(i = 0; i< iBufSize; i++) + { + *p_cDataPointer++ = *p_pcDataBuf++; + + if(p_pcDataBuf > p_pcSourceBufferTail) //check for wrapping of source data circular buffer. + p_pcDataBuf = p_pcSourceBufferHead; + } + + p_stUartDataPtr->iIsBusy = 1; //informative flag to know we are TXing. + + //Begin Transmission + //A TX interrupt will be generated immediately after setting UTXEN + switch(p_iUartPort) + { + case INTERNAL_UART_PORT_1: + { + if(IEC0bits.U1TXIE) + { + //We consider at this point that the data has been sent for the upper layer. + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + U1STAbits.UTXEN = 1; + } + else + { + int i; + for(i = 0; i < iBufSize; i++) + { +// KickWatchdog(); + U1TXREG = *p_stUartDataPtr->pcTxDataPtr++; + while(U1STAbits.TRMT == 0); + } + p_stUartDataPtr->iIsBusy = 0; + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + } + break; + } + case INTERNAL_UART_PORT_2: + { + if(IEC1bits.U2TXIE) + { + //We consider at this point that the data has been sent for the upper layer. + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + U2STAbits.UTXEN = 1; + } + else + { + int i; + for(i = 0; i < iBufSize; i++) + { +// KickWatchdog(); + U2TXREG = *p_stUartDataPtr->pcTxDataPtr++; + while(U2STAbits.TRMT == 0); + LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + } + p_stUartDataPtr->iIsBusy = 0; + DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize); + } + + break; + } + } + + return UART_OK; +} + +int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort) +{ + int i; + int temp = IEC1; + IEC1bits.U2TXIE = 0; + for(i = 0; i < p_iDataSize; i++) + { + LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + U2TXREG = *p_pcDataBuf++; + while(U2STAbits.TRMT == 0); + } + LORA_MODULE_TX_LED_PIN = LED_OFF; + IFS1bits.U2TXIF = 0; + IEC1 = temp; + return UART_OK; +} + +void TickInternalUart(void) +{ +#ifdef POLL_UART1_RX + + if(U1STAbits.URXDA == 1) + { + if(U1STAbits.OERR) //Buffer overrun error. Data is lost. + { + U1STAbits.OERR = 0; + } + + int i = 0; + while(U1STAbits.URXDA && i < INTERNAL_UART_BUFFER_DEPTH) + { + char NewByte = U1RXREG; + // DriveProtocolRxData(&NewByte,1); + acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte; + } +// UartReceiveData(UART_1,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); +// DriveProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); + } +#endif + +#ifdef POLL_UART2_RX + if(U2STAbits.URXDA == 1) + { + int i = 0; + while(U2STAbits.URXDA == 1 && i < INTERNAL_UART_BUFFER_DEPTH) + { + char NewByte = U2RXREG; + // acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte; + LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN; + ProtocolAnalyzeNewData(NewByte); + + +// LoraData <<= 8; +// unsigned int toto = NewByte; +// toto &= 0x000000FF; +// LoraData |= toto; +// +// if(LoraData == 0xDEADBEEF) +// { +// HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN; +// LORA_ACTIVITY_LED_PIN = ~LORA_ACTIVITY_LED_PIN; +// LoraData = 0; +// } +// HEARTBEAT_LED_2_PIN = ~HEARTBEAT_LED_2_PIN; + } + if(U2STAbits.OERR) //Buffer overrun error. Data is lost. + { + U2STAbits.OERR = 0; + printf("Overrun\n"); + } +// UartReceiveData(UART_2,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + // CUProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + } +#endif + +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void __ISR(_UART_1_VECTOR, ipl7) InternalUart1AInterrupt(void) +{ + stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1]; + + if(IFS0bits.U1TXIF && IEC0bits.U1TXIE) + { + IFS0bits.U1TXIF = 0; + + //Check if there is still data to send in FIFO + if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + { + U1STAbits.UTXEN = 0; //all data sent, stop transmitter + p_acUartDataPtr->iIsBusy = 0; + + } + else + { + do + { + U1TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data + p_acUartDataPtr->iNbFIFOPendingBytes--; + + } + while((U1STAbits.UTXBF == 0) && //while there is space in buffer + (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send + + // HCAM +// if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) +// { +// // U1STAbits.UTXEN = 0; //all data sent, stop transmitter +// p_acUartDataPtr->iIsBusy = 0; +// } + } + + + } + if(IFS0bits.U1RXIF && IEC0bits.U1RXIE) + { + char NewByte; + int i; + + IFS0bits.U1RXIF = 0; + + if(U1STAbits.OERR) //Buffer overrun error. Data is lost. + { + U1STAbits.OERR = 0; + IFS0bits.U1RXIF = 0; + printf("UART1 OERR\n"); + return; + } + + i = 0; + while(U1STAbits.URXDA) + { + NewByte = U1RXREG; + acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte; + } + + UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i); + + + } +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +void __ISR(_UART_2_VECTOR, ipl7) InternalUart2Interrupt(void) +{ + stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2]; + if(IFS1bits.U2TXIF && IEC1bits.U2TXIE) + { + IFS1bits.U2TXIF = 0; + //Check if there is still data to send in FIFO + if(p_acUartDataPtr->iNbFIFOPendingBytes == 0) + { + U2STAbits.UTXEN = 0; //all data sent, stop transmitter + p_acUartDataPtr->iIsBusy = 0; + //LORA_MODULE_TX_LED_PIN = LED_OFF; + } + else + { + do + { + U2TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data + p_acUartDataPtr->iNbFIFOPendingBytes--; + LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN; + } + while((U2STAbits.UTXBF == 0) && //while there is space in buffer + (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send + } + + } + if(IFS1bits.U2RXIF && IEC1bits.U2RXIE) + { + IFS1bits.U2RXIF = 0; + char NewByte; + int i; + + if(U2STAbits.OERR) //Buffer overrun error. Data is lost. + { + U2STAbits.OERR = 0; + IFS1bits.U2RXIF = 0; + printf("UART2 OERR\n"); + return; + } + i = 0; + while(U2STAbits.URXDA) + { + NewByte = U2RXREG; + acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte; + LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN; + } + UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i); + + } +} + +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +/// Resets UART1 without closing it. Used when comm crashes. +void ResetUart1(void) +{ + U1MODEbits.ON = 0; //disable module + + U1STAbits.UTXEN = 0; //disable transmitter + + IEC0bits.U1TXIE = 0; //disable tx interrupt + IFS0bits.U1TXIF = 0; //clear interrupt flag + IEC0bits.U1TXIE = 1; //enable tx interrupt + IEC0bits.U1RXIE = 0; //disable rx interrupts + IEC0bits.U1RXIE = 0; //disable rx interrupts + IFS0bits.U1RXIF = 0; +#ifdef POLL_UART1_RX + IEC0bits.U1RXIE = 0; //disable rx interrupts +#else + IEC0bits.U1RXIE = 1; //enable rx interrupts +#endif + U1STAbits.URXEN = 1; //enable receiver + + astInternalUartData[INTERNAL_UART_PORT_1].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1].acIntUartTxFIFO[0]; + astInternalUartData[INTERNAL_UART_PORT_1].iTxDataSize = 0; + astInternalUartData[INTERNAL_UART_PORT_1].iIsBusy = 0; + + U1MODEbits.ON = 1; //enable module +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void ResetUart2(void) +{ + //Setup port 2 + // + U2MODEbits.ON = 0; //disable module + + U2STAbits.UTXEN = 0; //disable transmitter + + IEC1bits.U2TXIE = 0; //disable tx interrupt + IFS1bits.U2TXIF = 0; //clear interrupt flag + IEC1bits.U2TXIE = 0; //enable tx interrupt + IEC1bits.U2RXIE = 0; //disable rx interrupts + IFS1bits.U2RXIF = 1; +#ifdef POLL_UART2_RX + IEC1bits.U2RXIE = 0; //disable rx interrupts +#else + IEC1bits.U2RXIE = 1; //enable rx interrupts +#endif + U2STAbits.URXEN = 1; //enable receiver + + + astInternalUartData[INTERNAL_UART_PORT_2].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2].acIntUartTxFIFO[0]; + astInternalUartData[INTERNAL_UART_PORT_2].iTxDataSize = 0; + astInternalUartData[INTERNAL_UART_PORT_2].iIsBusy = 0; + + U2MODEbits.ON = 1; //disable module + +} +//----------------------------------------------------------------------------- + +void process(void) +{ +} + + +//EOF + diff --git a/ChaloupeLora.X/Source/InternalUart.h b/ChaloupeLora.X/Source/InternalUart.h new file mode 100644 index 0000000..5ac3114 --- /dev/null +++ b/ChaloupeLora.X/Source/InternalUart.h @@ -0,0 +1,98 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef INTERNAL_UART_H +#define INTERNAL_UART_H + +/* ************************************************************************** */ +/* Includes */ + +/* ************************************************************************** */ +/* Defines */ +#define INTERNAL_UART_BUFFER_DEPTH 1//4//16 //JFM 2012-08-27 +#define USE_TX_INTERNAL_BUFFER + +#define INTERNAL_UART1_TX_PIN_DIR TRISFbits.TRISF3 +#define INTERNAL_UART1_TX_PIN LATFbits.LATF3 + +#define INTERNAL_UART2_TX_PIN_DIR TRISFbits.TRISF5 +#define INTERNAL_UART2_TX_PIN LATFbits.LATF5 + + +/* ************************************************************************** */ +/* Type definitions */ +typedef enum +{ + INTERNAL_UART_PORT_1, + INTERNAL_UART_PORT_2, + MAX_INTERNAL_UART_PORT +}eInternalUartPorts; + +typedef enum +{ + INT_UART_NO_PARITY, + INT_UART_EVEN_PARITY, + INT_UART_ODD_PARITY +}eIntUartParity; + +typedef enum +{ + INT_UART_ONE_STOP_BIT, + INT_UART_TWO_STOP_BITS +}eIntUartStopBits; + +typedef enum +{ + INT_UART_INTERRUPT_OFF, + INT_UART_INTERRUPT_ON +}eIntUartInterruptOnOff; + +typedef struct +{ + char *pcTxDataPtr; + char acIntUartTxFIFO[INTERNAL_UART_BUFFER_DEPTH]; + int iNbFIFOPendingBytes; + int iTxDataSize; + int iTxDataCounter; + int iIsBusy; + int iIsOpened; + int iUartHandle; + +}stInternalUartData; + +/* ************************************************************************** */ +/* Prototypes */ +void InternalUartInit(void); +int OpenInternalPort(int p_iUartPort,int p_iUartHandle,char *p_pcHeadPtr, char *p_pcTailPtr, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable); +int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, char *p_pcSourceBufferHead, char *p_pcSourceBufferTail); +int SetIntalUartInterrupts(int p_iUartPort, int p_iRxInterrupt,int p_iTxInterrupt); +int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort); +void TickInternalUart(void); +void ResetUart1(void); +void ResetUart2(void); + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/KnobEncoderCtrl.c b/ChaloupeLora.X/Source/KnobEncoderCtrl.c new file mode 100644 index 0000000..a24aa01 --- /dev/null +++ b/ChaloupeLora.X/Source/KnobEncoderCtrl.c @@ -0,0 +1,123 @@ +//#include + +#include "KnobEncoderCtrl.h" +#include "BoardCfg.h" +#include "LedLightCtrl.h" +#include "timer.h" + +bool KnobDebounce; +int KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; +#define PIN_ACTIVE 0 +#define PIN_INACTIVE 1 + +//bool KnobDebounce; +//void __ISR(_EXTERNAL_1_VECTOR , ipl2) KnobEncoderInterrupt(void) +//{ +// if(KnobDebounce == false) +// { +// int dir = KNOB_PH_B_PIN; +// +// KnobDebounce = true; +// TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); +// IEC0bits.INT1IE = 0; +// +// if(dir == 1) +// { +// LedLightIncrease(); +// } +// else +// { +// LedLightDecrease(); +// } +// } +// +// IFS0bits.INT1IF = 0; +//} + +void KnobDebounceCtrlSM() +{ + switch(KnobReadSM) + { + case KEC_CHECK_BTN_STATE: + { + if(KNOB_TGLE_BTN_PIN == PIN_ACTIVE) + { + LedLightONOFFBtnPressed(); + KnobReadSM = KEC_DEBOUNCE_BTN_STATE; + TimerStart(KNOB_DEBOUNCE_TIMER,250); + } + else + { + KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; + } + break; + } + case KEC_DEBOUNCE_BTN_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_WAIT_FOR_BTN_RST_STATE; + } + + break; + } + case KEC_WAIT_FOR_BTN_RST_STATE: + { + if(KNOB_TGLE_BTN_PIN == PIN_INACTIVE) + { + KnobReadSM = KEC_WAIT_FOR_TRIGGER_STATE; + } + break; + } + case KEC_WAIT_FOR_TRIGGER_STATE: + { + if(KNOB_PH_A_PIN == PIN_ACTIVE) + { + if(KNOB_PH_B_PIN == PIN_ACTIVE) + { + LedLightIncrease(); + } + else + { + LedLightDecrease(); + } + TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); + KnobReadSM = KEC_DEBOUNCE_STATE; + } + else + { + KnobReadSM = KEC_CHECK_BTN_STATE; + } + break; + } + case KEC_DEBOUNCE_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_WAIT_FOR_RESET_STATE; + } + break; + } + case KEC_WAIT_FOR_RESET_STATE: + { + if((KNOB_PH_A_PIN == PIN_INACTIVE)) + { + if(KNOB_PH_B_PIN == PIN_INACTIVE) + { + TimerStart(KNOB_DEBOUNCE_TIMER,KNOB_DEBOUNCE_TIMEOUT); + KnobReadSM = KEC_WAIT_A_LITTLE_MORE_STATE; + } + } + + break; + } + case KEC_WAIT_A_LITTLE_MORE_STATE: + { + if(IsTimerExpired(KNOB_DEBOUNCE_TIMER)) + { + KnobReadSM = KEC_CHECK_BTN_STATE; + } + break; + } + } +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/KnobEncoderCtrl.h b/ChaloupeLora.X/Source/KnobEncoderCtrl.h new file mode 100644 index 0000000..9fe2d1e --- /dev/null +++ b/ChaloupeLora.X/Source/KnobEncoderCtrl.h @@ -0,0 +1,31 @@ +/* + * File: KnobEncoderCtrl.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef KNOBENCODERCTRL_H +#define KNOBENCODERCTRL_H +#include "define.h" + +#define KNOB_DEBOUNCE_TIMEOUT 5 //ms + + +void KnobDebounceCtrlSM(); + +enum KnobEncoderCtrlSMStates +{ + KEC_CHECK_BTN_STATE, + KEC_DEBOUNCE_BTN_STATE, + KEC_WAIT_FOR_BTN_RST_STATE, + KEC_WAIT_FOR_TRIGGER_STATE, + KEC_DEBOUNCE_STATE, + KEC_WAIT_FOR_RESET_STATE, + KEC_WAIT_A_LITTLE_MORE_STATE +}; + + + +#endif /* KNOBENCODERCTRL_H */ + diff --git a/ChaloupeLora.X/Source/LedLightCtrl.c b/ChaloupeLora.X/Source/LedLightCtrl.c new file mode 100644 index 0000000..00198b3 --- /dev/null +++ b/ChaloupeLora.X/Source/LedLightCtrl.c @@ -0,0 +1,96 @@ +#include "define.h" +#include "LedLightCtrl.h" +#include "PWMCtrl.h" + +int LedLightBrightness = 10; +int LedLightState = LED_LIGHT_ON; + + + +void LedLightDecrease() +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightDim(LED_LIGHT_TICK_STEP); +} +void LedLightDim(int Percent) +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBrightness -= Percent; + if(LedLightBrightness < LED_LIGHT_MIN_DIM_VAL) + { + LedLightBrightness = LED_LIGHT_MIN_DIM_VAL; + } + + PWMSetValue(LedLightBrightness); +} + +void LedLightBright(int Percent) +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBrightness += Percent; + if(LedLightBrightness >= 100) + { + LedLightBrightness = 100; + } + + PWMSetValue(LedLightBrightness); +} + +void LedLightIncrease() +{ + if(LedLightState == LED_LIGHT_OFF) + return; + + LedLightBright(LED_LIGHT_TICK_STEP); +} + +void LedLightSet(int Percent) +{ + if(Percent < 0) + Percent = 0; + if(Percent > 100) + Percent = 100; + + LedLightBrightness = Percent; + PWMSetValue(LedLightBrightness); +} + +void TurnLedLightON() +{ + LedLightState = LED_LIGHT_ON; + PWMSetValue(LedLightBrightness); +} + +void TurnLedLightOFF() +{ + LedLightState = LED_LIGHT_OFF; + PWMSetValue(0); +} + +void LedLightONOFFBtnPressed() +{ + if(LedLightState == LED_LIGHT_ON) + { + TurnLedLightOFF(); + } + else + { + TurnLedLightON(); + } +} + +int GetLedLightBrightness() +{ + return LedLightBrightness; +} + +int GetLedLightState() +{ + return LedLightState; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/LedLightCtrl.h b/ChaloupeLora.X/Source/LedLightCtrl.h new file mode 100644 index 0000000..ccaee23 --- /dev/null +++ b/ChaloupeLora.X/Source/LedLightCtrl.h @@ -0,0 +1,33 @@ +/* + * File: LedLightCtrl.h + * Author: JF + * + * Created on November 30, 2018, 8:09 PM + */ + +#ifndef LEDLIGHTCTRL_H +#define LEDLIGHTCTRL_H + +#define LED_LIGHT_TICK_STEP 5 //Percent +#define LED_LIGHT_MIN_DIM_VAL 10 //Percent + +#define LED_LIGHT_ON 1 +#define LED_LIGHT_OFF 0 + +extern int LedLightBrightness; + +void LedLightDim(int Percent); +void LedLightDecrease(); +void LedLightBright(int Percent); +void LedLightIncrease(); +void LedLightSet(int Percent); + +void LedLightONOFFBtnPressed(); +void TurnLedLightON(); +void TurnLedLightOFF(); + +int GetLedLightBrightness(); +int GetLedLightState(); + +#endif /* LEDLIGHTCTRL_H */ + diff --git a/ChaloupeLora.X/Source/LoraNetworkInterface.c b/ChaloupeLora.X/Source/LoraNetworkInterface.c new file mode 100644 index 0000000..57a9176 --- /dev/null +++ b/ChaloupeLora.X/Source/LoraNetworkInterface.c @@ -0,0 +1,284 @@ +#include "LoraNetworkInterface.h" +#include "ProtocolDefs.h" +#include "NetworkProtocol.h" +#include "InternalUart.h" +#include "define.h" +#include "BoardCfg.h" +#include "Uart.h" +#include "ChaletPowerRelay.h" +#include "HarakiriRelay.h" +#include "BatteryMonitor.h" +#include "LedLightCtrl.h" +#include "TemperatureSensor.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" +#include "LoraWatchdog.h" +#include "versionbuild.h" +//#include "WiFiCtrl.h" +// + +//enum eWiFiState +//{ +// WIFI_MODULE_OFF_STATE = 0, +// WIFI_CONNECTED_STATE, +// WIFI_DISCONNECTED_STATE, +// WIFI_INIT_ERROR_STATE, +// WIFI_UNKNOWN_STATE +//}; +unsigned char mLoraPreamble[3]={0x00,LORA_MASTER_ADDRESS,LORA_CHANNEL}; + +static const char mFirmwareVersion[15] = VERSIONNUMBER; +unsigned int mTotalMasterNbRequests = 0; + +void ExecuteMasterCommand(int Command, unsigned char *Data) +{ + //Whatever was the command, we are online... + LORA_MODULE_RX_LED_PIN = LED_OFF; + KickLoraWatchdog(); +// printf("EXEC\n\n"); + ChaletPowerRelayKickTimer(); + mTotalMasterNbRequests++; + switch(Command) + { + case CHALET_INTERFACE_ACK: + { + break; + } + case CHALET_GENERAL_STATUS_REQUEST: + { + float FloatVoltage = GetBatteryVoltage(); + float FloatTemperature = TempSensorGetTemp(); + unsigned int BattVoltage = *((int*)&FloatVoltage); + unsigned int Temperature = *((int*)&FloatTemperature); + int SolarPanelCurrent = GetSolarPanelCurrent(); + int SOC = GetBatterySOC(); + + char GeneralStatus = 0; + char ChaletStatus[18]; + + if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) + { + GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK; + } + if(GetCurrentModuleOK() == true) + { + GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK; + } + + ChaletStatus[0] = GeneralStatus; //General Status + ChaletStatus[1] = GetWiFiSate(); //Wifi Module state + + ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1 + BattVoltage >>= 8; + ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2 + BattVoltage >>= 8; + ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3 + BattVoltage >>= 8; + ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4 + + ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1 + SolarPanelCurrent >>= 8; + ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2 + + ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1 + SolarPanelCurrent >>= 8; + ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2 + + ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1 + Temperature >>= 8; + ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2 + Temperature >>= 8; + ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3 + Temperature >>= 8; + ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4 + + int tmp = mTotalMasterNbRequests; + ChaletStatus[14] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1 + mTotalMasterNbRequests >>= 8; + ChaletStatus[15] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2 + mTotalMasterNbRequests >>= 8; + ChaletStatus[16] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3 + mTotalMasterNbRequests >>= 8; + ChaletStatus[17] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4 + mTotalMasterNbRequests = tmp; + + + SendLoraNetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18); + + HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN; + + break; + } + case CHALET_AC_POWER_STATE_STATUS_REQUEST: + { + char PowerStatus = GetChaletPowerRelayState(); + SendLoraNetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1); + break; + } + case CHALET_AC_POWER_SET_STATE_REQUEST: + { + char response = CHALET_POWER_RELAY_UNKNOWN_STATE; + if(Data[0] == CHALET_POWER_RELAY_OFF_STATE) + { + ChaletPowerRelayTurnOff(); + response = CHALET_POWER_RELAY_OFF_STATE; + } + else if(Data[0] == CHALET_POWER_RELAY_ON_STATE) + { + ChaletPowerRelayTurnOn(); + response = CHALET_POWER_RELAY_ON_STATE; + } + else + { + //invalid state requested.... don't do anything + response = CHALET_POWER_RELAY_UNKNOWN_STATE; + } + + SendLoraNetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1); + + break; + } + case CHALET_BATTERY_VOLTAGE_REQUEST: + { + break; + } + case CHALET_WIFI_STATUS_REQUEST: + { + break; + } + case CHALET_WIFI_SET_STATE_REQUEST: + { + char response = WIFI_UNKNOWN_STATE; + if(Data[0] == 0) + { + TurnOFFWiFi(); + response = 0; + } + else if(Data[0] == 1) + { + if(GetWiFiSate() != WIFI_CONNECTED_STATE) + { + InitWiFi(); + response = GetWiFiSate(); + } + else + { + response = 1; + } + } + else + { + //invalid state requested.... don't do anything + response = WIFI_UNKNOWN_STATE; + } + + SendLoraNetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1); + break; + } + case CHALET_DO_HARAKIRI_REQUEST: + { + char response; + if(Data[0] == 0xBA && + Data[1] == 0xAD && + Data[2] == 0xBE && + Data[3] == 0xEF) + { + //Magic word is OK... let's suicide... + response = 0x01; + //First, send an ACK to master (this is blocking so it's OK) + SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); + HarakiriRelayTurnOff(); + } + else + { + response = 0x00; + SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); + } + break; + } + case CHALET_REBOOT_CPU_REQUEST: + { + char response; + if(Data[0] == 0xBA && + Data[1] == 0xAD && + Data[2] == 0xCA && + Data[3] == 0xFE) + { + //Magic word is OK... let's reboot... + response = 0x01; + //First, send an ACK to master (this is blocking so it's OK) + SendLoraNetworkCommandBlocking(CHALET_REBOOT_CPU_RESPONSE,&response,1); + Sleep(100); + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + } + else + { + response = 0x00; + SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); + } + break; + } + case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST: + { + char response[8]; + SPIFlashReadBuffer(response,8,FLASH_WIFI_IP_ADDRESS); + SendLoraNetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,8); + break; + } + case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST: + { + char response = 0; + if(SPIFlashWriteBuffer(Data,8,FLASH_WIFI_IP_ADDRESS) == 1) + { + response = 1; + } + + SendLoraNetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1); + break; + } + case CHALET_GET_FIRMWARE_VERSION_REQUEST: + { + SendLoraNetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15); + break; + } + case CHALET_CLEAR_COMMS_STATISTICS_REQUEST: + { + char response = 1; + mTotalMasterNbRequests = 0; + SendLoraNetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1); + break; + } + + } +} + +void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize) +{ + unsigned char *Payload; + unsigned int PayloadSize; + //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) + Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); + + UartTransmitData(NETWORK_UART_PORT,mLoraPreamble,3); + UartTransmitData(NETWORK_UART_PORT,Payload,PayloadSize); + +} + +void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize) +{ + unsigned char *Payload; + unsigned int PayloadSize; + //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) + Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); + + SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); + SendInternalUartDataBlocking(Payload,PayloadSize,NETWORK_UART_PORT); +} + +void TestTx() +{ + char toto = 0x03; + SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/LoraNetworkInterface.h b/ChaloupeLora.X/Source/LoraNetworkInterface.h new file mode 100644 index 0000000..c28f7da --- /dev/null +++ b/ChaloupeLora.X/Source/LoraNetworkInterface.h @@ -0,0 +1,17 @@ + + +#ifndef LORANEETWORKINTERFACE_H /* Guard against multiple inclusion */ +#define LORANEETWORKINTERFACE_H +#define LORA_CHANNEL 0x04 +#define LORA_MASTER_ADDRESS 0x05 + +#define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01 +#define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02 + +void ExecuteMasterCommand(int Command, unsigned char *Data); +void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize); +void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize); //USE WITH CARE + +void TestTx(); + +#endif /* LORANEETWORKINTERFACE_H */ diff --git a/ChaloupeLora.X/Source/LoraWatchdog.c b/ChaloupeLora.X/Source/LoraWatchdog.c new file mode 100644 index 0000000..b34b92f --- /dev/null +++ b/ChaloupeLora.X/Source/LoraWatchdog.c @@ -0,0 +1,101 @@ +//#include + +#include "HarakiriRelay.h" +#include "BoardCfg.h" +#include "timer.h" +#include "LoraWatchdog.h" + +int mLoraSMState; + + + +void InitLoraWatchdog() +{ + mLoraSMState = LORA_WATCHDOG_OK_STATE; + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); +} + +void TickLoraWatchdog() +{ + LoraWatchdogStateMachine(LORA_SM_TICK_EVENT); +} + +void LoraWatchdogStateMachine(int Event) +{ + switch(mLoraSMState) + { + case LORA_WATCHDOG_OK_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + //We lost the comm... reset the LoRa module + LORA_MODULE_RELAY_PIN = 1; //Turn OFF the LoRa module + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_OFF_TIMEOUT); + mLoraSMState = LORA_WATCHDOG_RESET_LORA_MODULE_STATE; + } + break; + } + case LORA_SM_KICK_EVENT: + { + //All is well... + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); + break; + } + } + break; + } + case LORA_WATCHDOG_RESET_LORA_MODULE_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + case LORA_SM_KICK_EVENT://That would be very weird since the LoRa module is OFF!!! + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + //Reset is done, turn module back ON. + LORA_MODULE_RELAY_PIN = 0; //Turn ON the LoRa module + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_REBOOT_TIMEOUT); //If we don't get Comm. back after this delay... reboot the PIC + mLoraSMState = LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE; + } + break; + } + } + break; + } + case LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE: + { + switch(Event) + { + case LORA_SM_TICK_EVENT: + { + if(IsTimerExpired(LORA_WATCHDOG_TIMER)) + { + + TurnOFFWiFi(); + Sleep(100); + SoftReset(); + } + break; + } + case LORA_SM_KICK_EVENT: + { + //Communication is re-established. + TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); + mLoraSMState = LORA_WATCHDOG_OK_STATE; + break; + } + } + break; + } + } +} + +void KickLoraWatchdog() +{ + LoraWatchdogStateMachine(LORA_SM_KICK_EVENT); +} diff --git a/ChaloupeLora.X/Source/LoraWatchdog.h b/ChaloupeLora.X/Source/LoraWatchdog.h new file mode 100644 index 0000000..dcfcd3e --- /dev/null +++ b/ChaloupeLora.X/Source/LoraWatchdog.h @@ -0,0 +1,38 @@ +/* + * File: LoraWatchdog.h + * Author: JF + * + * + */ + +#ifndef LORAWATCHDOG_H +#define LORAWATCHDOG_H +#include "define.h" + +#define LORA_WATCHDOG_MODULE_RESET_TIMEOUT 3600000 //1h Time without comm. before we reset the LoRa module +#define LORA_WATCHDOG_REBOOT_TIMEOUT 1200000 //20 minutes Time to reboot after we reset the LoRa module +#define LORA_WATCHDOG_MODULE_OFF_TIMEOUT 4000 //Keep the LoRa module off for 2 seconds when reseting it. + +enum eLoraWDSMStates +{ + LORA_WATCHDOG_OK_STATE, + LORA_WATCHDOG_RESET_LORA_MODULE_STATE, + LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE +}; + +enum eLoraWDEvents +{ + LORA_SM_TICK_EVENT, + LORA_SM_KICK_EVENT +}; + + +void InitLoraWatchdog(); +void TickLoraWatchdog(); +void LoraWatchdogStateMachine(int Event); +void KickLoraWatchdog(); + + + +#endif /* HARAKIRIRELAY_H */ + diff --git a/ChaloupeLora.X/Source/MasterCtrlInterface.c b/ChaloupeLora.X/Source/MasterCtrlInterface.c new file mode 100644 index 0000000..ee9cedd --- /dev/null +++ b/ChaloupeLora.X/Source/MasterCtrlInterface.c @@ -0,0 +1,282 @@ + +#include "define.h" +#include "MasterCtrlInterface.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include "NetworkProtocol.h" +#include "ProtocolDefs.h" +#include "timer.h" +#include +#include "ValveCtrl.h" +#include "FlowMeter.h" + +#ifdef USE_WINC1500 +#else +TCP_SOCKET MySocket; +static BYTE MasterIP[] = "192.168.0.100"; +DWORD MasterPort = 2182; +#endif + +int mConnectionState = MASTER_STATE_DISCONNECTED; + + +int InitMasterCtrlIF() +{ + ProtocolInit(); + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + return 1; +} + +int ConnectToMasterCtrl() +{ +#ifdef USE_WINC1500 +#else + MySocket = TCPOpen((DWORD) (PTR_BASE) & MasterIP[0], TCP_OPEN_RAM_HOST, MasterPort, TCP_PURPOSE_GENERIC_TCP_CLIENT); + + // Abort operation if no TCP socket of type TCP_PURPOSE_GENERIC_TCP_CLIENT is available + // If this ever happens, you need to go add one to TCPIPConfig.h + if (MySocket == INVALID_SOCKET) + { + printf("Could not open socket to MasterCtrl\n"); + return 0; + } + printf("MasterCtrl Socket opened\n"); +#endif + return 1; +} + +void TickMasterCtrlInterface() +{ +#ifdef USE_WINC1500 +#else + WORD Pending = TCPIsGetReady(MySocket); + if (Pending != 0) + { + // printf("Rx %d bytes\n",Pending); + int i = 0; + for(i = 0; i < Pending; i++) + { + BYTE Byte; + if(TCPGet(MySocket,&Byte) == TRUE) + { + ProtocolAnalyzeNewData(Byte); + } + } + } + +#ifdef CONNECT_DEVICE_TO_NETWORK + if(mConnectionState == MASTER_STATE_DISCONNECTED) + { + if(IsTimerExpired(MASTER_CONNECTION_TIMER)) + { + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT); + mConnectionState = MASTER_STATE_CONNECTING; + ConnectToMasterCtrl(); + } + } + else if(mConnectionState == MASTER_STATE_CONNECTING) + { +// if(IsTimerExpired(MASTER_CONNECTION_TIMER) == true) // +// { +// TCPClose(MySocket); +// TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT); +// ConnectToMasterCtrl(); +// } + } + else if(mConnectionState == MASTER_STATE_CONNECTED) + { + // if(IsTimerExpired(MASTER_CONNECTION_TIMER)) + { + if(TCPIsConnected(MySocket) == FALSE) + { + //we got disconnected... + mConnectionState = MASTER_STATE_DISCONNECTED; + TCPClose(MySocket); + + printf("Connection with MasterCtrl lost..\n"); + } + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + } + + } +#endif +#endif +} + +void NewMasterMessageReceived(char* Message) +{ + // char Sender = Message[FRAME_SENDER_DEVICE_ID_INDEX]; + char Target = Message[FRAME_DEST_DEVICE_ID_INDEX]; + unsigned char Command = Message[FRAME_COMMAND_INDEX]; + char *Data = &Message[FRAME_DATA_INDEX]; + + // printf("MasterMsgReceived %d \n",Command); + + if(Target == ID_ETHERNET_VIRTUAL) + { + switch(Command) + { + case ETH_NETWK_DEVICE_INFO_REQUEST: + { + char Data[2]; + Data[0] = ID_SPRINKLER_DEVICE; + Data[1] = MY_DEVICE_ADDRESS; //Address + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0); + printf("Rx Device info request\n"); +// int FrameSize = -1; +// unsigned char *FramePtr = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0, &FrameSize); +// +// if(FrameSize > 0) +// { +// TCPPutArray(MySocket,FramePtr,FrameSize); +// } + + break; + } + case ETH_NETWK_CONNECTION_REFUSED: + { + printf("Connection to server refused\n"); + break; + } + case ETH_NETWK_SET_DEVICE_INFO_ACK: + { + //Connected! + mConnectionState = MASTER_STATE_CONNECTED; + TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT); + printf("Connected to server\n"); + break; + } + case ETH_NETWK_DEVICE_INFO_RESPONSE: + default: + { + //error... + break; + } + } + + } + else if(Target == ID_SPRINKLER_DEVICE) + { + switch(Command) + { + case SPRINKLER_DEVICE_ACK: + { + break; + } + case SPRINKLER_DEVICE_STATUS_REQUEST: + { + unsigned char data[6]; + data[0] = (unsigned char)GetValveState(); + GetCurrentFlowBytes(&data[1]); + data[3] = 0; + data[4] = 0; + data[5] = 0; + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_STATUS_RESPONSE, data,6,0); + // printf("Status sent\n"); + break; + } + case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST: + { + unsigned char *MsgData; + char data; + + MsgData = ProtocolMsgDataPtr(); + if(*MsgData == 1) + { + SetValve(VALVE_ON); + data = 1; + } + else if(*MsgData == 1) + { + SetValve(VALVE_OFF); + data = 1; + } + else + { + data = 0; + } + + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK,&data,1,0); + break; + } + case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST: + { + unsigned char data; + data = (unsigned char)GetValveState(); + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE,&data,1,0); + break; + } + case SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST: + { + unsigned char data[2]; + GetCurrentFlowBytes(data); + SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE,data,2,0); + break; + } + case SPRINKLER_DEVICE_GET_MOISTURE_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_SET_PROGRAM_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_GET_PROGRAM_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST: + { + break; + } + case SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST: + { + break; + } + + case SPRINKLER_DEVICE_STATUS_RESPONSE: + case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK: + case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE: + case SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE: + case SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE: + case SPRINKLER_DEVICE_SET_PROGRAM_ACK: + case SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE: + case SPRINKLER_DEVICE_SET_PARAMETERS_ACK: + case SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE: + default: + { + //error + break; + } + } + } + else + { + //Ignore..??? + } +} + +bool SendFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags) +{ + + int FrameSize = -1; + unsigned char *FramePtr = ProtocolGetFrame(DestDevice,DestAddress,SenderDevice, Cmd, Data,Size,Flags,&FrameSize); + + if(FrameSize > 0) + { +#ifdef USE_WINC1500 +#else + TCPPutArray(MySocket,FramePtr,FrameSize); +#endif + + } + else + { + return false; + } + + + return true; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/MasterCtrlInterface.h b/ChaloupeLora.X/Source/MasterCtrlInterface.h new file mode 100644 index 0000000..3a3d2b4 --- /dev/null +++ b/ChaloupeLora.X/Source/MasterCtrlInterface.h @@ -0,0 +1,27 @@ +/* + * File: MasterCtrlInterface.h + * Author: JF + * + * Created on March 31, 2017, 2:41 PM + */ + +#ifndef MASTERCTRLINTERFACE_H +#define MASTERCTRLINTERFACE_H + +enum eMasterConnectionStates +{ + MASTER_STATE_DISCONNECTED, + MASTER_STATE_CONNECTING, + MASTER_STATE_CONNECTED +}; + +int InitMasterCtrlIF(void); +int ConnectToMasterCtrl(void); +void TickMasterCtrlInterface(void); +void MasterCtrlSM(int Event); +void NewMasterMessageReceived(char* Message); +bool SendFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags); + + +#endif /* MASTERCTRLINTERFACE_H */ + diff --git a/ChaloupeLora.X/Source/NetworkProtocol.c b/ChaloupeLora.X/Source/NetworkProtocol.c new file mode 100644 index 0000000..9f4e8cd --- /dev/null +++ b/ChaloupeLora.X/Source/NetworkProtocol.c @@ -0,0 +1,324 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Franďż˝ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.c + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ +#include "define.h" +#include "NetworkProtocol.h" +#include "Uart.h" +#include +#include "ProtocolDefs.h" +#include "MasterCtrlInterface.h" +#include "LoraNetworkInterface.h" + + + + +unsigned char mRxData[MAX_MESSAGE_SIZE+10], mTxData[MAX_MESSAGE_SIZE+10]; +unsigned int DataSize = 0; +unsigned int DataCtr = 0; +unsigned int BufPtr = 0; +unsigned char RxPtr = 0; +unsigned char Command = 0; +unsigned char State = RxHeader; +unsigned char CRC = 0; +unsigned char SenderID = 0; +unsigned char SenderAddress = 0; +unsigned char Flags = 0; +unsigned char IsUpdating = 0; +unsigned char *BmpDataPtr = 0; + +static char MyDeviceID = ID_SPRINKLER_DEVICE; + +void ProtocolInit(void) +{ + ResetStateMachine(); + +} + +void StateMachine(unsigned char Data) +{ + switch(State) + { + case Initialization: //Reset all pointers and data... + { + DataSize = 0; + BufPtr = 0; + RxPtr = 0; + Command = 0; + CRC = 0; + State = RxHeader; + break; + } + case RxHeader: //Wait for data header... + { + if(Data == FRAME_HEADER) + { + mRxData[BufPtr++] = Data; + State = RxAdd; + CRC ^= Data; + } + else + { + DataSize = 0; + ResetStateMachine(); + } + + break; + } + case RxAdd: //Sender Address. + { + SenderAddress = Data; + mRxData[BufPtr++] = Data; + State = RxID; + CRC ^= Data; + break; + } + case RxID: //Sender ID + { + mRxData[BufPtr++] = Data; + State = RxMyID; + SenderID = Data; + CRC ^= Data; + break; + } + case RxMyID: + { +// if(Data != MyDeviceID && Data != BROADCAST_VALUE) //Message is not for this type of device and it's not a broadcast +// { +// ResetStateMachine(); +// break; +// } + mRxData[BufPtr++] = Data; + State = RxMyAddress; + CRC ^= Data; + break; + } + case RxMyAddress: + { + if(Data != MY_DEVICE_ADDRESS && Data != BROADCAST_VALUE) //Message is not for this device address and it's not a broadcast + { + ResetStateMachine(); + break; + } + mRxData[BufPtr++] = Data; + State = RxFlags; + CRC ^= Data; + break; + } + case RxFlags: + { + Flags = Data; + mRxData[BufPtr++] = Data; + State = RxCMD; + CRC ^= Data; + break; + } + case RxCMD: + { + Command = Data; + mRxData[BufPtr++] = Data; + State = RxSize1; + CRC ^= Data; + break; + } + case RxSize1: //Data size MSB + { + DataSize = 0; + DataSize = (unsigned int)Data; + DataSize <<= 8; + mRxData[BufPtr++] = Data; + + + State = RxSize2; + CRC ^= Data; + break; + } + case RxSize2: //Data size + { + DataSize |= (unsigned int)Data; + DataSize <<= 8; + mRxData[BufPtr++] = Data; + + + State = RxSize3; + CRC ^= Data; + break; + } + case RxSize3: //Data size + { + DataSize |= (unsigned int)Data; + DataSize <<= 8; + mRxData[BufPtr++] = Data; + + + State = RxSize4; + CRC ^= Data; + break; + } + + case RxSize4: //Data size LSB + { + DataSize |= (unsigned int)Data; + mRxData[BufPtr++] = Data; + + if(DataSize > MAX_MESSAGE_SIZE) + ResetStateMachine(); + + if(DataSize == 0) + State = RxCRC; + else + State = RxData; + + CRC ^= Data; + break; + } + case RxData: + { + CRC ^= Data; + + mRxData[BufPtr++] = Data; + DataCtr++; + + if(DataCtr == DataSize) + { + State = RxCRC; + } + + break; + } + case RxCRC: + { + if(Data != CRC) + { + ResetStateMachine(); +// ProtocolAcknowledge(0,Command,0); + break; + } +// NewMasterMessageReceived(mRxData); + ExecuteMasterCommand(Command,ProtocolMsgDataPtr()); + ResetStateMachine(); + break; + } + default: + { + ResetStateMachine(); + break; + } + } +} + +void ProtocolAnalyzeNewData(unsigned char Data) +{ +// mRxData[RxPtr] = Data; +// printf("%X",Data); + StateMachine(Data); +} + +void ResetStateMachine(void) +{ + DataSize = 0; + BufPtr = 0; + RxPtr = 0; + Command = 0; + CRC = 0; + State = RxHeader; + DataCtr = 0; + Flags = 0; + SenderAddress = 0; +} + +void ProtocolExecCmd(void) +{ + switch(Command) + { + case RX_GET_STATUS: + { + unsigned char StatusByte =0; +// memcpy(&StatusByte, &IRRemoteStatus, sizeof(IRRemoteStatus)); +// ProtocolSendCmd(TX_DEADBOLT_STATUS,&StatusByte,sizeof(StatusByte),1,0); + + break; + } + } +} + +void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data) +{ + unsigned char data[2]; + if(Answer == 1) + { + data[0] = PROTOCOL_ACK; //CMD + } + else + { + data[0] = PROTOCOL_NAK; //CMD + } + data[1] = Cmd; + +// ProtocolSendCmd(TX_NETWORK_ACK,&data[0],2,1,0); +} + + + +unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size) +{ + unsigned char CRC = 0; + unsigned char i; + for(i = 0; i < size; i++) + CRC ^= Buffer[i]; + + return CRC; +} + +unsigned char ProtocolIsReceiving(void) +{ + if(State == RxHeader) + return 0; // Idle... + else + return 1; //receiving from serial port + +} + + + +unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) +{ + if(Size > MAX_MESSAGE_SIZE) + { + *FrameSize = 0; + return &mTxData[FRAME_HEADER_INDEX]; + } + + mTxData[FRAME_HEADER_INDEX] = FRAME_HEADER; //header + mTxData[FRAME_SENDER_ADDRESS_INDEX] = MY_DEVICE_ADDRESS; //My Address + mTxData[FRAME_SENDER_DEVICE_ID_INDEX] = SenderDevice; //My ID + mTxData[FRAME_DEST_DEVICE_ID_INDEX] = DestDevice; //Destination ID + mTxData[FRAME_DEST_ADDRESS_INDEX] = DestAddress ;//Address; //Destination Address + mTxData[FRAME_FLAGS_INDEX] = Flags; //Flags + mTxData[FRAME_COMMAND_INDEX] = Cmd; //Command to send + mTxData[FRAME_SIZE1_INDEX] = (unsigned char)((Size >> 24) & 0xFF); + mTxData[FRAME_SIZE2_INDEX] = (unsigned char)((Size >> 16) & 0xFF); + mTxData[FRAME_SIZE3_INDEX] = (unsigned char)((Size >> 8) & 0xFF); + mTxData[FRAME_SIZE4_INDEX] = (unsigned char)(Size & 0xFF); + memcpy((void*)&mTxData[FRAME_DATA_INDEX],(void*)Data,Size); //Cmd data + mTxData[Size+FRAME_DATA_INDEX] = ProtocolCalcCrc(mTxData,Size + FRAME_DATA_INDEX); // CRC + + *FrameSize = Size + FRAME_INDEX_NBR; + + return &mTxData[FRAME_HEADER_INDEX]; + +} + +unsigned char *ProtocolMsgDataPtr() +{ + return &mRxData[FRAME_DATA_INDEX]; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/NetworkProtocol.h b/ChaloupeLora.X/Source/NetworkProtocol.h new file mode 100644 index 0000000..6061c20 --- /dev/null +++ b/ChaloupeLora.X/Source/NetworkProtocol.h @@ -0,0 +1,77 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-Franďż˝ois Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.h + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ + + +#ifndef BOOTLOADERINTERFACE_H +#define BOOTLOADERINTERFACE_H + +//Protocol buffer specific definitions + +#define MASTER_ADDRESS 0x01 +#define MY_DEVICE_ADDRESS 0x01 + +#define ADDRESS 0x01 + +//State Machine states +enum States +{ + Initialization, + RxHeader, + RxAdd, + RxID, + RxMyID, + RxMyAddress, + RxFlags, + RxCMD, + RxSize1, + RxSize2, + RxSize3, + RxSize4, + RxData, + RxCRC +}; + +//enum DEVICES_IDS +//{ +// ID_MASTER, //Master Controller +// ID_CONSOLE, //LCD Console +// ID_PC, //PC +// ID_AV_MUX, //Audio Video Multiplexer +// ID_IR_REMOTE, +// ID_DEADBOLT +//}; + +//enum MESSAGE_IDS +//{ +// TX_NETWORK_ACK = 1, +// RX_GET_STATUS, +// TX_DEADBOLT_STATUS, +// +// MAX_NETWORK_CMD +//}; + +//State machine states definition + +void ProtocolInit(void); +void StateMachine(unsigned char STATE); +void ProtocolAnalyzeNewData(unsigned char RxByte); +void ResetStateMachine(void); +void ProtocolExecCmd(void); +void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data); +unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize); +unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size); +unsigned char ProtocolIsReceiving(void); +unsigned char *ProtocolMsgDataPtr(); + +#endif \ No newline at end of file diff --git a/ChaloupeLora.X/Source/PWMCtrl.c b/ChaloupeLora.X/Source/PWMCtrl.c new file mode 100644 index 0000000..7545c1e --- /dev/null +++ b/ChaloupeLora.X/Source/PWMCtrl.c @@ -0,0 +1,31 @@ +#include "PWMCtrl.h" +#include "BoardCfg.h" + + +void PWMSetValue(unsigned int percent) +{ + if(percent > 100) + percent = 100; +#ifdef REVERSE_POLARITY + percent = 100 - percent; +#endif + + LED_PWM_VAL_REG = ((PWM_RANGE_MAX / 100) * percent); + +} + +void PWMShutDown() +{ + PWMSetValue(0); +} + +void PWMSetAbsoluteValue(unsigned int value) +{ + if(value > PWM_RANGE_MAX) + { + value = PWM_RANGE_MAX; + } + + LED_PWM_VAL_REG = value; + +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/PWMCtrl.h b/ChaloupeLora.X/Source/PWMCtrl.h new file mode 100644 index 0000000..33c52ca --- /dev/null +++ b/ChaloupeLora.X/Source/PWMCtrl.h @@ -0,0 +1,18 @@ +/* + * File: PWMCtrl.h + * Author: JF + * + * Created on November 29, 2018, 5:24 PM + */ + +#ifndef PWMCTRL_H +#define PWMCTRL_H + +#define REVERSE_POLARITY + +void PWMSetValue(unsigned int percent); +void PWMShutDown(); +void PWMSetAbsoluteValue(unsigned int value); + +#endif /* PWMCTRL_H */ + diff --git a/ChaloupeLora.X/Source/PinguinoBoard.c b/ChaloupeLora.X/Source/PinguinoBoard.c new file mode 100644 index 0000000..6f5e557 --- /dev/null +++ b/ChaloupeLora.X/Source/PinguinoBoard.c @@ -0,0 +1,97 @@ +#include "BoardCfg.h" + +int InitBoard() +{ + HEARTBEAT_LED_1_PIN_DIR = PIN_OUTPUT; +// HEARTBEAT_LED_2_PIN_DIR = PIN_OUTPUT; + +// HEARTBEAT_LED_2_PIN = LED_ON; + HEARTBEAT_LED_1_PIN = LED_ON; + + GP_DEBUG_1_PIN_DIR = PIN_OUTPUT; + GP_DEBUG_1_PIN = 0; + GP_DEBUG_2_PIN_DIR = PIN_OUTPUT; + GP_DEBUG_2_PIN = 0; + + + SPI_SDI_PIN_DIR = PIN_INPUT; + SD_SPI_SS_PIN_DIR = PIN_OUTPUT; + SPI_SDO_PIN_DIR = PIN_OUTPUT; + SPI_SCK_PIN_DIR = PIN_OUTPUT; + + //Wifi (WINC1500 module) + WIFI_SPI_SS_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_SS_PIN = 1; + WIFI_IRQ_PIN_DIR = PIN_INPUT; +// WIFI_WAKE_PIN_DIR = PIN_OUTPUT; +// WIFI_WAKE_PIN = 1; + WIFI_SPI_CFG_PIN_DIR = PIN_OUTPUT; + WIFI_SPI_CFG_PIN = 0; + WIFI_CHP_EN_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN_DIR = PIN_OUTPUT; + WIFI_CHP_RST_PIN = 0; + + //Wifi chip IRQ + IEC0bits.INT0IE = 0; + IFS0bits.INT0IF = 0; + INTCONbits.INT0EP = 0; //Rising edge + IPC0bits.INT0IP = 3; + IPC0bits.INT0IS = 0; + IEC0bits.INT0IE = 1; + + //Wifi chip SPI + SPI2CON = 0; + SPI2CONbits.MSTEN = 1; + SPI2CONbits.CKE = 0; + SPI2CONbits.SMP = 0; + SPI2CONbits.CKP = 0; + SPI2BRG = SPICalculateBRG(PERIPHERAL_FREQ, 500000); + SPI2CONbits.ON = 1; + + + + //Control knob encoder + KNOB_PH_A_PIN_DIR = PIN_INPUT; + KNOB_PH_B_PIN_DIR = PIN_INPUT; + KNOB_TGLE_BTN_PIN_DIR = PIN_INPUT; + IEC0bits.INT1IE = 0; + IFS0bits.INT1IF = 0; + INTCONbits.INT1EP = 1; //Rising edge + IPC1bits.INT1IP = 2; + IPC1bits.INT1IS = 1; +// IEC0bits.INT1IE = 1; + + + + + + //Led controller PWM + LED_PWM_PIN_DIR = PIN_OUTPUT; + LED_PWM_PIN = 0; + + OC3CON = 0; + OC3R = 0; + OC3RS = 2000; //50% PWM + OC3CONbits.OCTSEL = 0; + OC3CONbits.OCM = 0b110; //PWM mode, no fault protection + + T2CONbits.TON = 0; // Disable Timer + T2CONbits.TCS = 0; // Select internal instruction cycle clock + T2CONbits.TGATE = 0; // Disable Gated Timer mode + T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler + TMR2 = 0x00; // Clear timer register + + //PR2 = 256; // Load the period value + PR2 = PWM_RANGE_MAX; //10KHz @ 80MHz + + IPC2bits.T2IP = 0x01; // Set Timer 2 Interrupt Priority Level + IFS0bits.T2IF = 0; // Clear Timer 2 Interrupt Flag + IEC0bits.T2IE = 0; // Disable Timer 2 interrupt + T2CONbits.TON = 1; // Start Timer + + OC3CONbits.ON = 1; + + + return RET_OK; +} diff --git a/ChaloupeLora.X/Source/PrintfServer.c b/ChaloupeLora.X/Source/PrintfServer.c new file mode 100644 index 0000000..418366e --- /dev/null +++ b/ChaloupeLora.X/Source/PrintfServer.c @@ -0,0 +1,104 @@ +#include "define.h" +#include "PrintfServer.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include + +//BYTE vTelnetSession; +WORD w, w2; +#ifdef USE_WINC1500 +#else +TCP_SOCKET MyPrintfSocket; +#endif + +char mPrintfString[1024]; //Make shure this string is at least as big as the heap +BOOL mPrintfAvailable; + +int OpenPrintfServer() +{ + memset(mPrintfString,'\0',1024); + +#ifdef USE_WINC1500 + return 0; +#else + MyPrintfSocket = TCPOpen(0, TCP_OPEN_SERVER, 6463, TCP_PURPOSE_GENERIC_TCP_SERVER); + + + if (MyPrintfSocket == INVALID_SOCKET) + { + + return 0; + } + mPrintfAvailable = FALSE; + return 1; +#endif + +} + +void TickPrintfServer() +{ + int length; + static int PrintfServerTickState = PRINTF_SERVER_INIT_STATE; + + switch(PrintfServerTickState) + { + case PRINTF_SERVER_INIT_STATE: + { + if(OpenPrintfServer() == 1) + { + PrintfServerTickState = PRINTF_SERVER_RUN_STATE; + } + break; + } + case PRINTF_SERVER_RUN_STATE: + { + +#ifdef USE_WINC1500 +#else + if(TCPIsConnected(MyPrintfSocket) == FALSE) + { + mPrintfAvailable = FALSE; + return; + } + else + { + if(mPrintfAvailable == FALSE) + { + mPrintfAvailable = TRUE; + TCPPutString(MyPrintfSocket,"Sprinkler printf console\n"); + + } + } + + + + length = (int)strlen(mPrintfString); + if(length > 0 /*&& TCPIsPutReady(MySocket) > length*/) + { + TCPPutString(MyPrintfSocket,mPrintfString); + memset(mPrintfString,'\0',1024); + } +#endif + + break; + } + } + } + +void TelnetPutPrintf(char c) +{ + if(mPrintfAvailable == FALSE) + return; + +// if(strlen(mPrintfString) >= 1000) +// return; +// +// strncat(mPrintfString,&c,1); +#ifdef USE_WINC1500 +#else + TCPPut(MyPrintfSocket,c); +#endif + // TCPFlush(MyPrintfSocket); +} diff --git a/ChaloupeLora.X/Source/PrintfServer.h b/ChaloupeLora.X/Source/PrintfServer.h new file mode 100644 index 0000000..2b10d8c --- /dev/null +++ b/ChaloupeLora.X/Source/PrintfServer.h @@ -0,0 +1,17 @@ + + +#ifndef PRINTFSERVER_H +#define PRINTFSERVER_H + +enum ePrintfServerTickStates +{ + PRINTF_SERVER_INIT_STATE, + PRINTF_SERVER_RUN_STATE +}; + +int OpenPrintfServer(); +void TickPrintfServer(); +void TelnetPutPrintf(char c); + + +#endif \ No newline at end of file diff --git a/ChaloupeLora.X/Source/ProtocolDefs.h b/ChaloupeLora.X/Source/ProtocolDefs.h new file mode 100644 index 0000000..f05a6bf --- /dev/null +++ b/ChaloupeLora.X/Source/ProtocolDefs.h @@ -0,0 +1,339 @@ +/********************************************************************** + Project: Automatic cat feeder + Date: march 19 2006 + Author: Jean-François Martel + Target: PIC 18F252 + Compiler: Microchip mcc18 + Filename: Protocol.h + + File description: Communication protocol implementation. + + + jean-francois.martel@polymtl.ca + **********************************************************************/ + +#ifndef PROTOCOLDEFS_H +#define PROTOCOLDEFS_H + +//Protocol buffer specific definitions + +#define MAX_BOOTLOADER_MESSAGE_SIZE 25 +#define MAX_MESSAGE_SIZE 300 +#define BOOTLOADER_MAX_MESSAGE_SIZE 50 + + +#define FRAME_HEADER 0x8A +#define BOOTLOADER_HEADER 0xA8 +#define DATA_START 11 +#define PROTOCOL_ACK 0xA3 +#define PROTOCOL_NAK 0x90 +#define BROADCAST_VALUE 0xFF + +#define MASTER_RECONNECTION_TIMEOUT 25000 //Try to reconnect every 5s +#define MASTER_RESPONSE_TIMEOUT 30000 //Wait max 30s for the master to respond... + +enum eFrameIndex +{ + FRAME_HEADER_INDEX = 0, + FRAME_SENDER_ADDRESS_INDEX, + FRAME_SENDER_DEVICE_ID_INDEX, + FRAME_DEST_DEVICE_ID_INDEX, + FRAME_DEST_ADDRESS_INDEX, + FRAME_FLAGS_INDEX, + FRAME_COMMAND_INDEX, + FRAME_SIZE1_INDEX, + FRAME_SIZE2_INDEX, + FRAME_SIZE3_INDEX, + FRAME_SIZE4_INDEX, + FRAME_DATA_INDEX, + + FRAME_INDEX_NBR +}; + +enum DEVICES_IDS +{ + ID_MASTER, //Master Controller + ID_CONSOLE, //LCD Console + ID_PC, //PC + ID_AV_MUX, //Audio Video Multiplexer + ID_IR_REMOTE, //Infra red transmitter + ID_DEADBOLT_DEVICE, + ID_AV_RECEIVER, + ID_SMS_CLIENT, + ID_ETHERNET_VIRTUAL, + ID_SPRINKLER_DEVICE, + ID_SPRINKLER_INTERFACE, + ID_DEADBOLT_INTERFACE, + ID_AVRECEIVER_INTERFACE, + ID_CHALET_INTERFACE, + ID_CHALET_DEVICE, + ID_BOOTLOADER_VIRTUAL, + ID_NB_DEVICE_ID + +}; + +// Commands definitions + +enum MASTER_CMD +{ + RX_MASTER_GET_STATUS, + TX_MASTER_STATUS, + TX_MASTER_ACK, + RX_MASTER_SET_NET_INFO, + RX_MASTER_GET_NET_INFO, + TX_MASTER_NET_INFO, + RX_MASTER_SEND_DEVICE_CMD, + TX_MASTER_SEND_DEVICE_CMD_ACK, + RX_MASTER_SET_WEATHER_INFO, + TX_MASTER_SET_WEATHER_INFO_ACK, + RX_MASTER_SET_MAIL_MSG, + TX_MASTER_SET_MAIL_MSG_ACK, + RX_MASTER_NEW_OUTLOOK_EMAILS, + TX_MASTER_NEW_OUTLOOK_EMAILS_ACK, + RX_MASTER_TODAYS_EVENTS, + TX_MASTER_TODAYS_EVENTS_ACK +}; + + +//CONSOLE +enum CONSOLE_CMD +{ + RX_CONSOLE_GET_STATUS, + TX_CONSOLE_STATUS, + TX_CONSOLE_ACK, + RX_START_CALIBRATION, + RX_GET_CONSOLE_EVENT_MSG, + TX_CONSOLE_EVENT_MSG, + RX_CONSOLE_SHOW_CALLER_ID, + RX_SET_TIME, + RX_SET_WEATHER, + RX_SEND_NEW_MAIL_MSG, + RX_SEND_NEW_MAIL_MSG_ACK, + RX_NEW_OUTLOOK_EMAILS, + TX_NEW_OUTLOOK_EMAILS_ACK, + RX_TODAYS_EVENTS, + TX_TODAYS_EVENTS_ACK, + LAST_CONSOLE_CMD +}; + + + +enum IR_REMOTE_CMDS +{ + TX_IR_REMOTE_ACK = 1, + RX_GET_STATUS, + TX_REMOTE_STATUS, + RX_TRANSMIT_CMD, + RX_LEARN_IR_CMD, + TX_LEARN_IR_CMD_FINISHED, + RX_GET_IR_DATA, + TX_SEND_IR_DATA, + RX_SET_IR_CMD, + RX_SET_IR_DATA, + RX_GET_IR_CMD, + TX_SEND_IR_CMD, + MAX_IR_REMOTE_CMD +}; + +//The SMS remote interface commands +enum SMS_CLIENT_CMDS +{ + SMS_CLIENT_DEVICE_ACK = 1, + SMS_CLIENT_DEVICE_STATUS_REQUEST, + SMS_CLIENT_DEVICE_STATUS_RESPONSE, + SMS_CLIENT_DEVICE_DID_INFO_REQUEST, + SMS_CLIENT_DEVICE_DID_INFO_RESPONSE, + SMS_CLIENT_DEVICE_GET_ALL_MSG_REQUEST, + SMS_CLIENT_DEVICE_GET_ALL_MSG_RESPONSE, + SMS_CLIENT_DEVICE_NEW_MSG_NOTIFICATION, + SMS_CLIENT_DEVICE_SEND_SMS_REQUEST, + SMS_CLIENT_DEVICE_SEND_SMS_ACK, + SMS_CLIENT_DEVICE_GET_CONTACTS_REQUEST, + SMS_CLIENT_DEVICE_GET_CONTACTS_RESPONSE,//12 + SMS_CLIENT_DEVICE_CONTACTS_CHANGED_NOTIFICATION, + + SMS_CLIENT_DEVICE_MAX_MSG + +}; + +//The actual deadbolt device commands +enum DEADBOLT_CMDS +{ + DEADBOLT_DEVICE_ACK = 1, + DEADBOLT_DEVICE_STATUS_REQUEST, + DEADBOLT_DEVICE_STATUS_RESPONSE, + DEADBOLT_DEVICE_GET_LOCKED_STATE_REQUEST, + DEADBOLT_DEVICE_LOCKED_STATE_RESPONSE, + DEADBOLT_DEVICE_GOTO_LOCKED_REQUEST, + DEADBOLT_DEVICE_GOTO_LOCKED_ACK, + DEADBOLT_DEVICE_GOTO_UNLOCKED_REQUEST, + DEADBOLT_DEVICE_GOTO_UNLOCKED_ACK, + DEADBOLT_DEVICE_GET_PASSWORDS_REQUEST, + DEADBOLT_DEVICE_GET_PASSWORDS_RESPONSE, + DEADBOLT_DEVICE_SET_PASSWORDS_REQUEST, + DEADBOLT_DEVICE_SET_PASSWORDS_ACK, + DEADBOLT_DEVICE_LOCK_EVENT, + + MAX_DEADBOLT_DEVICE_CMD +}; + +//The actual sprinkler module device commands +enum SPRINKLER_DEVICE_CMDS +{ + SPRINKLER_DEVICE_ACK = 1, + SPRINKLER_DEVICE_STATUS_REQUEST, + SPRINKLER_DEVICE_STATUS_RESPONSE, + SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST, + SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK, + SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST, + SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE, + SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST, + SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE, + SPRINKLER_DEVICE_GET_MOISTURE_REQUEST, + SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE, + SPRINKLER_DEVICE_SET_PROGRAM_REQUEST, + SPRINKLER_DEVICE_SET_PROGRAM_ACK, + SPRINKLER_DEVICE_GET_PROGRAM_REQUEST, + SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE, + SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST, + SPRINKLER_DEVICE_SET_PARAMETERS_ACK, + SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST, + SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE, + + + MAX_SPRINKLER_DEVICE_CMD +}; + +//The sprinkler interface commands +enum SPRINKLER_INTERFACE_CMDS +{ + SPRINKLER_INTERFACE_ACK = 1, + SPRINKLER_INTERFACE_STATUS_REQUEST, + SPRINKLER_INTERFACE_STATUS_RESPONSE, + SPRINKLER_INTERFACE_GET_SPRINKLERS_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLERS_RESPONSE, + SPRINKLER_INTERFACE_GET_SPRINKLER_DATA_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLER_DATA_RESPONSE, + SPRINKLER_INTERFACE_SET_SPRINKLER_DATA_REQUEST, + SPRINKLER_INTERFACE_SET_SPRINKLER_DATA_ACK, + SPRINKLER_INTERFACE_GET_SPRINKLER_STATE_REQUEST, + SPRINKLER_INTERFACE_GET_SPRINKLER_STATE_RESPONSE, + SPRINKLER_INTERFACE_SET_SPRINKLER_STATE_REQUEST, + SPRINKLER_INTERFACE_SET_SPRINKLER_STATE_ACK, + + MAX_SPRINKLER_INTERFACE_CMD +}; + + +enum ETHERNET_NETWORK_VIRTUAL_CMDS +{ + ETH_NETWK_DEVICE_INFO_REQUEST = 0xD0, + ETH_NETWK_DEVICE_INFO_RESPONSE, + ETH_NETWK_SET_DEVICE_INFO_ACK, + ETH_NETWK_CONNECTION_REFUSED, + + MAX_ETHERNET_NETWORK_VIRTUAL_CMDS + +}; + +enum AV_RECEIVER_INTERFACE_CMDS +{ + AV_RECEIVER_INTERFACE_ACK = 1, + AV_RECEIVER_INTERFACE_GENERAL_STATUS_REQUEST, + AV_RECEIVER_INTERFACE_GENERAL_STATUS_RESPONSE, + AV_RECEIVER_INTERFACE_SET_MAIN_POWER_REQUEST, + AV_RECEIVER_INTERFACE_SET_MAIN_POWER_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERB_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERB_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERA_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERA_RESPONSE, + AV_RECEIVER_INTERFACE_SET_SPEAKERS_REQUEST, + AV_RECEIVER_INTERFACE_SET_SPEAKERS_RESPONSE, + AV_RECEIVER_INTERFACE_SEND_DIRECT_CMD_REQUEST, + AV_RECEIVER_INTERFACE_SEND_DIRECT_CMD_RESPONSE, + + + MAX_AV_RECEIVER_INTERFACE_CMD +}; + +enum CHALET_INTERFACE_CMDS +{ + CHALET_INTERFACE_ACK = 1, + CHALET_INTERFACE_GENERAL_STATUS_REQUEST, + CHALET_INTERFACE_GENERAL_STATUS_RESPONSE, + CHALET_INTERFACE_AC_POWER_STATE_STATUS_REQUEST, + CHALET_INTERFACE_AC_POWER_STATE_STATUS_RESPONSE, + CHALET_INTERFACE_AC_POWER_SET_STATE_REQUEST, + CHALET_INTERFACE_AC_POWER_SET_STATE_RESPONSE, + CHALET_INTERFACE_BATTERY_VOLTAGE_REQUEST, + CHALET_INTERFACE_BATTERY_VOLTAGE_RESPONSE, + + MAX_CHALET_INTERFACE_CMD +}; + +enum CHALET_CMDS +{ + CHALET_ACK = 1, + CHALET_GENERAL_STATUS_REQUEST, + CHALET_GENERAL_STATUS_RESPONSE, + CHALET_AC_POWER_STATE_STATUS_REQUEST, + CHALET_AC_POWER_STATE_STATUS_RESPONSE, + CHALET_AC_POWER_SET_STATE_REQUEST, + CHALET_AC_POWER_SET_STATE_RESPONSE, + CHALET_BATTERY_VOLTAGE_REQUEST, + CHALET_BATTERY_VOLTAGE_RESPONSE, + CHALET_BATTERY_CURRENT_REQUEST, + CHALET_BATTERY_CURRENT_RESPONSE, + CHALET_WIFI_STATUS_REQUEST, + CHALET_WIFI_STATUS_RESPONSE, + CHALET_WIFI_SET_STATE_REQUEST, + CHALET_WIFI_SET_STATE_RESPONSE, + CHALET_DO_HARAKIRI_REQUEST, + CHALET_DO_HARAKIRI_CONFIRMATION, + CHALET_REBOOT_CPU_REQUEST, + CHALET_REBOOT_CPU_RESPONSE, + CHALET_GET_STORED_WIFI_SETTINGS_REQUEST, + CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE, + CHALET_SET_STORED_WIFI_SETTINGS_REQUEST, + CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE, + CHALET_GET_FIRMWARE_VERSION_REQUEST, + CHALET_GET_FIRMWARE_VERSION_RESPONSE, + CHALET_CLEAR_COMMS_STATISTICS_REQUEST, + CHALET_CLEAR_COMMS_STATISTICS_RESPONSE, + + MAX_CHALET_CMD +}; + +enum BOOTLOADER_CMDS +{ + BOOTLOADER_ACK = 1, + BOOTLOADER_HEARTBEAT_REQUEST, + BOOTLOADER_HEARTBEAT_RESPONSE, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_REQUEST, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESPONSE, + BOOTLOADER_ERASE_BOOTLOADER_FLASH_RESULT_RESPONSE, + BOOTLOADER_INIT_UPLOAD_REQUEST, + BOOTLOADER_INIT_UPLOAD_RESPONSE, + BOOTLOADER_GET_STATE_REQUEST, + BOOTLOADER_GET_STATE_RESPONSE, + BOOTLOADER_READY_FOR_DATA_RESPONSE, + BOOTLOADER_SEND_DATA_CHUNK_REQUEST, + BOOTLOADER_SEND_DATA_CHUNK_RESPONSE, + BOOTLOADER_UPLOAD_FINISHED_REQUEST, + BOOTLOADER_UPLOAD_FINISHED_RESPONSE, + BOOTLOADER_EXECUTE_UPGRAGE_REQUEST, + BOOTLOADER_EXECUTE_UPGRADE_RESPONSE, + BOOTLOADER_ABORT_OPERATION_REQUEST, + BOOTLOADER_ABORT_OPERATION_RESPONSE, + BOOTLOADER_SEND_FLASH_DATA_REQUEST, + BOOTLOADER_SEND_FLASH_DATA_RESPONSE, + BOOTLOADER_SEND_FLASH_DATA_CHUNK, + BOOTLOADER_SEND_FLASH_DATA_CHUNK_RESPONSE, + BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_REQUEST, + BOOTLOADER_CHECK_FLASH_FIRMW_INTEGRITY_RESPONSE, + BOOTLOADER_GET_STORED_FIRMWARE_INFO_REQUEST, + BOOTLOADER_GET_STORED_FIRMWARE_INFO_RESPONSE, + + MAX_BOOTLOADER_CMD +}; +#endif diff --git a/ChaloupeLora.X/Source/SDCardMgr.c b/ChaloupeLora.X/Source/SDCardMgr.c new file mode 100644 index 0000000..af20d88 --- /dev/null +++ b/ChaloupeLora.X/Source/SDCardMgr.c @@ -0,0 +1,212 @@ +#include "SDCardMgr.h" + +#ifdef USE_FATFS +#include "FatFS/diskio.h" +#include "FatFS/ff.h" + +FATFS FatFs; /* File system object */ +FIL File[2]; /* File objects */ +BYTE Buff[4096]; /* Working buffer */ + +#else +#include "sd_hw_ctl.h" +#include "FileSystem/fileio_lfn.h" +#endif + +#include +#include "timer.h" + +int mSDCardState; +int mCardDetected; +int mCardMounted; + +#ifdef USE_FATFS +#else +uint16_t mDriveLetter; +#endif + + +#ifdef USE_FATFS + +int InitSDCard() +{ + + + mSDCardState = SD_CARD_INIT_STATE; + mCardDetected = 0; + mCardMounted = 0; + + return MountDrive(); + + +} +int TickSDCard() +{ + return 1; +} + +int MountDrive() +{ + FRESULT res; + res = f_mount(&FatFs, "", 0); /* Give a work area to the default drive */ + if(!res) + { + printf("Could not mount SD card\n"); + return 1; + } + else + { + printf("SD Card mounted successfuly"); + } + + return 0; +} + +int IsDriveDetected() +{ + return mCardDetected; +} + +int IsDriveMounted() +{ + return mCardMounted; +} + +int ListRootDir() +{ + FRESULT res; + DIR dir; + UINT i; + static FILINFO fno; + char path[] = "/"; + + + + res = f_opendir(&dir, path); /* Open the directory */ + if (res == FR_OK) { + for (;;) { + res = f_readdir(&dir, &fno); /* Read a directory item */ + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ +// if (fno.fattrib & AM_DIR) { /* It is a directory */ +// i = strlen(path); +// sprintf(&path[i], "/%s", fno.fname); +// res = scan_files(path); /* Enter the directory */ +// if (res != FR_OK) break; +// path[i] = 0; +// } else { /* It is a file. */ + printf("%s/%s\n", path, fno.fname); + //} + } + f_closedir(&dir); + } + + + return 1; +} + +#else +void FILEIO_GetTimestamp (FILEIO_TIMESTAMP * timeStamp) +{ + timeStamp->date.bitfield.day = 6; + timeStamp->date.bitfield.month = 5; + timeStamp->date.bitfield.year = (2017 - 1980); + + timeStamp->time.bitfield.hours = 9; + timeStamp->time.bitfield.minutes = 5; + timeStamp->time.bitfield.secondsDiv2 = 0; + + timeStamp->timeMs = 0; + +} + +int InitSDCard() +{ + SD_SPIConfigurePins(); + FILEIO_Initialize(); + mSDCardState = SD_CARD_INIT_STATE; + + mCardDetected = 0; + mCardMounted = 0; + + mDriveLetter = 'D'; + TimerStart(SD_CARD_DETECT_TIMER,5000); + + return 1; +} + +int TickSDCard() +{ + switch(mSDCardState) + { + case SD_CARD_INIT_STATE: + { + if(IsTimerExpired(SD_CARD_DETECT_TIMER)) + { + if(FILEIO_MediaDetect(0, 0) == true) + { + mCardDetected = 1; + mSDCardState = SD_CARD_MOUNT_DRIVE_STATE; + printf("SD Card detected\n"); + } + else + { + TimerStart(SD_CARD_DETECT_TIMER,999); + } + } + break; + } + case SD_CARD_MOUNT_DRIVE_STATE: + { + if(FILEIO_DriveMount(mDriveLetter, 0, 0) == FILEIO_ERROR_NONE) + { + mCardMounted = 1; + mSDCardState = SD_CARD_READY_STATE; + printf("SD Card mounted on drive %c\n",(unsigned char)mDriveLetter); + } + else + { + mSDCardState = SD_CARD_ERROR_MOUNTING_STATE; + printf("Error mounting SD card.\n"); + } + break; + } + case SD_CARD_READY_STATE: + { +// if(FILEIO_MediaDetect(0, 0) == false) +// { +// mCardDetected = 0; +// mSDCardState = SD_CARD_INIT_STATE; +// } + break; + } + case SD_CARD_ERROR_MOUNTING_STATE: + { + //wait for removal of the sd card... +// if(FILEIO_MediaDetect(0, 0) == false) +// { +// mCardDetected = 0; +// mSDCardState = SD_CARD_INIT_STATE; +// printf("SD Card removed"); +// } + break; + } + } + +} + + +int MountDrive() +{ + +} + +int IsDriveDetected() +{ + return mCardDetected; +} + +int IsDriveMounted() +{ + return mCardMounted; +} +#endif diff --git a/ChaloupeLora.X/Source/SDCardMgr.h b/ChaloupeLora.X/Source/SDCardMgr.h new file mode 100644 index 0000000..8cf5d36 --- /dev/null +++ b/ChaloupeLora.X/Source/SDCardMgr.h @@ -0,0 +1,45 @@ +/* + * File: SDCardMgr.h + * Author: JF + * + * Created on May 18, 2017, 8:20 PM + */ + +#ifndef SDCARDMGR_H +#define SDCARDMGR_H +#ifdef USE_FATFS +//#include "FatFS/diskio.h" +#else +#include "FileSystem/fileio_lfn.h" +#endif + +enum eSDCardStates +{ + SD_CARD_INIT_STATE, + SD_CARD_MOUNT_DRIVE_STATE, + SD_CARD_READY_STATE, + SD_CARD_ERROR_MOUNTING_STATE +}; + +#ifdef USE_FATFS + +#else +void FILEIO_GetTimestamp(FILEIO_TIMESTAMP * timeStamp); +//void FILEIO_SETUP_HW(); +#endif + +int InitSDCard(); +int MountDrive(); +int IsDriveDetected(); +int IsDriveMounted(); +int TickSDCard(); + +int ListRootDir(); + + + +//void FILEIO_ + + +#endif /* SDCARDMGR_H */ + diff --git a/ChaloupeLora.X/Source/SPI.c b/ChaloupeLora.X/Source/SPI.c new file mode 100644 index 0000000..2eb6892 --- /dev/null +++ b/ChaloupeLora.X/Source/SPI.c @@ -0,0 +1,20 @@ +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" + +unsigned char SPITransaction(unsigned char OutBuf, unsigned char BaudRate) +{ + + SPI2BRG = BaudRate; + + // WIFI_SPI_SS_PIN = 0; + + SPI2BUF = OutBuf; + while(!SPI2STATbits.SPIRBF); + + OutBuf = SPI2BUF; + + // WIFI_SPI_SS_PIN = 1; + + return OutBuf; +} diff --git a/ChaloupeLora.X/Source/SPI.h b/ChaloupeLora.X/Source/SPI.h new file mode 100644 index 0000000..b464442 --- /dev/null +++ b/ChaloupeLora.X/Source/SPI.h @@ -0,0 +1,14 @@ +/* + * File: SPI.h + * Author: JF + * + * Created on December 2, 2018, 3:36 PM + */ + +#ifndef SPI_H +#define SPI_H + +unsigned char SPITransaction(unsigned char OutBuf, unsigned char Baudrate); + +#endif /* SPI_H */ + diff --git a/ChaloupeLora.X/Source/SPI_Flash.c b/ChaloupeLora.X/Source/SPI_Flash.c new file mode 100644 index 0000000..257c036 --- /dev/null +++ b/ChaloupeLora.X/Source/SPI_Flash.c @@ -0,0 +1,432 @@ +#include "SPI_Flash.h" +#include "SPI.h" +#include "BoardCfg.h" + +unsigned char mSPIFlashBaudrate; +unsigned char mSPIFlashHighSpeedBaudrate; +unsigned char mFlashSectorBuffer[SPI_FLASH_SECTOR_SIZE]; +unsigned int mSPIFlashOK; + +int InitSPIFlash() +{ + FLASH_SS_PIN = 1; + + mSPIFlashBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 25000000); +// mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 50000000); + mSPIFlashHighSpeedBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, 35000000); + mSPIFlashOK = 0; +} + +int SPIFlashCheckAndConfigure() +{ + + if(SPIFlashCheckChipID() == RET_OK) + { + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_STATUS_REG,mSPIFlashHighSpeedBaudrate); + SPITransaction(0x00,mSPIFlashHighSpeedBaudrate); //Configure for write enable the whole memory + FLASH_SS_PIN = 1; + + SPIFlashReadStatusReg(1); + + mSPIFlashOK = 1; + printf("SPI Flash configured\n"); + return RET_OK; + } + + mSPIFlashOK = 0; + printf("ERROR: SPI Flash not detected\n"); + return RET_ERROR; + +} + +int SPIFlashIsPresent() +{ + return mSPIFlashOK; +} + +int SPIFlashWriteEnable() +{ + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_WRITE_ENABLE,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + return RET_OK; +} + + + +unsigned char SPIFlashReadStatusReg(int print) +{ + unsigned char result; + + FLASH_SS_PIN = 0; + result = SPITransaction(SPI_FLASH_READ_STATUS_REG,mSPIFlashBaudrate); + result = SPITransaction(0x00,mSPIFlashBaudrate); //get data + FLASH_SS_PIN = 1; + + if(print) + { + printf("Flash status register : 0x%x\n",result); + } + + return result; + +} + +int SPIFlashCheckBusy() +{ + unsigned char status = SPIFlashReadStatusReg(0); + if((status & SPI_FLASH_BUSY_MASK) != 0) + { + return 1; + } + + return 0; +} + + +int SPIFlashCheckChipID() +{ + unsigned char VendorID, ChipID; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_READ_ID,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); + SPITransaction(0x00,mSPIFlashBaudrate); //Vendor address + VendorID = SPITransaction(0x00,mSPIFlashBaudrate); //Vendor ID, should be 0xBF + ChipID = SPITransaction(0x00,mSPIFlashBaudrate); //Device ID, should be 0x41 + FLASH_SS_PIN = 1; + + if(VendorID != SPI_FLASH_VENDOR_ID || ChipID != SPI_FLASH_CHIP_ID) + { + printf("SPI Flash detection FAILED. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_ERROR; + } + printf("SPI Flash detected. Vendor: 0x%x, Chip ID: 0x%x\n",VendorID,ChipID); + return RET_OK; + +} + + +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + if(StartAddress + Size - 1 > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_HI_SPEED_READ,mSPIFlashBaudrate); + SPITransaction(((StartAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((StartAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((StartAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction((0x00),mSPIFlashHighSpeedBaudrate); //Chip requires a dummy read in high speed + + int i; + for(i = 0; i < Size; i++) + { + unsigned char tmp; + tmp =SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + *Buf++ = tmp; + // *Buf++ = SPITransaction(0xDE,mSPIFlashHighSpeedBaudrate); + } + + FLASH_SS_PIN = 1; + + return RET_OK; +} + +int SPIFlashEraseSector(int SectorAddress) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_4KB_SECOTR_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + //SPIFlashWriteEnable(); + + return RET_OK; +} + +int SPIFlashErase64KSector(int SectorAddress, int Blocking) +{ + if(SectorAddress % SPI_FLASH_64K_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + if((SectorAddress + SPI_FLASH_64K_SECTOR_SIZE - 1) > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_64KB_BLOCK_ERASE,mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(Blocking != 0) + { + while( SPIFlashCheckBusy() == true); + // SPIFlashWriteEnable(); + } + + return RET_OK; +} + + + +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase) +{ + if(SectorAddress % SPI_FLASH_SECTOR_SIZE != 0) //Sectors are aligned on 0x1000 + { + return RET_ERROR; + } + + if(Erase == 1) + { + SPIFlashEraseSector(SectorAddress); + } + + unsigned char *DataPtr = &mFlashSectorBuffer[0]; + int j; + for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) + { + unsigned char curbyte; + curbyte = *DataPtr; + SPIFlashWriteEnable(); + + + + char Add1, Add2, Add3; + Add1 = (unsigned char)((SectorAddress & 0xFF0000) >> 16); + Add2 = ((unsigned char)((SectorAddress & 0x00FF00) >> 8)); + Add3 = ((unsigned char)(SectorAddress & 0x0000FF)); + + int t; + t = 0; + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)((SectorAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); +// SPITransaction((unsigned char)(SectorAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(Add1,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add2,mSPIFlashHighSpeedBaudrate); + SPITransaction(Add3,mSPIFlashHighSpeedBaudrate); + + SPITransaction(curbyte,mSPIFlashHighSpeedBaudrate); +// SPITransaction(*DataPtr,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + DataPtr++; + SectorAddress++; + + while( SPIFlashCheckBusy() == true); + } + + return RET_OK; +} + +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking) +{ + if(ByteAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + SPIFlashWriteEnable(); + + FLASH_SS_PIN = 0; + SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0xFF0000) >> 16),mSPIFlashHighSpeedBaudrate); + SPITransaction(((ByteAddress & 0x00FF00) >> 8),mSPIFlashHighSpeedBaudrate); + SPITransaction((ByteAddress & 0x0000FF),mSPIFlashHighSpeedBaudrate); + SPITransaction(byte,mSPIFlashHighSpeedBaudrate); + FLASH_SS_PIN = 1; + + if(blocking) + { + while( SPIFlashCheckBusy() == true); + } + + + return RET_OK; + +} + + + +//int SPIFlashEraseSectorForWrite(unsigned char StartAddress, int Size) +//{ +// //First, let's determine which sector to erase. +// +// int NbSectors = 1; +// int FirstSector = StartAddress / 0x1000; +// int LastSector = (StartAddress + Size) / 0x1000; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector; +// } +// +// int i; +// for(i = FirstSector; i < LastSector; i++ ) //Erase each sector one by one +// { +// +// } +// +//} + +//int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +//{ +// //First, we need to determine if the data overlaps or uses more than one sector +// //First, let's determine which sector to erase. +// int EndAddress = StartAddress + Size - 1; +// if(EndAddress > SPI_FLASH_MAX_ADDRESS) +// { +// return RET_ERROR; +// } +// +// int NbSectors = 1; +// int FirstSector = StartAddress / SPI_FLASH_SECTOR_SIZE; +// int LastSector = EndAddress / SPI_FLASH_SECTOR_SIZE; +// +// if(LastSector > FirstSector) +// { +// NbSectors = LastSector - FirstSector + 1; +// } +// +// int i; +// int FlashAddress = StartAddress; +// int CurSector = FirstSector; +// for(i = 0; i < NbSectors; i++ ) //Read, erase and write each sector one by one +// { +// //first we need to backup the data outside our buffer. +// //TODO: optimize +// int SectorStartAddress = CurSector++ * SPI_FLASH_SECTOR_SIZE; +// int SectorEndAddress = SectorStartAddress + SPI_FLASH_SECTOR_SIZE - 1; +// if(SectorEndAddress > EndAddress) +// { +// SectorEndAddress = EndAddress; +// } +// +// SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress); //Get local RAM buffer of the sector +// +// //Update the data to write. +// int RAMAddress = FlashAddress - SectorStartAddress; +// int RAMSectorSize = SectorEndAddress - FlashAddress + 1; +// FlashAddress += RAMSectorSize; +// +// unsigned char* RAMPtr = &mFlashSectorBuffer[RAMAddress]; +// int j; +// for(j = 0; j < RAMSectorSize; j++) +// { +// *RAMPtr++ = *Buf++; +// } +// +// int SectorAddress = SectorStartAddress; +// RAMPtr = mFlashSectorBuffer; +// +// for(j = 0; j < SPI_FLASH_SECTOR_SIZE; j++) +// { +// SPIFlashWriteEnable(); +// +// FLASH_SS_PIN = 0; +// SPITransaction(SPI_FLASH_BYTE_PROGRAM,mSPIFlashHighSpeedBaudrate); +// SPITransaction(((SectorAddress & 0xFF0000) >> 16),mSPIFlashBaudrate); +// SPITransaction(((SectorAddress & 0x00FF00) >> 8),mSPIFlashBaudrate); +// SPITransaction((SectorAddress & 0x0000FF),mSPIFlashBaudrate); +// SPITransaction(*RAMPtr++,mSPIFlashBaudrate); +// FLASH_SS_PIN = 1; +// +// SectorAddress++; +// +// while( SPIFlashCheckBusy() == true); +// } +// } +//} + +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress) +{ + int CurDataFlashAddress, DataFlashEndAddress; + char *DataBufPtr, *WorkPagePtr; + int WriteFinished; + + + //Init stuff + WriteFinished = 0; + DataFlashEndAddress = StartAddress + Size; //Start + size means the data at "DataFlashEndAddress" should not be written. + CurDataFlashAddress = StartAddress; + DataBufPtr = Buf; + + if(DataFlashEndAddress > SPI_FLASH_MAX_ADDRESS) + { + return RET_ERROR; + } + + while(WriteFinished == 0) + { + //Determine the current sector start address. + int SectorStartAddress; + SectorStartAddress = ((CurDataFlashAddress / SPI_FLASH_SECTOR_SIZE) * SPI_FLASH_SECTOR_SIZE); //Weird but it works + + //Load the sector in RAM working buffer + if(SPIFlashReadBuffer(mFlashSectorBuffer,SPI_FLASH_SECTOR_SIZE,SectorStartAddress) != RET_OK) + { + return RET_ERROR; + } + + //Set the working buffer pointer to the right value. + WorkPagePtr = &mFlashSectorBuffer[CurDataFlashAddress - SectorStartAddress]; + + //Modify the working buffer with data to write. + int SectorFinished = 0; + while(SectorFinished == 0) + { + *WorkPagePtr++ = *DataBufPtr++; + CurDataFlashAddress++; + + //Are we at the end of the buffer to write? + if(CurDataFlashAddress == DataFlashEndAddress) + { + SectorFinished = 1; + WriteFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + else if(CurDataFlashAddress % SPI_FLASH_SECTOR_SIZE == 0) //Are we at the beginning of the next sector? + { + SectorFinished = 1; +// SPIFlashEraseSector(SectorStartAddress); + SPIFlashWriteSectorWorkingBuffer(SectorStartAddress,1); + + break; + } + } + + } + + return 1; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/SPI_Flash.h b/ChaloupeLora.X/Source/SPI_Flash.h new file mode 100644 index 0000000..4f6b993 --- /dev/null +++ b/ChaloupeLora.X/Source/SPI_Flash.h @@ -0,0 +1,49 @@ +#ifndef SPI_FLASH_H /* Guard against multiple inclusion */ +#define SPI_FLASH_H + +#define SPI_FLASH_READ 0x03 +#define SPI_FLASH_HI_SPEED_READ 0x0b +#define SPI_FLASH_4KB_SECOTR_ERASE 0x20 +#define SPI_FLASH_32KB_BLOCK_ERASE 0x52 +#define SPI_FLASH_64KB_BLOCK_ERASE 0xd8 +#define SPI_FLASH_CHIP_ERASE 0x60 +#define SPI_FLASH_BYTE_PROGRAM 0x02 +#define SPI_FLASH_AAI_WORD_PROGRAM 0xad +#define SPI_FLASH_READ_STATUS_REG 0x05 +#define SPI_FLASH_ENABLE_WRITE_STATUS_REG 0x50 +#define SPI_FLASH_WRITE_STATUS_REG 0x01 +#define SPI_FLASH_WRITE_ENABLE 0x06 +#define SPI_FLASH_WRITE_DISABLE 0x04 +#define SPI_FLASH_READ_ID 0x90 +#define SPI_FLASH_READ_JEDEC_ID 0x9f +#define SPI_FLASH_ENABLE_SO_BUSY 0x70 +#define SPI_FLASH_DISABLE_SO_BUSY 0x80 + + +#define SPI_FLASH_BUSY_MASK 0x01 + +#define SPI_FLASH_VENDOR_ID 0xBF +#define SPI_FLASH_CHIP_ID 0x41 +#define SPI_FLASH_MAX_ADDRESS 0x1FFFFF +#define SPI_FLASH_SECTOR_SIZE 0x1000 +#define SPI_FLASH_64K_SECTOR_SIZE 0x10000 +#define SPI_NB_SECTORS 0x1FF //511 sectors = SPI_FLASH_MAX_ADDRESS / SPI_FLASH_SECTOR_SIZE + + +int InitSPIFlash(); +int SPIFlashCheckChipID(); +unsigned char SPIFlashReadStatusReg(int print); +int SPIFlashCheckAndConfigure(); +int SPIFlashReadBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashCheckBusy(); +int SPIFlashWriteEnable(); +int SPIFlashEraseSector(int SectorAddress); +int SPIFlashErase64KSector(int SectorAddress, int Blocking); +int SPIFlashWriteSectorWorkingBuffer(int SectorAddress, int Erase); +int SPIFlashWriteBuffer(unsigned char *Buf, int Size, int StartAddress); +int SPIFlashWriteByte(unsigned int ByteAddress, char byte, int blocking); +int SPIFlashIsPresent(); + + +#endif /* SPI_FLASH_H */ + diff --git a/ChaloupeLora.X/Source/Schedule.c b/ChaloupeLora.X/Source/Schedule.c new file mode 100644 index 0000000..2fbb269 --- /dev/null +++ b/ChaloupeLora.X/Source/Schedule.c @@ -0,0 +1,7 @@ +#include "define.h" +#include "Schedule.h" + +void InitSchedule() +{ + +} diff --git a/ChaloupeLora.X/Source/Schedule.h b/ChaloupeLora.X/Source/Schedule.h new file mode 100644 index 0000000..5f9d04c --- /dev/null +++ b/ChaloupeLora.X/Source/Schedule.h @@ -0,0 +1,14 @@ +/* + * File: Schedule.h + * Author: JF + * + * Created on May 4, 2017, 1:16 PM + */ + +#ifndef SCHEDULE_H +#define SCHEDULE_H + +void InitSchedule(); + +#endif /* SCHEDULE_H */ + diff --git a/ChaloupeLora.X/Source/Scheduler.c b/ChaloupeLora.X/Source/Scheduler.c new file mode 100644 index 0000000..afbdacb --- /dev/null +++ b/ChaloupeLora.X/Source/Scheduler.c @@ -0,0 +1,39 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120516 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Scheduler.h" + + +//---------------------------------------------------------------------------- +void InitScheduler(void) +{ +} +//---------------------------------------------------------------------------- + + +//EOF diff --git a/ChaloupeLora.X/Source/Scheduler.h b/ChaloupeLora.X/Source/Scheduler.h new file mode 100644 index 0000000..4f8afb2 --- /dev/null +++ b/ChaloupeLora.X/Source/Scheduler.h @@ -0,0 +1,48 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### 20120516 JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef SCHEDULER_H +#define SCHEDULER_H + +/* ************************************************************************** */ +/* Includes */ + + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ + + +/* ************************************************************************** */ +/* Prototypes */ +void InitScheduler(void); + + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/Syslog.c b/ChaloupeLora.X/Source/Syslog.c new file mode 100644 index 0000000..97ff5db --- /dev/null +++ b/ChaloupeLora.X/Source/Syslog.c @@ -0,0 +1,92 @@ +#include "Syslog.h" +#include "define.h" +#include +#include +#include +#include "terminal.h" +#include "WiFiCtrl.h" +#include "timer.h" + +//#define SYSLOG_BUFFER_SIZE 1024 +#define SYSLOG_BUFFER_SIZE 500 +char mSyslogBuffer[SYSLOG_BUFFER_SIZE]; +int mSyslogBufPtr; + +int InitSyslog() +{ + mSyslogBufPtr = 0; + memset(mSyslogBuffer,0,SYSLOG_BUFFER_SIZE); + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + +} + + +void SyslogTick() +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return; + } + + if(mSyslogBufPtr != 0 && IsTimerExpired(SYSLOG_TX_TIMER) == 1) + { + SendSyslogData(mSyslogBuffer,mSyslogBufPtr); + mSyslogBufPtr = 0; +// if(mSyslogBufPtr >= 150) +// { +// SendSyslogData(mSyslogBuffer,150); +// mSyslogBufPtr -= 150; +// +// } +// else +// { +// SendSyslogData(mSyslogBuffer,mSyslogBufPtr); +// mSyslogBufPtr = 0; +// } + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + } + +} + +int SyslogNewByte(char byte) +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return 0; + } + + mSyslogBuffer[mSyslogBufPtr] = byte; + mSyslogBufPtr++; + + if(mSyslogBufPtr == SYSLOG_BUFFER_SIZE) + { + SendSyslogData(mSyslogBuffer,SYSLOG_BUFFER_SIZE); + mSyslogBufPtr = 0; + } + + TimerStart(SYSLOG_TX_TIMER,SYSLOG_TX_TIMEOUT); + return 1; +} + +int SyslogNewString(char *string) +{ + if(IsSyslogClientConnected() == 0) + { + mSyslogBufPtr = 0; + return 0; + } + + SendSyslogData(string,strlen(string)); + return 1; +} + +int SyslogIsBufferEmpty() +{ + if(mSyslogBufPtr == 0) + return RET_OK; + + return RET_ERROR; + +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/Syslog.h b/ChaloupeLora.X/Source/Syslog.h new file mode 100644 index 0000000..439866d --- /dev/null +++ b/ChaloupeLora.X/Source/Syslog.h @@ -0,0 +1,14 @@ +#ifndef SYSLOG_H +#define SYSLOG_H + +#define SYSLOG_TX_TIMEOUT 200 //ms + + +int InitSyslog(); +void SyslogTick(); +int SyslogNewByte(char byte); +int SyslogNewString(char *string); +int SyslogIsBufferEmpty(); + + +#endif \ No newline at end of file diff --git a/ChaloupeLora.X/Source/TC77.c b/ChaloupeLora.X/Source/TC77.c new file mode 100644 index 0000000..47a1f68 --- /dev/null +++ b/ChaloupeLora.X/Source/TC77.c @@ -0,0 +1,95 @@ +//#include + +#include "TC77.h" +#include "BoardCfg.h" +#include "timer.h" + +short mDeviceID; + +int TC77Configure() +{ + + TEMP_SENSOR_CS_PIN = 0; + + //Execute a 16 bits read first. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Now, write 0xFFFF to config register. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Read Device ID + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + mDeviceID = SPI3BUF; + mDeviceID <<= 8; + + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + mDeviceID += SPI3BUF; + TEMP_SENSOR_CS_PIN = 1; + + mDeviceID &= 0xFFFC; + if(mDeviceID != 0x5400) + { + return RET_ERROR; + } + + Sleep(100); + + //Device detected. Now, put the device in continuous read mode. + TEMP_SENSOR_CS_PIN = 0; + + //Execute a 16 bits read first. + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + + //Now, write 0x0000 to config register. + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + + TEMP_SENSOR_CS_PIN = 1; + + return RET_OK; +} +float TC77GetActualTemp() +{ + short RawTemp = 0; + float Temp; + TEMP_SENSOR_CS_PIN = 0; + + //Read 16 bits. + SPI3BUF = 0x00; + while(!SPI3STATbits.SPIRBF); + RawTemp = SPI3BUF; + RawTemp <<= 8; + + SPI3BUF = 0xFF; + while(!SPI3STATbits.SPIRBF); + RawTemp += SPI3BUF; + + TEMP_SENSOR_CS_PIN = 1; + + RawTemp &= 0xFFF8; //Get rid of useless 3 LSB + //RawTemp >>= 3; + + Temp = ((float)0.0625 * (float)RawTemp); + Temp /= 8; + + return Temp; + +} + +short TC77GetDeviceID() +{ + return mDeviceID; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/TC77.h b/ChaloupeLora.X/Source/TC77.h new file mode 100644 index 0000000..afdce10 --- /dev/null +++ b/ChaloupeLora.X/Source/TC77.h @@ -0,0 +1,18 @@ +/* + * File: + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef TC77_H +#define TC77_H +#include "define.h" + +int TC77Configure(); +float TC77GetActualTemp(); +short TC77GetDeviceID(); + + +#endif /* TC77_H */ + diff --git a/ChaloupeLora.X/Source/TCPServer.c b/ChaloupeLora.X/Source/TCPServer.c new file mode 100644 index 0000000..b2c45f2 --- /dev/null +++ b/ChaloupeLora.X/Source/TCPServer.c @@ -0,0 +1,59 @@ +#include "define.h" +#include "TCPServer.h" +#ifdef USE_WINC1500 +#else +#include "TCPIP_Stack/TCPIP.h" +#endif +#include + +BYTE vTelnetSession; +WORD w, w2; +#ifdef USE_WINC1500 +#else +TCP_SOCKET MyTCPSocket; +#endif + +int OpenTCPServer() +{ + #ifdef USE_WINC1500 + return 0; +#else + MyTCPSocket = TCPOpen(0, TCP_OPEN_SERVER, 1212, TCP_PURPOSE_GENERIC_TCP_SERVER); + + if (MyTCPSocket == INVALID_SOCKET) + return 0; + + return 1; +#endif + +} + +void TickTCPServer() +{ + BYTE i; +#ifdef USE_WINC1500 +#else + WORD size = TCPIsGetReady(MyTCPSocket); + if (size != 0) + { + printf("Server Rx %d bytes\n",size); + BYTE buf[100]; + TCPGetArray(MyTCPSocket, buf,size); + TCPPutArray(MyTCPSocket,buf,size); +// switch (i) +// { +// case 'q': +// case 'Q': +// { +// TCPPutString(MySocket, "Bye\n"); +// TCPDisconnect(MySocket); +// break; +// } +// default: +// { +// TCPPut(MySocket,i); +// }f +// } + } +#endif +} diff --git a/ChaloupeLora.X/Source/TCPServer.h b/ChaloupeLora.X/Source/TCPServer.h new file mode 100644 index 0000000..c1bcc85 --- /dev/null +++ b/ChaloupeLora.X/Source/TCPServer.h @@ -0,0 +1,11 @@ + + +#ifndef TCPSERVER_H +#define TCPSERVER_H + + +int OpenTCPServer(); +void TickTCPServer(); + + +#endif \ No newline at end of file diff --git a/ChaloupeLora.X/Source/TemperatureSensor.c b/ChaloupeLora.X/Source/TemperatureSensor.c new file mode 100644 index 0000000..1c349b3 --- /dev/null +++ b/ChaloupeLora.X/Source/TemperatureSensor.c @@ -0,0 +1,38 @@ +//#include + +#include "TemperatureSensor.h" +#include "BoardCfg.h" +#include "TC77.h" +#include "timer.h" + +void InitTempSensor() +{ + ActualTemp = 0xBAADBEEF; + TimerStart(TEMP_SENSOR_REFRESH_TIMER,1000); +} + +int TempSensorCheckAndConfigure() +{ + if(TC77Configure() == RET_OK) + { + ActualTemp = TC77GetActualTemp(); + return RET_OK; + } + + return RET_ERROR; +} + +float TempSensorGetTemp() +{ + return ActualTemp; +} + +void TickTempSensor() +{ + if(IsTimerExpired(TEMP_SENSOR_REFRESH_TIMER)) + { + ActualTemp = TC77GetActualTemp(); + TimerStart(TEMP_SENSOR_REFRESH_TIMER,1000); +// printf("Temperature: %f\n",ActualTemp); + } +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/TemperatureSensor.h b/ChaloupeLora.X/Source/TemperatureSensor.h new file mode 100644 index 0000000..227e2c3 --- /dev/null +++ b/ChaloupeLora.X/Source/TemperatureSensor.h @@ -0,0 +1,24 @@ +/* + * File: ChaletPowerRelay.h + * Author: JF + * + * Created on November 30, 2018, 7:33 PM + */ + +#ifndef TEMPERATURESENSOR_H +#define TEMPERATURESENSOR_H +#include "define.h" + +float ActualTemp; + +void InitTempSensor(); +int TempSensorCheckAndConfigure(); +float TempSensorGetTemp(); + +void TickTempSensor(); + + + + +#endif /* TEMPERATURESENSOR_H */ + diff --git a/ChaloupeLora.X/Source/Terminal.c b/ChaloupeLora.X/Source/Terminal.c new file mode 100644 index 0000000..b6f215d --- /dev/null +++ b/ChaloupeLora.X/Source/Terminal.c @@ -0,0 +1,527 @@ + +/* + Description: + This is a template file for standard C header file. + + */ + +/* ************************************************************************** */ +/* Revision: + ### 20120607 JFM + Original version. + + ### 20120607 Initial, Bug Identification + Change description. + */ +#include +#include +#include +#include "terminal.h" +#include "define.h" +#include "WiFiCtrl.h" +#include "LedLightCtrl.h" +#include "ChaletPowerRelay.h" +#include "BatteryMonitor.h" +#include "BootloaderInterface.h" + +//#include "SDCardMgr.h" +#ifdef TERMINAL_USE_TELNET +#include "TCPIP_Stack/Telnet.h" +#endif + +#define TerminalPrint(fmt, ...) \ + do { sprintf(TerminalWorkString, fmt, __VA_ARGS__); \ + TerminalPrintString(TerminalWorkString);} while (0) + +char TerminalDataBuf[TERMINAL_STRING_LENGTH]; +char TerminalPrevDataBuf[TERMINAL_STRING_LENGTH]; +char TerminalWorkString[TERMINAL_STRING_LENGTH]; +char *TerminalDataPtr; + +int mTerminalPendingAction; +BOOL mTerminalOpened; +int mTerminalTickState; + +static BYTE mHelpString[] = "Here is the list of the available commands:\n\r\n\r" +"help : Shows this window\n\r" +"\npower [state] Set chalet's 12V Inverter feed power state. This command controls the main power relay\n" +" - Available [state] argument are: on\n" +" off\n" +"\nwifi [command] control ChaletDuino's WiFi module state%\n" +" - Available [command] argument are: on (turns ON module)\n" +" off (turns OFF module)\n" +" status (returns current status)\n" +"\nbattery [sensor] returns current battery sensors readings\n" +" - Available [sensor] argument are: voltage\n" +" current\n" +" soc (state of charge)\n" +" Empty [sensor] argument prints all values\n" +"\nstatus : get general system status\n" +"\nbootloader [command] : bootloader mode control\n" +" - Available [command] argument are: start (enable bootloader and opens port)\n" +" stop (disables bootloader if not busy)\n" +" state (prints actual state of the bootloader)\n" + +//"\ndebug : print some real-time stuff..." +"\nHave a good day!\n"; + +BYTE *mHelpStringPtr; + +void InitTerminal(void) +{ + TerminalDataPtr = &TerminalDataBuf[0]; + memset(TerminalDataBuf,0,sizeof(TerminalDataBuf)); + memset(TerminalPrevDataBuf,'\0',sizeof(TerminalPrevDataBuf)); + memset(TerminalWorkString,'\0',sizeof(TerminalWorkString)); + + mTerminalPendingAction = TERMINAL_ACTION_NONE; +} + + +void TickTerminal() +{ + switch(mTerminalPendingAction) + { + case TERMINAL_ACTION_NONE: + { + break; + } + case TERMINAL_ACTION_TURN_OFF_WIFI: + { + mTerminalPendingAction = TERMINAL_ACTION_NONE; + TurnOFFWiFi(); + break; + } + } +} + +void RxTerminalBuf(uint8* DataBuf, int size) +{ + if(DataBuf != 0) + { + int i = 0; + for(i = 0; i < size; i++) + { + RxTerminalData(*DataBuf++); + } + } +} + +void RxTerminalData(unsigned char Data) +{ + // sTerminalPrint(TerminalWorkString,"%c",Data); + // TerminalPrintString(TerminalWorkString); + if(Data == 0x0D) //enter + { + //TerminalPrint("\n\r"); + TerminalPrintString("\n\r\0"); + + if(strlen(TerminalDataBuf) != 0) + { + strcpy(TerminalPrevDataBuf,TerminalDataBuf); + ParseNewBuffer(); + } + + TerminalDataPtr = &TerminalDataBuf[0]; + memset(TerminalDataBuf,'\0',sizeof(TerminalDataBuf)); + + } + else if(Data == 0x08 || Data == 0x7F) //backspace + { + // TerminalPrint("%c",Data); + TerminalPrintChar(Data); + if(TerminalDataPtr != &TerminalDataBuf[0]) + { + TerminalDataPtr--; + *TerminalDataPtr = '\0'; + } + + } + // else if(Data == 0x1B) //Up key + // { + // //memcpy(TerminalDataBuf,TerminalPrevDataBuf,strlen(TerminalPrevDataBuf)-1); + // strcpy(TerminalDataBuf,TerminalPrevDataBuf); + // TerminalPrint("%s",TerminalDataBuf); + // } + else + { + //TerminalPrint("%c",Data); + TerminalPrintChar(Data); + if(TerminalDataPtr < &TerminalDataBuf[TERMINAL_STRING_LENGTH]) + { + *TerminalDataPtr = Data; + TerminalDataPtr++; + } + } +} + +void ParseNewBuffer(void) +{ + char mCmdString[30], mDataString1[30], mDataString2[30], mDataString3[30],mDataString4[30]; + memset(mCmdString,'\0',sizeof(mCmdString)); + memset(mDataString1,'\0',sizeof(mDataString1)); + memset(mDataString2,'\0',sizeof(mDataString2)); + memset(mDataString3,'\0',sizeof(mDataString3)); + memset(mDataString4,'\0',sizeof(mDataString4)); + + sscanf(TerminalDataBuf,"%s %s %s %s %s",mCmdString, mDataString1, mDataString2, mDataString3,mDataString4); + + if(strncmp(mCmdString,"help",strlen("help")) == 0) + { + mHelpStringPtr = mHelpString; + static BYTE* Ptr= mHelpString; + + SendTerminalData(mHelpString,strlen(mHelpString)); + + Ptr = mHelpStringPtr; + } + + else if(strncmp(mCmdString,"power",strlen("power")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[state] parameter is invalid. Type 'help' for more info\n"); + return; + } + + + if(strncmp(mDataString1,"on",strlen("on")) == 0) + { + TerminalPrintString("Turning chalet's inverter ON\n"); + ChaletPowerRelayTurnOn(); + } + else if(strncmp(mDataString1,"off",strlen("off")) == 0) + { + TerminalPrintString("Turning chalet's inverter OFF\n"); + ChaletPowerRelayTurnOff(); + } + else + { + TerminalPrintString("\n[state] parameter is invalid. Type 'help' for valid values\n"); + } + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"wifi",strlen("wifi")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n"); + return; + } + + if(strncmp(mDataString1,"on",strlen("on")) == 0) + { + if(GetWiFiSate() != WIFI_CONNECTED_STATE) + { + TerminalPrintString("Turning WiFi module ON\n"); + InitWiFi(); + } + else + { + TerminalPrintString("WiFi already connected...\n"); + } + } + else if(strncmp(mDataString1,"off",strlen("off")) == 0) + { + if(GetWiFiSate() != WIFI_MODULE_OFF_STATE) + { + TerminalPrintString("Turning WiFi module OFF... Goodbye!\n"); + //TurnOFFWiFi(); + mTerminalPendingAction = TERMINAL_ACTION_TURN_OFF_WIFI; + } + else + { + TerminalPrintString("WiFi module already OFF... that's weird!\n"); + } + } + else if(strncmp(mDataString1,"status",strlen("status")) == 0) + { + switch (GetWiFiSate()) + { + case WIFI_MODULE_OFF_STATE: + { + TerminalPrintString("WiFi module OFF\n"); + break; + } + case WIFI_CONNECTED_STATE: + { + TerminalPrintString("WiFi Connected\n"); + break; + } + case WIFI_DISCONNECTED_STATE: + { + TerminalPrintString("WiFi Disconnected\n"); + break; + } + case WIFI_INIT_ERROR_STATE: + { + TerminalPrintString("WiFi ERROR\n"); + break; + } + case WIFI_UNKNOWN_STATE: + { + TerminalPrintString("WiFi state Unknown!\n"); + break; + } + } + + } + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"battery",strlen("battery")) == 0) + { + if(strlen(mDataString1) == 0) + { + char voltage[15]; + sprintf(voltage,"%f",GetBatteryVoltage()); + TerminalPrintString("Battery Voltage: "); + TerminalPrintString(voltage); + TerminalPrintString("\n"); + char current[15]; + sprintf(current,"%d",GetSolarPanelCurrent()); + TerminalPrintString("Battery charge current: "); + TerminalPrintString(current); + TerminalPrintString("mA\n"); + return; + } + + if(strncmp(mDataString1,"voltage",strlen("voltage")) == 0) + { + char voltage[15]; + sprintf(voltage,"%f",GetBatteryVoltage()); + TerminalPrintString("Battery Voltage: "); + TerminalPrintString(voltage); + TerminalPrintString("\n"); + } + else if(strncmp(mDataString1,"current",strlen("current")) == 0) + { + char current[15]; + sprintf(current,"%d",GetSolarPanelCurrent()); + TerminalPrintString("Battery charge current: "); + TerminalPrintString(current); + TerminalPrintString("mA\n"); + } + else if(strncmp(mDataString1,"soc",strlen("soc")) == 0) + { + char SOC[15]; + sprintf(SOC,"%d",GetBatterySOC()); + TerminalPrintString("Battery SOC: "); + // TerminalPrintString(SOC); + TerminalPrintString("%\n"); + } + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"status",strlen("status")) == 0) + { + // TerminalPrintString("General status:\nBattery: TBD \nWiFi: TBD\nOther Stuff: TBD\n"); + TerminalPrintString("General status:\n"); + + if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_OFF_STATE) + { + TerminalPrintString("Inverter power relay: OFF\n"); + } + else if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) + { + TerminalPrintString("Inverter power relay: ON\n"); + } + else + { + TerminalPrintString("Inverter power relay: UNKNOWN\n"); + } + + switch(GetWiFiSate()) + { + case WIFI_MODULE_OFF_STATE: + { + TerminalPrintString("WiFi: Module is turned OFF\n"); + break; + } + case WIFI_CONNECTED_STATE: + { + TerminalPrintString("WiFi: Connected to AP\n"); + break; + } + case WIFI_DISCONNECTED_STATE: + { + TerminalPrintString("WiFi: Disconnected from AP\n"); + break; + } + case WIFI_INIT_ERROR_STATE: + { + TerminalPrintString("WiFi: Module initialization error\n"); + break; + } + case WIFI_UNKNOWN_STATE: + default: + { + TerminalPrintString("WiFi: Unknown state\n"); + break; + } + } + + char voltage[15]; + memset(voltage,0,15); + sprintf(voltage,"%.2f",GetBatteryVoltage()); + TerminalPrintString("Battery Voltage: "); + TerminalPrintString(voltage); + TerminalPrintString("V\n"); + + char current[15]; + memset(current,0,15); + sprintf(current,"%dmA\n",GetSolarPanelCurrent()); + TerminalPrintString("Battery charge current: "); + TerminalPrintString(current); + //TerminalPrintString("mA\n"); + + Sleep(100); + char SOC[15]; + memset(SOC,0,15); + sprintf(SOC,"%d%%\n",GetBatterySOC()); + TerminalPrintString("Battery SOC: "); + TerminalPrintString(SOC); + // TerminalPrintString("\n"); + + + TerminalPrintString("\n"); + } + else if(strncmp(mCmdString,"bootloader",strlen("bootloader")) == 0) + { + if(strlen(mDataString1) == 0) + { + TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n"); + return; + } + + if(strncmp(mDataString1,"start",strlen("start")) == 0) + { + //start bootloader server +// OpenBootloaderServer(); + BootloaderActivateBootloader(); + TerminalPrintString("Activating bootloader\n"); + } + else if(strncmp(mDataString1,"stop",strlen("stop")) == 0) + { + //CloseBootloaderServer(); + TerminalPrintString("Deactivating bootloader\n"); + BootloaderDeactivateBootloader(); + } + else if(strncmp(mDataString1,"status",strlen("status")) == 0) + { + if(IsBootloaderClientConnected()) + { + TerminalPrintString("\nBootloader client connected\n"); + return; + } + else + if(IsBootloaderClientConnected()) + { + TerminalPrintString("\nBootloader client not connected\n"); + return; + } + } + + } + else if(strncmp(mCmdString,"debug",strlen(mCmdString)) == 0) + { + // if(strlen(mDataString1) == 0) + // { + // TerminalPrintString("\n[subsystem] parameter is invalid. Type 'help' for more info\n"); + // return; + // } + // if(strlen(mDataString2) == 0) + // { + // TerminalPrintString("\n[timeout] parameter is invalid. Type 'help' for more info\n"); + // return; + // } + // + // unsigned int timeout = atoi(mDataString2); + // if(timeout != 0 && timeout < 100 && timeout > 5000) + // { + // TerminalPrint("[timeout] value must be between 100 & 5000. Current value: %d",timeout); + // return; + // } + // + // if(strncmp(mDataString1,"valve",strlen("valve")) == 0) + // { + // // TerminalPrintValveStatus(); + // TerminalPrintString("Debug valve not implemented\n"); + // } + // else if(strncmp(mDataString1,"flow",strlen("flow")) == 0) + // { + // if(timeout == 0) + // { + // TerminalPrintString("Flow debugging stopped\n"); + // StopDebugFlowMeter(); + // } + // else + // { + // TerminalPrintString("OK\n"); + // StartDebugFlowMeter(timeout); + // } + // } + // else if(strncmp(mDataString1,"hygro",strlen("hygro")) == 0) + // { + // TerminalPrintString("Debug hygro not implemented\n"); + // } + } + + else + TerminalPrintString("Unknown command\n\n"); +} + +void TerminalPrintString(char *str) +{ +#ifdef USE_WINC1500 + SendTerminalData(str,strlen(str)); +#else +#ifdef TERMINAL_USE_TCP_SERVER + TCPPutString(mTerminalSocket, str); +#endif +#endif +} + +void TerminalPrintChar(char byte) +{ +#ifdef USE_WINC1500 + SentTerminalByte(byte); +#else +#ifdef TERMINAL_USE_TCP_SERVER + TCPPut(mTerminalSocket,byte); +#endif +#endif +} + +void TerminalStateMachine(void) +{ + +} + +// +//void TerminalPrintValveStatus() +//{ +// if(GetValveState() == VALVE_ON) +// { +// TerminalPrintString("The valve is ON\n"); +// } +// else +// { +// TerminalPrintString("The valve is OFF\n"); +// } +//} +// +//void TerminalPrintFlowStatus() +//{ +// unsigned int Flow = GetCurrentFlow(); +// TerminalPrint("Flow: %d\n",Flow);; +//} +// +//void TerminalPrintHygroStatus(int unit) +//{ +// TerminalPrint("Hygro %d: ?\n",unit); +//} +// + +//EOf + diff --git a/ChaloupeLora.X/Source/Terminal.h b/ChaloupeLora.X/Source/Terminal.h new file mode 100644 index 0000000..b83a3c6 --- /dev/null +++ b/ChaloupeLora.X/Source/Terminal.h @@ -0,0 +1,67 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ +#define TERMINAL_STRING_LENGTH 300 +#define USE_WINC1500 +enum eTerminalCmds +{ + HELP_CMD, + PWM_CMD, + SET_CMD, + MAX_CMD +}; + +enum eTerimnalTickStates +{ + TERMINAL_INIT_STATE, + TERMINAL_RUN_STATE +}; + +enum eTerminalActions +{ + TERMINAL_ACTION_NONE = 0, + TERMINAL_ACTION_TURN_OFF_WIFI, + + TERMINAL_ACTION_MAX +}; + + +void InitTerminal(void); + + +void RxTerminalData(unsigned char Data); +void RxTerminalBuf(unsigned char *DataBuf, int size); +void ParseNewBuffer(void); +void TerminalStateMachine(void); + +void TickTerminal(void); +void TerminalPrintString(char *str); +void TerminalPrintChar(char byte); + +void TerminalPrintValveStatus(); +void TerminalPrintFlowStatus(); +void TerminalPrintHygroStatus(int unit); + +//EOF + diff --git a/ChaloupeLora.X/Source/Uart.c b/ChaloupeLora.X/Source/Uart.c new file mode 100644 index 0000000..94f9018 --- /dev/null +++ b/ChaloupeLora.X/Source/Uart.c @@ -0,0 +1,699 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Uart.h" +#include "Internaluart.h" +#include +#include +//#include "Watchdog.h" + +#ifndef NO_EXTERNAL_UART +#include "sc16IS740Driver.h" +#endif + +#include "digitalio.h" +//#include "DriveProtocol.h" +#include "terminal.h" + + + +/* ************************************************************************** */ +/* Local variables */ + +stUartData astUartData[MAX_UART_HANDLE]; + +const char *gUartStrings[MAX_UART_HANDLE] = { "PRINTF" //UART_1 + //,"CU", //UART_2 +// ,"CONSOLE" //UART_3 +}; + +/* ************************************************************************** */ +/* Private function prototypes */ +//void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +//void _mon_write (const char * s, unsigned int count); + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void InitUart(void) +{ + int i; + + InternalUartInit(); + //InitSC16S740(); + + memset(&astUartData,0,sizeof(astUartData)); + + for(i = 0; i < MAX_UART_HANDLE; i++) + { + astUartData[i].iDataPending = 0; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + astUartData[i].pcTxInPtr = &astUartData[i].acTxCircularBuffer[0]; + astUartData[i].pcTxOutPtr = &astUartData[i].acTxCircularBuffer[0]; + //memset(&astUartData[i].acTxCircularBuffer[0],0xDE,UART_MAX_TX_BUFF_SIZE); + + astUartData[i].pcRxInDataPtr = astUartData[i].pcRxOutDataPtr = &astUartData[i].acRxCircularBuffer[0]; + astUartData[i].iNbRxFIFOPendingBytes = 0; + } + + + //This is a physical mapping of the UARTS. + //DO NOT CHANGE assignments unless hardware changed ! + // + astUartData[UART_1].iIsInternal = 1; + astUartData[UART_1].iPhysicalUartPort = INTERNAL_UART_PORT_2; // (232) + +// astUartData[UART_2].iIsInternal = 1; + //astUartData[UART_2].iPhysicalUartPort = INTERNAL_UART_PORT_2; // (232) + +#ifndef NO_EXTERNAL_UART + astUartData[UART_3].iIsInternal = 0; + astUartData[UART_3].iPhysicalUartPort = EXT_UART_1; // (SPI - 232 daughter board) +#endif + + setbuf(stdout,NULL); //to use printf without \r + fflush(stdout); + + UartOpenComPort(NETWORK_UART_PORT,9600,UART_ONE_STOP_BIT,UART_NO_PARITY); //Open console port +#ifdef USE_PRINTF + //UartOpenComPort(CONSOLE_UART_PORT,115200,UART_ONE_STOP_BIT,UART_NO_PARITY); //Open console port + +#endif + +} + +//----------------------------------------------------------------------------- + +int UartResetPort(int p_iUartHandle) +{ + if(p_iUartHandle > MAX_UART_HANDLE) + return 0; + + //reset the port data structures... + astUartData[p_iUartHandle].iDataPending = 0; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcRxInDataPtr = astUartData[p_iUartHandle].pcRxOutDataPtr = &astUartData[p_iUartHandle].acRxCircularBuffer[0]; + astUartData[p_iUartHandle].iNbRxFIFOPendingBytes = 0; + + if(astUartData[UART_1].iIsInternal == 1) + { + switch(astUartData[p_iUartHandle].iPhysicalUartPort) + { + case INTERNAL_UART_PORT_1: + { + ResetUart1(); + break; + } + case INTERNAL_UART_PORT_2: + { + ResetUart2(); + break; + } + default: + break; + } + } + else + { +#ifndef NO_EXTERNAL_UART + switch(astUartData[p_iUartHandle].iPhysicalUartPort) + { + case EXT_UART_1: + { + break; + } + default: + break; + } +#endif + } + + return 1; +} + +//----------------------------------------------------------------------------- +int UartOpenComPort(int p_iUartHandle, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable) +{ + int iStopbits,iParity,iRet; + if(p_iUartHandle >= MAX_UART_HANDLE || p_iUartHandle < 0) + return UART_INVALID_HANDLE; + + if(astUartData[p_iUartHandle].iIsInternal == 1) + { + switch(p_iNbStopBits) + { + case UART_ONE_STOP_BIT: + case UART_ONE_HALF_STOP_BIT: //1˝ stop bits doesn't exist for internal uart + { + iStopbits = INT_UART_ONE_STOP_BIT; + break; + } + case UART_TWO_STOP_BITS: + { + iStopbits = INT_UART_TWO_STOP_BITS; + break; + } + } + + switch(p_iParityEnable) + { + case UART_NO_PARITY: + { + iParity = INT_UART_NO_PARITY; + break; + } + case UART_EVEN_PARITY: + { + iParity = INT_UART_EVEN_PARITY; + break; + } + case UART_ODD_PARTIY: + { + iParity = INT_UART_ODD_PARITY; + break; + } + } + + iRet = OpenInternalPort(astUartData[p_iUartHandle].iPhysicalUartPort, + p_iUartHandle, + &astUartData[p_iUartHandle].acTxCircularBuffer[0], + &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1], + p_iBaudRate, + iStopbits, + iParity); + } +#ifndef NO_EXTERNAL_UART + else + { + switch(p_iNbStopBits) + { + case UART_ONE_STOP_BIT: + { + iStopbits = ONE_STOP_BIT; + break; + } + case UART_ONE_HALF_STOP_BIT: //1˝ stop bits doesn't exist for internal uart + { + iStopbits = ONE_HALF_STOP_BIT; + break; + } + case UART_TWO_STOP_BITS: + { + iStopbits = TWO_STOP_BITS; + break; + } + } + + switch(p_iParityEnable) + { + case UART_NO_PARITY: + { + iParity = NO_PARITY; + break; + } + case UART_EVEN_PARITY: + { + iParity = EVEN_PARITY; + break; + } + case UART_ODD_PARTIY: + { + iParity = ODD_PARITY; + break; + } + } + + iRet = OpenExternalPort(astUartData[p_iUartHandle].iPhysicalUartPort, + p_iUartHandle, + &astUartData[p_iUartHandle].acTxCircularBuffer[0], + &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1], + p_iBaudRate, + iStopbits, + iParity); + } +#endif + + return iRet; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//All the uart callback function assignment must be done here !!! +//This must be changed if hardware changes or if port assignment is changed !!! +// +int UartReceiveData(int p_iUartHandle, char *p_pcBuffer, int p_iSize) +{ + int i; + stUartData *p_stUartDatPtr = &astUartData[p_iUartHandle]; + + if(p_iUartHandle < 0 && p_iUartHandle >= MAX_UART_HANDLE) + { + //TODO: Flag a logic error ! + return 0; + } + + for(i = 0; i < p_iSize; i++) + { + *p_stUartDatPtr->pcRxInDataPtr++ = *p_pcBuffer++; + if(p_stUartDatPtr->pcRxInDataPtr > &p_stUartDatPtr->acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1]) + { + p_stUartDatPtr->pcRxInDataPtr = &p_stUartDatPtr->acRxCircularBuffer[0]; //wrap pointer +// printf("Wrap\n"); + } + } + p_stUartDatPtr->iNbRxFIFOPendingBytes += p_iSize; + + if(p_stUartDatPtr->iNbRxFIFOPendingBytes >= UART_MAX_RX_BUFF_SIZE) + PRINTF("RX FIFO Overflow\n"); + + +/* switch(p_iUartHandle) + { + case UART_0: + { + break; + } + case UART_1: + { + break; + } + case UART_2: + { + break; + } + case UART_3: + { + break; + } + case UART_4: + { + break; + } + case UART_5: + { + break; + } + } */ + return 1; +} + +int UartGetPendingDataSize(int iUartHandle) +{ + stUartData *p_stUartDatPtr = &astUartData[iUartHandle]; + + if(p_stUartDatPtr->pcRxInDataPtr == p_stUartDatPtr->pcRxOutDataPtr) + { + return 0; + } + else if(p_stUartDatPtr->pcRxOutDataPtr < p_stUartDatPtr->pcRxInDataPtr) + { + return(p_stUartDatPtr->pcRxInDataPtr - p_stUartDatPtr->pcRxOutDataPtr); + } + else + { + int size = &p_stUartDatPtr->acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1] - p_stUartDatPtr->pcRxOutDataPtr; + size += p_stUartDatPtr->pcRxInDataPtr - &p_stUartDatPtr->acRxCircularBuffer[0]; + return size; + } +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int UartTransmitData(int p_iUartHandle, char *p_pcBuffer, int p_iSize) +{ + int iRet = 0; + + // Case where OutPtr < InPtr + // * = Available space + // + //Top ---->|---------------| + // | * | + //OutPtr ->| | + // | | + // | (p_pcBuffer) | //Available size = (OutPtr - Top) + (Bottom - InPtr) + // | | + //InPtr -->| | + // | * | + // | * | + //Bottom ->|---------------| + + + // Case where OutPtr > InPtr + // * = Available space + // + //Top ---->|---------------| + // | | + //InPtr -->| | + // | * | + // | * | //available size = OutPtr - InPtr + // | * | + //OutPtr ->| | + // | (p_pcBuffer) | + // | | + //Bottom ->|---------------| + + + //Check if data buffer fits in remaining circular buffer space + if(astUartData[p_iUartHandle].pcTxOutPtr < astUartData[p_iUartHandle].pcTxInPtr) + { + //Calculate remaining buffer space and check if it's enough to fit requested data buffer + if(p_iSize > ((astUartData[p_iUartHandle].pcTxOutPtr - &astUartData[p_iUartHandle].acTxCircularBuffer[0]) + //Outptr - Top + (&astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1] - astUartData[p_iUartHandle].pcTxInPtr))) //Bottom - Inptr + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + return UART_BUFFER_FULL; + } + } + else if(astUartData[p_iUartHandle].pcTxInPtr < astUartData[p_iUartHandle].pcTxOutPtr) + { + //Calculate remaining buffer space and check if it's enough to fit requested data buffer + if(p_iSize > (astUartData[p_iUartHandle].pcTxOutPtr - astUartData[p_iUartHandle].pcTxInPtr)) + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; //Force data pending flag to flush buffer + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + return UART_BUFFER_FULL; + } + } + else //OutPtr = InPtr + { + if(p_iSize > UART_MAX_TX_BUFF_SIZE - 1) //message is too big to fit in buffer !!! + { + //Drop remaining packets, flush buffer + astUartData[p_iUartHandle].iDataPending = 0; //Force data pending flag to flush buffer + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + + return UART_BUFFER_FULL; + } + } + + int i; + + + for(i = 0; i < p_iSize; i++) + { + *astUartData[p_iUartHandle].pcTxInPtr++ = *p_pcBuffer++; //fill circular buffer + + if(astUartData[p_iUartHandle].pcTxInPtr > &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]) //check for wrapping + { + astUartData[p_iUartHandle].pcTxInPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0]; + } + } + + //Now flag pending data for transmission. + astUartData[p_iUartHandle].iDataPending = 1; //The data send will start on next Main loop processing + + + return iRet; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//Some data has been entirely sent +//Move output pointer +// +int DataSentNotification(int p_iUartHandle,int DataSize) +{ + //Check wrapping. + if(astUartData[p_iUartHandle].pcTxOutPtr + DataSize < &astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE]) + { + astUartData[p_iUartHandle].pcTxOutPtr += DataSize; + } + else //Pointer must wrap + { + + //Top ------>|---------------| + // | * | + //Final Pos->| | // Final Pos = Top + * + // | | + // | (buffer) | // DataSize = & + * + // | | // & = Bottom - OutPtr + //OutPtr --->| | // * = DataSize - & + // | & | // FinalPos = Top + (DataSize - (Bottom - OutPtr)) + // | & | + //Bottom --->|---------------| + +// if(p_iUartHandle != PRINTF_UART_PORT) +// printf("Out wrap\r"); + + DataSize -= (&astUartData[p_iUartHandle].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE] - astUartData[p_iUartHandle].pcTxOutPtr); //p_iSize - (Bottom - OutPtr) + + astUartData[p_iUartHandle].pcTxOutPtr = &astUartData[p_iUartHandle].acTxCircularBuffer[0] + DataSize; //Top + new p_iSize + + + } + + //Check if data is pending in buffer + if(astUartData[p_iUartHandle].pcTxOutPtr != astUartData[p_iUartHandle].pcTxInPtr) + { + astUartData[p_iUartHandle].iDataPending = 1; + } + else + { + astUartData[p_iUartHandle].iDataPending = 0; + LORA_MODULE_TX_LED_PIN = LED_OFF; + } + + return UART_OK; +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//Called by main loop. Check if any uart has data pending to be sent +// +int UartTick(void) +{ + int i = 0; + int iRet; + int p_iSize; + char aTempBuffer[UART_MAX_RX_BUFF_SIZE]; + + TickInternalUart(); + + //Send... + + for(i = 0; i < MAX_UART_HANDLE; i++) + { + if(astUartData[i].iDataPending) + { + char *pcTxInPtr = astUartData[i].pcTxInPtr; + //Check remaining data size. + if(astUartData[i].pcTxOutPtr < pcTxInPtr) + { + p_iSize = pcTxInPtr - astUartData[i].pcTxOutPtr; + } + else + { + p_iSize = ((&astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE] - astUartData[i].pcTxOutPtr) + + (pcTxInPtr - &astUartData[i].acTxCircularBuffer[0])); + } + + if(astUartData[i].iIsInternal) //Uart handle mapped to PIC internal uart + { + astUartData[i].iDataPending = 0; + iRet = SendInternalUartData(astUartData[i].pcTxOutPtr, + p_iSize, + astUartData[i].iPhysicalUartPort, + &astUartData[i].acTxCircularBuffer[0], + &astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]); + } + +#ifndef NO_EXTERNAL_UART + else //mapped to external uart + { + astUartData[i].iDataPending = 0; + iRet = SendExternalUartData(astUartData[i].iPhysicalUartPort, astUartData[i].pcTxOutPtr, p_iSize,&astUartData[i].acTxCircularBuffer[0], &astUartData[i].acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE-1]); + } +#endif + + //TODO: manage return values + switch(iRet) + { + case UART_OK: + { + break; + } + case UART_PORT_BUSY: + case UART_BUFFER_FULL: + { + astUartData[i].iDataPending = 1; + break; + } + case UART_PORT_NOT_OPENED: + { + break; + } + } + } + + + //Receive... + + // int iNbPendingData = astUartData[i].iNbRxFIFOPendingBytes; //JFM 2012-09-05 + int iNbPendingData = UartGetPendingDataSize(i); + if(iNbPendingData > 0) + { + int byte; + for(byte = 0; byte < iNbPendingData; byte++) + { + aTempBuffer[byte] = *astUartData[i].pcRxOutDataPtr++; + if(astUartData[i].pcRxOutDataPtr > &astUartData[i].acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE-1]) + astUartData[i].pcRxOutDataPtr = &astUartData[i].acRxCircularBuffer[0]; //wrap pointer + } + astUartData[i].iNbRxFIFOPendingBytes -= iNbPendingData; + + switch(i) + { +// case DRIVE_UART_PORT: +// { +// //printf("drive rx\n"); +// DriveProtocolRxData(aTempBuffer,iNbPendingData); +// break; +// } +// case CU_UART_PORT: +// { +// CUProtocolRxData(aTempBuffer,iNbPendingData); // HCAM 20120918 +// break; +// } + case NETWORK_UART_PORT: + { + //HEARTBEAT_LED_1_TOGGLE_REG = HEARTBEAT_LED_1_TOGGLE_MASK; + //UartTransmitData(CONSOLE_UART_PORT, aTempBuffer, iNbPendingData);//echo received character + int i = 0; + for(i = 0; i< iNbPendingData; i++) + { + ProtocolAnalyzeNewData(aTempBuffer[i]); + //RxTerminalData(aTempBuffer[i]); + } + break; + } + } + } + } + + return UART_OK; +} +//----------------------------------------------------------------------------- +// +// This function is used in the case of a large amount of data to be sent or received +// in a process without going back to main loop. + +void UartBlockAndTick(unsigned int TickCount) +{ + int i; + +// KickWatchdog(); + for(i = 0; i < TickCount; i++) + { + UartTick(); + } +// KickWatchdog(); +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// This function is used in the case of a large amount of data to be sent or received +// in a process without going back to main loop. +int UartBlockUntillBufEmpty(int iUartHandle) +{ + if(iUartHandle >= MAX_UART_HANDLE) + return 0; + +// KickWatchdog(); + while(astUartData[iUartHandle].iDataPending) + { + UartTick(); + } +// KickWatchdog(); + return 1; + +} +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +//Overload the stdio character output routine to redirect printfs +// +//void _mon_putc(char c) +//{ +// KickWatchdog(); + +// U2TXREG = c; +// while (U2STAbits.TRMT==0); + + +//#ifdef USE_BLOCKING_PRINTF +// switch(CONSOLE_UART_PORT) +// { +// case UART_1: //(422) Uart 1B +// { +// if(U1MODEbits.ON == 1) +// { +// U1TXREG = c; +// while (U1STAbits.TRMT==0); +// } +// break; +// } +// case UART_2: //(422) Uart 2A +// { +// if(U2MODEbits.ON == 1) +// { +// U2TXREG = c; +// while (U2STAbits.TRMT==0); +// } +// break; +// } + +// } +//#else +// UartTransmitData(PRINTF_UART_PORT, &c, 1); +//#endif +// UartTransmitData(CONSOLE_UART_PORT, &c, 1); +// Nop(); + +// KickWatchdog(); +//} + +/* +void _mon_write (const char * s, unsigned int count) +{ +#ifdef USE_BLOCKING_PRINTF + int i; + for(i = 0; i < count; i++) + _mon_putc(*s++); +#else + UartTransmitData(UART_10, s, count); +#endif +}*/ + +//EOF + diff --git a/ChaloupeLora.X/Source/Uart.h b/ChaloupeLora.X/Source/Uart.h new file mode 100644 index 0000000..451a08f --- /dev/null +++ b/ChaloupeLora.X/Source/Uart.h @@ -0,0 +1,106 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef UART_H +#define UART_H + +/* ************************************************************************** */ +/* Defines */ +#define UART_MAX_RX_BUFF_SIZE 512 +#define UART_MAX_TX_BUFF_SIZE 1024 + +/* ************************************************************************** */ +/* Type definitions */ +//Handles to the Uart ports as mapped physically on the CU board. +//in comment is the physical port assigned to each handle +// +enum eUartHandles +{ + UART_1, //(232) Uart 1 - Drive + //UART_2, //(232) Uart 2 - CU + //UART_3, // !!!EXTERNAL!!! SPI daughter board... + MAX_UART_HANDLE, + + INVALID_UART_HANDLE = 0xFF +}; + +extern const char *gUartStrings[MAX_UART_HANDLE]; + +enum eUartStopBits +{ + UART_ONE_STOP_BIT, + UART_ONE_HALF_STOP_BIT, + UART_TWO_STOP_BITS +}; +enum eUartParity +{ + UART_NO_PARITY, + UART_EVEN_PARITY, + UART_ODD_PARTIY +}; + +typedef struct +{ + int iIsInternal; + int iPhysicalUartPort; + int iDataPending; //This flag is 0 when : TxPtr == RxPtr OR Uart is transmitting. + + char acTxCircularBuffer[UART_MAX_TX_BUFF_SIZE]; + char *pcTxInPtr; + char *pcTxOutPtr; + char acRxCircularBuffer[UART_MAX_RX_BUFF_SIZE]; + char *pcRxInDataPtr; + char *pcRxOutDataPtr; + int iNbRxFIFOPendingBytes; + + +}stUartData; + +enum eUartReturnValues +{ + UART_OK = 1, + UART_PORT_BUSY, + UART_PORT_NOT_OPENED, + UART_BUFFER_FULL, + UART_INVALID_HANDLE, + UART_INVALID_PORT +}; + +/* ************************************************************************** */ +/* Prototypes */ +int UartTransmitData(int p_iUartHandle, char *p_pcBuffer, int p_iSize); +int UartReceiveData(int p_iUartHandle, char *p_pcBuffer, int p_iSize); +int DataSentNotification(int p_iUartHandle,int p_iDataSize); +void InitUart(void); +int UartOpenComPort(int p_iUartHandle, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable); +int UartTick(void); +void UartBlockAndTick(unsigned int TickCount); +int UartBlockUntillBufEmpty(int iUartHandle); +int UartGetPendingDataSize(int iUartHandle); +int UartResetPort(int p_iUartHandle); + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/Util.c b/ChaloupeLora.X/Source/Util.c new file mode 100644 index 0000000..f84fd93 --- /dev/null +++ b/ChaloupeLora.X/Source/Util.c @@ -0,0 +1,367 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C code file. + +*/ + +/* ************************************************************************** */ +/* ¤Revision: +000 20100616 JFM, + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" +#include "Util.h" +#include +#include +#include "PrintfServer.h" +//#include "Watchdog.h" + +/* ************************************************************************** */ +/* Local variables */ +#ifdef ENABLE_DEBUG_LOG +char acDebugLog[DEBUG_LOG_SIZE][100]; +int iLogIndex = 0; +int iWrapCntr = 0; +#endif + +//void _mon_putc(char c); //override from stdio to redirect stdout + + + +//----------------------------------------------------------------------------- +//void _mon_putc(char c) +//{ +// TelnetPutPrintf(c); +//} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +short SwapEndianShort(short p_sData) +{ + return (((p_sData & 0xFF00) >> 8) | ((p_sData & 0x00FF) << 8)); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int SwapEndianInt(int p_iData) +{ + return (((p_iData & 0xFF000000) >> 24) | ((p_iData & 0x00FF0000) >> 8) | ((p_iData & 0x0000FF00) << 8) | ((p_iData & 0x000000FF) << 24)); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#ifdef ENABLE_DEBUG_LOG +char* GetDebugLogPtr(void) +{ + char *pcPtr; + + if(iLogIndex == DEBUG_LOG_SIZE) + { + iLogIndex = 0; + iWrapCntr++; + } + + memset(&acDebugLog[iLogIndex][0],0,sizeof(acDebugLog[iLogIndex])); + pcPtr = &acDebugLog[iLogIndex][0]; + + iLogIndex++; + + return pcPtr; + +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void ClearDebugLog(void) +{ + int i; + for(i = 0; i < DEBUG_LOG_SIZE; i++) + { + memset(&acDebugLog[i][0],0,sizeof(acDebugLog[i])); + } + + iLogIndex = 0; + iWrapCntr = 0; +} + +#endif + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +int ConvertIntToStrLeadingZero(char* p_pcString, unsigned int p_iChar, int digit) +{ + char temp[8]; + int i=0; + sprintf(temp, "%X", p_iChar); + //itoa(p_cChar,temp,radix); + if(p_iChar < 0xF) + { + for (i=0; i=0; i--) + { + if (i==p_iSize-1) + { + uiValue = p_pcString[i] - 0x30; + } + else + { + for (j=i; j<=p_iSize-2; j++) + uiFactor *= 16; + uiValue += (p_pcString[i] - 0x30) * uiFactor; + } + + } + + } + else if (p_iRadix == 10) + { + for (i=0; i +//#include "socket/include/socket.h" +#include "define.h" +#include "Terminal.h" +#include "driver/include/m2m_periph.h" +#include "ProtocolDefs.h" +#include "BoardCfg.h" +#include "timer.h" +#include "BootloaderProtocol.h" +#include "SPI_Flash.h" +#include "FlashMapping.h" + + +/** IP address of host. */ +uint32 gu32HostIp = 0; + +/** Retry count. */ +uint8 gu8RetryCount = 0; + +/** TCP client socket handlers. */ +static SOCKET tcp_client_socket = -1; +SOCKET TerminalSocket = -1, TerminalServerSocket = -1; +uint8 TerminalRxBuf[1024]; + +#ifdef USE_SYSLOG +SOCKET SyslogSocket = -1, SyslogServerSocket = -1; +uint8 SyslogRxBuf[200]; //Syslog shall not receive much data +#endif + + +SOCKET NetworkSocket = -1, NetworkServerSocket = -1; +uint8 NetworkRxBuf[1024]; + +SOCKET BootloaderSocket = -1, BootloaderServerSocket = -1; +uint8 BootloaderRxBuf[1024]; + +/** Receive buffer definition. */ +static uint8 gau8ReceivedBuffer[MAIN_WIFI_M2M_BUFFER_SIZE] = {0}; + +/** Wi-Fi status variable. */ +static bool gbConnectedWifi = false; + +/** Get host IP status variable. */ +static bool gbHostIpByName = false; + +/** TCP Connection status variable. */ +static bool gbTcpConnection = false; + +/** Server host name. */ +static char server_host_name[] = MAIN_WEATHER_SERVER_NAME; + + +tstrWifiInitParam param; +uint8 mac_addr[6]; +uint8 u8IsMacAddrValid; +struct sockaddr_in addr_in; +uint32 mCurIPAddress; + +tstrM2MIPConfig mModuleIPConfig; + +bool mWiFiInitOK = false; +char mWiFiState = WIFI_MODULE_OFF_STATE; //JFM wifi module is always OFF at boot... + + +/** + * \brief Callback function of IP address. + * + * \param[in] hostName Domain name. + * \param[in] hostIp Server IP. + * + * \return None. + */ +static void resolve_cb(uint8 *hostName, uint32 hostIp) +{ + gu32HostIp = hostIp; + gbHostIpByName = true; + printf("Host IP is %d.%d.%d.%d\r\n", + (int)IPV4_BYTE(hostIp, 0), + (int)IPV4_BYTE(hostIp, 1), + (int)IPV4_BYTE(hostIp, 2), + (int)IPV4_BYTE(hostIp, 3)); + printf("Host Name is %s\r\n", hostName); +} + + + +static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg) +{ + /* Check for socket event on TCP socket. */ + + //if(sock == TerminalSocket) + { + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind->status == 0) + { + if(sock == TerminalServerSocket) + { + listen(TerminalServerSocket, 0); + } + else if(sock == SyslogServerSocket) + { + listen(SyslogServerSocket,0); + } + else if(sock == NetworkServerSocket) + { + listen(NetworkServerSocket,0); + } + else if(sock == BootloaderServerSocket) + { + listen(BootloaderServerSocket,0); + printf("Bootloader server started\n"); + } + } + else + { + printf("Bind Failed\n"); + } + break; + } + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen->status != 0) + { + printf("socket %d listen Failed. Error: %d\n",(int)sock, pstrListen->status); + break; + } + if(sock == SyslogServerSocket) + { + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,1); + } + + break; + } + case SOCKET_MSG_ACCEPT: + { + // New Socket is accepted. + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg *)pvMsg; + if(pstrAccept->sock >= 0) + { + if(sock == TerminalServerSocket) + { + memset(TerminalRxBuf,0,sizeof(TerminalRxBuf)); + // Get the accepted socket. + TerminalSocket = pstrAccept->sock; + recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0); + SendTerminalData("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n",strlen("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n")); + // SendSyslogData("Terminal client connected\n",strlen("Terminal client connected\n")); + printf("Terminal client connected\n"); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); + } + else if(sock == SyslogServerSocket) + { + memset(SyslogRxBuf,0,sizeof(SyslogRxBuf)); + // Get the accepted socket. + SyslogSocket = pstrAccept->sock; + recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1); + SendSyslogData("Syslog Welcome\n",strlen("Syslog Welcome\n")); + } + else if(sock == NetworkServerSocket) + { + memset(NetworkRxBuf,0,sizeof(NetworkRxBuf)); + // Get the accepted socket. + NetworkSocket = pstrAccept->sock; + recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0); + printf("Network client connected\n"); + } + else if(sock == BootloaderServerSocket) + { + memset(BootloaderRxBuf,0,sizeof(BootloaderRxBuf)); + // Get the accepted socket. + BootloaderSocket = pstrAccept->sock; + recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0); + printf("Bootloader client connected\n"); + } + + } + else + { + printf("Socket %d : Accept Failed\n", sock); + } + break; + + } + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRecvMsg = (tstrSocketRecvMsg*)pvMsg; + if((pstrRecvMsg->pu8Buffer != NULL) && (pstrRecvMsg->s16BufferSize > 0)) + { + // Process the received message + if(sock == TerminalSocket) + { + //Fwd data to Terminal... + recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0); + RxTerminalBuf(TerminalRxBuf, pstrRecvMsg->s16BufferSize); + + } + else if(sock == SyslogSocket) + { + //Fwd data to stdin... + recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0); + //Syslog shall ignore data... + } + else if(sock == NetworkSocket) + { + //Fwd data to Network... + recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0); + } + else if(sock == BootloaderSocket) + { + //Fwd data to Network... + + if(recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0) != 0) + { + char toto; + toto = 1; + } + BootloaderProtocolProtocolAnalyzeNewData(pstrRecvMsg->pu8Buffer, pstrRecvMsg->s16BufferSize); + + } + } + else //Socket must be closed. + { + if(sock == TerminalSocket) + { + close(TerminalSocket); + TerminalSocket = -1; + // SendSyslogData("Terminal client disconnected\n",strlen("Terminal client disconnected\n")); + printf("Terminal client disconnected\n"); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + } + else if(sock == SyslogSocket) + { + close(SyslogSocket); + SyslogSocket = -1; + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + } + else if(sock == NetworkSocket) + { + close(NetworkSocket); + NetworkSocket = -1; + printf("Network client disconnected\n"); + } + else if(sock == BootloaderSocket) + { + close(BootloaderSocket); + BootloaderSocket = -1; + printf("Bootloader client disconnected\n"); + BootloaderDeactivateBootloader(); + } + } + break; + } + case SOCKET_MSG_SEND: + { + if(sock == SyslogSocket) + { + + } + } + } + } + +} + +static void set_dev_name_to_mac(uint8 *name, uint8 *mac_addr) +{ + /* Name must be in the format WINC1500_00:00 */ + uint16 len; + +// len = m2m_strlen(name); + if (len >= 5) { + name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f); + name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f); + name[len - 4] = MAIN_HEX2ASCII((mac_addr[4] >> 0) & 0x0f); + name[len - 5] = MAIN_HEX2ASCII((mac_addr[4] >> 4) & 0x0f); + } +} + +/** + * \brief Callback to get the Wi-Fi status update. + * + * \param[in] u8MsgType Type of Wi-Fi notification. + * \param[in] pvMsg A pointer to a buffer containing the notification parameters. + * + * \return None. + */ +static void wifi_cb(uint8 u8MsgType, void *pvMsg) +{ + switch (u8MsgType) { + case M2M_WIFI_RESP_CON_STATE_CHANGED: { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged *)pvMsg; + if (pstrWifiState->u8CurrState == M2M_WIFI_CONNECTED) + { + printf("Wi-Fi connected\r\n"); + +#ifndef USE_STATIC_IP +// m2m_wifi_request_dhcp_client(); +#else + m2m_wifi_set_static_ip(&mModuleIPConfig); + gbConnectedWifi = true; + mCurIPAddress = mModuleIPConfig.u32StaticIP; +#endif + mWiFiState = WIFI_CONNECTED_STATE; + } else if (pstrWifiState->u8CurrState == M2M_WIFI_DISCONNECTED) + { + printf("Wi-Fi disconnected\r\n"); + gbConnectedWifi = false; + mWiFiState = WIFI_DISCONNECTED_STATE; + CloseSockets(); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0); + mCurIPAddress = 0xFFFFFFFF; + } + + break; + } + + case M2M_WIFI_REQ_DHCP_CONF: + { +// mCurIPAddress = *(uin32*)pvMsg; + +// unsigned char ip1,ip2,ip3,ip4; +// ip1 = IPV4_BYTE(pu8IPAddress,0); +// ip2 = IPV4_BYTE(pu8IPAddress,1); +// ip3 = IPV4_BYTE(pu8IPAddress,2); +// ip4 = IPV4_BYTE(pu8IPAddress,3); + + + /* Turn LED0 on to declare that IP address received. */ +// printf("Wi-Fi IP is %u.%u.%u.%u\r\n", pu8IPAddress[0], pu8IPAddress[1], pu8IPAddress[2], pu8IPAddress[3]); + gbConnectedWifi = true; + /* Obtain the IP Address by network name */ + gethostbyname((uint8 *)server_host_name); + break; + } + + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo *)pvMsg; + printf("wifi_cb: M2M_WIFI_RESP_PROVISION_INFO.\r\n"); + + if (pstrProvInfo->u8Status == M2M_SUCCESS) { + m2m_wifi_connect((char *)pstrProvInfo->au8SSID, + strlen((char *)pstrProvInfo->au8SSID), + pstrProvInfo->u8SecType, + pstrProvInfo->au8Password, + M2M_WIFI_CH_ALL); + } else { + printf("wifi_cb: Provision failed.\r\n"); + } + } break; + + default: { + break; + } + } +} + + +int InitWiFi() +{ + tstrWifiInitParam param; + int8_t ret; + + gbTcpConnection = false; + TimerStart(WIFI_RECONNECT_TIMER,1); + mCurIPAddress = 0xFFFFFFFF; + + char IP1,IP2,IP3,IP4,GW1,GW2,GW3,GW4; + + if(SPIFlashIsPresent() == 1) + { + char StoredIPConfig[8]; + if(SPIFlashReadBuffer(StoredIPConfig,8,FLASH_WIFI_IP_ADDRESS) != RET_ERROR) + { + IP1 = StoredIPConfig[0]; + IP2 = StoredIPConfig[1]; + IP3 = StoredIPConfig[2]; + IP4 = StoredIPConfig[3]; + + GW1 = StoredIPConfig[4]; + GW2 = StoredIPConfig[5]; + GW3 = StoredIPConfig[6]; + GW4 = StoredIPConfig[7]; + + if((IP1 == (char)0xFF) && (IP2 == (char)0xFF) && (IP3 == (char)0xFF) && (IP4 == (char)0xFF) || \ + ((GW1 == (char)0xFF && GW2 == (char)0xFF && GW3 == (char)0xFF && GW4 == (char)0xFF))) + { + IP1 = STATIC_IP_ADDRESS_1; + IP2 = STATIC_IP_ADDRESS_2; + IP3 = STATIC_IP_ADDRESS_3; + IP4 = STATIC_IP_ADDRESS_4; + + GW1 = GATEWAY_ADDRESS_1; + GW2 = GATEWAY_ADDRESS_2; + GW3 = GATEWAY_ADDRESS_3; + GW4 = GATEWAY_ADDRESS_4; + } + + } + } + else + { + IP1 = STATIC_IP_ADDRESS_1; + IP2 = STATIC_IP_ADDRESS_2; + IP3 = STATIC_IP_ADDRESS_3; + IP4 = STATIC_IP_ADDRESS_4; + + GW1 = GATEWAY_ADDRESS_1; + GW2 = GATEWAY_ADDRESS_2; + GW3 = GATEWAY_ADDRESS_3; + GW4 = GATEWAY_ADDRESS_4; + } + + + memset(&mModuleIPConfig,0,sizeof(mModuleIPConfig)); +// mModuleIPConfig.u32StaticIP = IP_TO_U32(STATIC_IP_ADDRESS_1,STATIC_IP_ADDRESS_2,STATIC_IP_ADDRESS_3,STATIC_IP_ADDRESS_4); + mModuleIPConfig.u32StaticIP = IP_TO_U32(IP1,IP2,IP3,IP4); + mModuleIPConfig.u32DNS = IP_TO_U32(DEFAULT_DNS_ADD_1,DEFAULT_DNS_ADD_2,DEFAULT_DNS_ADD_3,DEFAULT_DNS_ADD_4); + // mModuleIPConfig.u32AlternateDNS = IP_TO_U32(ALT_DNS_ADD_1,ALT_DNS_ADD_2,ALT_DNS_ADD_3,ALT_DNS_ADD_4); +// mModuleIPConfig.u32Gateway = IP_TO_U32(GATEWAY_ADDRESS_1,GATEWAY_ADDRESS_2,GATEWAY_ADDRESS_3,GATEWAY_ADDRESS_4); + mModuleIPConfig.u32Gateway = IP_TO_U32(GW1,GW2,GW3,GW4); + mModuleIPConfig.u32SubnetMask = IP_TO_U32(SUBNET_MASK_1,SUBNET_MASK_2,SUBNET_MASK_3,SUBNET_MASK_4); + + /* Initialize the BSP. */ +// nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = (void*) &wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) + { + mWiFiInitOK = false; + mWiFiState = WIFI_INIT_ERROR_STATE; + return RET_ERROR; + } + mWiFiInitOK = true; + + mWiFiState = WIFI_DISCONNECTED_STATE; + + socketInit(); + registerSocketCallback(socket_cb, resolve_cb); + + //Get MAC address from the module + m2m_wifi_get_otp_mac_address(mac_addr, &u8IsMacAddrValid); + if (!u8IsMacAddrValid) { + m2m_wifi_set_mac_address(gau8MacAddr); + } + + //Get the working MAC address from driver. + m2m_wifi_get_mac_address(gau8MacAddr); + + //Initialize the human readable MAC address based on the working MAC + set_dev_name_to_mac((uint8 *)gacDeviceName, gau8MacAddr); + + //Use the MAC to define the SSID of the module + set_dev_name_to_mac((uint8 *)gstrM2MAPConfig.au8SSID, gau8MacAddr); + +// m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName)); + +#ifdef USE_STATIC_IP + //Use static ip --> disable dhcp client before connecting + m2m_wifi_enable_dhcp(0); +#endif + if(m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL) != M2M_SUCCESS) + { + //wifi connect error... + printf("error"); + } + + tstrPerphInitParam tst; + + m2m_periph_init(&tst); + + //Set all IOs as inputs except the LED (IO3).. + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO3,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO4,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO15,1); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO16,0); + m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO18,0); + // m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO6,0); + + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO15,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16,0); + m2m_periph_gpio_set_val(M2M_PERIPH_GPIO18,0); + // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO6,0); + + + TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT); + + + // m2m_wifi_start_provision_mode((tstrM2MAPConfig *)&gstrM2MAPConfig, (char *)gacHttpProvDomainName, 1); + // printf("Provision Mode started.\r\nConnect to [%s] via AP[%s] and fill up the page.\r\n", + // MAIN_HTTP_PROV_SERVER_DOMAIN_NAME, + // gstrM2MAPConfig.au8SSID); +} + +int TurnOFFWiFi() +{ + int shit; + + CloseSockets(); + socketDeinit(); + m2m_wifi_disconnect(); + m2m_wifi_deinit(&shit); + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; + mWiFiInitOK = false; + gbConnectedWifi = false; + HEARTBEAT_LED_2_PIN = LED_OFF; + + // WIFI + mWiFiState = WIFI_MODULE_OFF_STATE; + return RET_OK; +} + +int CloseSockets() +{ + gbTcpConnection = false; + close(TerminalServerSocket); + if(TerminalSocket != -1) + { + close(TerminalSocket); + } + + close(NetworkServerSocket); + if(NetworkSocket != -1) + { + close(NetworkSocket); + } + +#ifdef USE_SYSLOG + close(SyslogServerSocket); + if(SyslogSocket != -1) + { + close(SyslogSocket); + } +#endif + + close(BootloaderServerSocket); + if(BootloaderSocket != -1) + { + close(BootloaderSocket); + } +} + + +char GetWiFiSate() +{ + return mWiFiState; +} + +void TickWiFi() +{ + if(mWiFiInitOK == false) + { + return; + } + if(mWiFiState == WIFI_DISCONNECTED_STATE && gbConnectedWifi == false)//we should be connected.. if the timer is expired, retry + { + if(IsTimerExpired(WIFI_RECONNECT_TIMER)) + { + //m2m_wifi_disconnect(); + m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL); + TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT); + } + } + + // if(IsTimerExpired(WIFI_TICK_TIMER)) + // { + m2m_wifi_handle_events(); + // TimerStart(WIFI_TICK_TIMER,1); + // } + + if (gbConnectedWifi && !gbTcpConnection) + { + + + OpenTerminalServer(); + //OpenNetworkServer(); + // OpenBootloaderServer(); + // BootloaderActivateBootloader(); +#ifdef USE_SYSLOG + OpenSyslogServer(); +#endif + gbTcpConnection = true; + } +} + + +//Terminal server implementation + +int OpenTerminalServer() +{ + struct sockaddr_in strAddr; + + TerminalServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 TerminalPort = TERMINAL_SERVER_PORT; + if(TerminalServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(TerminalPort); + strAddr.sin_addr.s_addr = 0; + + bind(TerminalServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendTerminalData(uint8 *data, int size) +{ + if(TerminalSocket != -1) + { + send(TerminalSocket,data,size,0); + recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} +void SentTerminalByte(uint8 data) +{ + if(TerminalSocket != -1) + { + send(TerminalSocket,&data,1,0); + recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} + +int OpenNetworkServer() +{ + struct sockaddr_in strAddr; + + NetworkServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = NETWORK_SERVER_PORT; + if(NetworkServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(NetworkServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendNetworkData(uint8 *data, int size) +{ + if(NetworkSocket != -1) + { + send(NetworkSocket,data,size,0); + recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} +void SentNetworkByte(uint8 data) +{ + if(NetworkSocket != -1) + { + send(NetworkSocket,&data,1,0); + recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0); + } +} + +//Printf Server Implementation +#ifdef USE_SYSLOG +int OpenSyslogServer() +{ + struct sockaddr_in strAddr; + + SyslogServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = SYSLOG_SERVER_PORT; + if(SyslogServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(SyslogServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +void SendSyslogData(uint8 *data, int size) +{ + if(SyslogSocket != -1); + { + send(SyslogSocket,data,size,0); + recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} +void SendSyslogByte(uint8 data) +{ + if(SyslogSocket != -1) + { + send(SyslogSocket,&data,1,0); + recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} + +int IsSyslogClientConnected() +{ + if(SyslogSocket == -1) + { + return 0; + } + + return 1; +} +#endif + +int OpenBootloaderServer() +{ + struct sockaddr_in strAddr; + + BootloaderServerSocket = socket(AF_INET, SOCK_STREAM,0); + uint16 ServerPort = BOOTLOADER_SERVER_PORT; + if(BootloaderServerSocket >= 0) + { + strAddr.sin_family = AF_INET; + strAddr.sin_port = _htons(ServerPort); + strAddr.sin_addr.s_addr = 0; + + bind(BootloaderServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in)); + return RET_OK; + } + else + { + return RET_ERROR; + } +} +int CloseBootloaderServer() +{ + close(BootloaderServerSocket); + BootloaderServerSocket = -1; + if(BootloaderSocket != -1) + { + close(BootloaderSocket); + BootloaderSocket = -1; + } +} +void SendBootloaderData(uint8 *data, int size) +{ + if(BootloaderSocket != -1); + { + send(BootloaderSocket,data,size,0); + recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} +void SendSBootloaderByte(uint8 data) +{ + if(BootloaderSocket != -1) + { + send(BootloaderSocket,&data,1,0); + recv(BootloaderSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0); + } +} + +int IsBootloaderClientConnected() +{ + if(BootloaderSocket == -1) + { + return 0; + } + + return 1; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/WiFiCtrl.h b/ChaloupeLora.X/Source/WiFiCtrl.h new file mode 100644 index 0000000..0ce3d53 --- /dev/null +++ b/ChaloupeLora.X/Source/WiFiCtrl.h @@ -0,0 +1,264 @@ +/* + * File: WiFiCtrl.h + * Author: JF + * + * Created on December 8, 2018, 6:52 AM + */ + +#ifndef WIFICTRL_H +#define WIFICTRL_H + +#include "driver/include/m2m_wifi.h" +#include "socket/include/socket.h" + +/*! +* Used for code portability. +*/ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); + + /*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + + /*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + + /*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; + + + /*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + + /*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + + /*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; + //@} + + + + + + +int InitWiFi(); +void TickWiFi(); +int TurnOFFWiFi(); +int CloseSockets(); +char GetWiFiSate(); + +int OpenTerminalServer(); +void SendTerminalData(uint8 *data, int size); +void SentTerminalByte(uint8 data); + +int OpenNetworkServer(); +void SendNetworkData(uint8 *data, int size); +void SentNetworkByte(uint8 data); + +int OpenSyslogServer(); +void SendSyslogData(uint8 *data, int size); +void SendSyslogByte(uint8 data); +int IsSyslogClientConnected(); + +int OpenBootloaderServer(); +int CloseBootloaderServer(); +void SendBootloaderData(uint8 *data, int size); +void SendBootloaderByte(uint8 data); +int IsBootloaderClientConnected(); + +//#define USE_STATIC_IP + + +// <<< Use Configuration Wizard in Context Menu >>> +// General network settings in AP (access point) mode +// Network SSID +// app_main_m2m_device_name +#ifndef MAIN_M2M_SSID +#define MAIN_M2M_SSID "WINC3400_00:00" +#endif + +// Security type +// <1=> Wi-Fi network is not secured +// <2=> WPA/WPA2 personal(PSK) +// <3=> WEP (40 or 104) OPEN OR SHARED +// <4=> WPA/WPA2 Enterprise.IEEE802.1x +// app_main_m2m_ap_sec +#ifndef MAIN_M2M_AP_SEC +#define MAIN_M2M_AP_SEC 1 +#endif + +// Security key +// app_main_m2m_ap_key +#ifndef MAIN_M2M_AP_KEY +#define MAIN_M2M_AP_KEY "12345FFFFF" +#endif + +// SSID mode +// <0=>SSID is visible to others +// <1=>SSID is hidden +// app_main_m2m_ap_ssid_mode +#ifndef MAIN_M2M_AP_SSID_MODE +#define MAIN_M2M_AP_SSID_MODE 0 +#endif +// +// DHCP server IP address in AP (access point) mode +// DHCP server IP address 1 <0-255> +// app_ip_address_1 +#ifndef DHCP_IP_ADDRESS_1 +#define DHCP_IP_ADDRESS_1 192 +#endif + +// DHCP server IP address 2 <0-255> +// app_ip_address_2 +#ifndef DHCP_IP_ADDRESS_2 +#define DHCP_IP_ADDRESS_2 168 +#endif + +// DHCP server IP address 3 <0-255> +// app_ip_address_3 +#ifndef DHCP_IP_ADDRESS_3 +#define DHCP_IP_ADDRESS_3 50 +#endif + +// DHCP server IP address 4 <0-255> +// app_ip_address_4 +#ifndef DHCP_IP_ADDRESS_4 +#define DHCP_IP_ADDRESS_4 1 +#endif +// +// <<< end of configuration section >>> + +//Acces Point settings +#define HOME_AP_SEC_TYPE M2M_WIFI_SEC_WPA_PSK +//#define HOME_AP_NAME "ImprVEmard" +//#define HOME_AP_PWD "12345fffff" + +#define HOME_AP_NAME "ChaletVilleEmard" +//#define HOME_AP_NAME "ElRouteurDuChalet" +//#define HOME_AP_NAME "LeChalet" +#define HOME_AP_PWD "Evinrude30" + +#define TERMINAL_SERVER_PORT 85 +#define NETWORK_SERVER_PORT 86 +#define SYSLOG_SERVER_PORT 87 +#define BOOTLOADER_SERVER_PORT 99 + +#define AUTH_CREDENTIALS {M2M_802_1X_USR_NAME, M2M_802_1X_PWD } + +//Module Static IP settings +#define STATIC_IP_ADDRESS_1 192 +#define STATIC_IP_ADDRESS_2 168 +#define STATIC_IP_ADDRESS_3 30 +#define STATIC_IP_ADDRESS_4 127 + +#define GATEWAY_ADDRESS_1 192 +#define GATEWAY_ADDRESS_2 168 +#define GATEWAY_ADDRESS_3 30 +#define GATEWAY_ADDRESS_4 1 + +#define DEFAULT_DNS_ADD_1 8 +#define DEFAULT_DNS_ADD_2 8 +#define DEFAULT_DNS_ADD_3 8 +#define DEFAULT_DNS_ADD_4 8 + +#define ALT_DNS_ADD_1 8 +#define ALT_DNS_ADD_2 8 +#define ALT_DNS_ADD_3 4 +#define ALT_DNS_ADD_4 4 + +#define SUBNET_MASK_1 255 +#define SUBNET_MASK_2 255 +#define SUBNET_MASK_3 255 +#define SUBNET_MASK_4 0 + +#define IP_TO_U32(add1,add2,add3,add4) (((add4<<24)&0xFF000000) | ((add3<<16)&0x00FF0000) | ((add2<<8)&0x0000FF00) | (add1&0x000000FF)) + +/** Using broadcast address for simplicity. */ +#define MAIN_SERVER_PORT (80) + +/** Using IP address. */ +#define IPV4_BYTE(val, index) ((val >> (index * 8)) & 0xFF) + +/** Send buffer of TCP socket. */ +#define MAIN_PREFIX_BUFFER "GET /data/2.5/weather?q=" +#define MAIN_POST_BUFFER \ + "&mode=xml&units=metric&appid=c592e14137c3471fa9627b44f6649db4 HTTP/1.1\r\nHost: " \ + "api.openweathermap.org\r\nAccept: */*\r\n\r\n" +/** Weather information provider server. */ +#define MAIN_WEATHER_SERVER_NAME "openweathermap.org" + +/** Input City Name. */ +#define MAIN_CITY_NAME "london" + +/** Receive buffer size. */ +#define MAIN_WIFI_M2M_BUFFER_SIZE 1024 + +#define MAIN_M2M_DHCP_SERVER_IP \ + { \ + DHCP_IP_ADDRESS_1, DHCP_IP_ADDRESS_2, DHCP_IP_ADDRESS_3, DHCP_IP_ADDRESS_4 \ + } +#define MAIN_HTTP_PROV_SERVER_DOMAIN_NAME "JF.com" + +#define MAIN_MAC_ADDRESS \ + { \ + 0xf8, 0xf0, 0x05, 0x45, 0xD4, 0x84 \ + } + +#define MAIN_HEX2ASCII(x) (((x) >= 10) ? (((x)-10) + 'A') : ((x) + '0')) + +#define TEMPERATURE_ABS(a) (((a) > 0) ? (a) : -(a)) + +static tstrM2MAPConfig gstrM2MAPConfig = {MAIN_M2M_SSID, + 1, + 0, + sizeof(MAIN_M2M_AP_KEY) - 1, + MAIN_M2M_AP_KEY, + MAIN_M2M_AP_SEC, + MAIN_M2M_AP_SSID_MODE, + MAIN_M2M_DHCP_SERVER_IP}; + +static const char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; + +static uint8 gau8MacAddr[] = MAIN_MAC_ADDRESS; +static sint8 gacDeviceName[] = MAIN_M2M_SSID; + +#define MAIN_WAITING_TIME 3000 +#define MAIN_RETRY_COUNT 10 + +extern SOCKET TerminalSocket; + + +#endif /* WIFICTRL_H */ + diff --git a/ChaloupeLora.X/Source/checksum.h b/ChaloupeLora.X/Source/checksum.h new file mode 100644 index 0000000..37d4110 --- /dev/null +++ b/ChaloupeLora.X/Source/checksum.h @@ -0,0 +1,94 @@ +/* + * Library: libcrc + * File: include/checksum.h + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Description + * ----------- + * The headerfile include/checksum.h contains the definitions and prototypes + * for routines that can be used to calculate several kinds of checksums. + */ + +#ifndef DEF_LIBCRC_CHECKSUM_H +#define DEF_LIBCRC_CHECKSUM_H + +#include + +/* + * #define CRC_POLY_xxxx + * + * The constants of the form CRC_POLY_xxxx define the polynomials for some well + * known CRC calculations. + */ + +#define CRC_POLY_16 0xA001 +#define CRC_POLY_32 0xEDB88320L +#define CRC_POLY_CCITT 0x1021 +#define CRC_POLY_DNP 0xA6BC +#define CRC_POLY_KERMIT 0x8408 +#define CRC_POLY_SICK 0x8005 + +/* + * #define CRC_START_xxxx + * + * The constants of the form CRC_START_xxxx define the values that are used for + * initialization of a CRC value for common used calculation methods. + */ + +#define CRC_START_8 0x00 +#define CRC_START_16 0x0000 +#define CRC_START_MODBUS 0xFFFF +#define CRC_START_XMODEM 0x0000 +#define CRC_START_CCITT_1D0F 0x1D0F +#define CRC_START_CCITT_FFFF 0xFFFF +#define CRC_START_KERMIT 0x0000 +#define CRC_START_SICK 0x0000 +#define CRC_START_DNP 0x0000 +#define CRC_START_32 0xFFFFFFFFL + +/* + * Prototype list of global functions + */ + +unsigned char * checksum_NMEA( const unsigned char *input_str, unsigned char *result ); +uint8_t crc_8( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_16( const unsigned char *input_str, size_t num_bytes ); +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_1d0f( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_ccitt_ffff( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_dnp( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_kermit( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_modbus( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_sick( const unsigned char *input_str, size_t num_bytes ); +uint16_t crc_xmodem( const unsigned char *input_str, size_t num_bytes ); +uint8_t update_crc_8( uint8_t crc, unsigned char c ); +uint16_t update_crc_16( uint16_t crc, unsigned char c ); +uint32_t update_crc_32( uint32_t crc, unsigned char c ); +uint16_t update_crc_ccitt( uint16_t crc, unsigned char c ); +uint16_t update_crc_dnp( uint16_t crc, unsigned char c ); +uint16_t update_crc_kermit( uint16_t crc, unsigned char c ); +uint16_t update_crc_sick( uint16_t crc, unsigned char c, unsigned char prev_byte ); + +#endif // DEF_LIBCRC_CHECKSUM_H diff --git a/ChaloupeLora.X/Source/crc32.c b/ChaloupeLora.X/Source/crc32.c new file mode 100644 index 0000000..3a0f007 --- /dev/null +++ b/ChaloupeLora.X/Source/crc32.c @@ -0,0 +1,131 @@ +/* + * Library: libcrc + * File: src/crc32.c + * Author: Lammert Bies + * + * This file is licensed under the MIT License as stated below + * + * Copyright (c) 1999-2016 Lammert Bies + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Description + * ----------- + * The source file src/crc32.c contains the routines which are needed to + * calculate a 32 bit CRC value of a sequence of bytes. + */ + +#include +#include +#include "checksum.h" + +static void init_crc32_tab( void ); + +static bool crc_tab32_init = false; +static uint32_t crc_tab32[256]; + +/* + * uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ); + * + * The function crc_32() calculates in one pass the common 32 bit CRC value for + * a byte string that is passed to the function together with a parameter + * indicating the length. + */ + +uint32_t crc_32( const unsigned char *input_str, size_t num_bytes ) { + + uint32_t crc; + uint32_t tmp; + uint32_t long_c; + const unsigned char *ptr; + size_t a; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + crc = CRC_START_32; + ptr = input_str; + + if ( ptr != NULL ) for (a=0; a> 8) ^ crc_tab32[ tmp & 0xff ]; + + ptr++; + } + + crc ^= 0xffffffffL; + + return crc & 0xffffffffL; + +} /* crc_32 */ + +/* + * uint32_t update_crc_32( uint32_t crc, unsigned char c ); + * + * The function update_crc_32() calculates a new CRC-32 value based on the + * previous value of the CRC and the next byte of the data to be checked. + */ + +uint32_t update_crc_32( uint32_t crc, unsigned char c ) { + + uint32_t tmp; + uint32_t long_c; + + long_c = 0x000000ffL & (uint32_t) c; + + if ( ! crc_tab32_init ) init_crc32_tab(); + + tmp = crc ^ long_c; + crc = (crc >> 8) ^ crc_tab32[ tmp & 0xff ]; + + return crc & 0xffffffffL;; + +} /* update_crc_32 */ + +/* + * static void init_crc32_tab( void ); + * + * For optimal speed, the CRC32 calculation uses a table with pre-calculated + * bit patterns which are used in the XOR operations in the program. This table + * is generated once, the first time the CRC update routine is called. + */ + +static void init_crc32_tab( void ) { + + uint32_t i; + uint32_t j; + uint32_t crc; + + for (i=0; i<256; i++) { + + crc = i; + + for (j=0; j<8; j++) { + + if ( crc & 0x00000001L ) crc = ( crc >> 1 ) ^ CRC_POLY_32; + else crc = crc >> 1; + } + + crc_tab32[i] = crc; + } + + crc_tab32_init = true; + +} /* init_crc32_tab */ diff --git a/ChaloupeLora.X/Source/define.h b/ChaloupeLora.X/Source/define.h new file mode 100644 index 0000000..644168b --- /dev/null +++ b/ChaloupeLora.X/Source/define.h @@ -0,0 +1,253 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* ¤Revision: +000 20100616 HCAM, + Original version. + + + ,----.. ,----.. + / / \ / / \ ,--, + | : : __ ,-. ,---. | : : ,--.'| ,---, + . | ;. / ,' ,'/ /| ' ,'\ .--.--. . | ;. / | |, ,-+-. / | + . ; /--` ' | |' | / / | / / ' . ; /--` `--'_ ,--.'|' | + ; | ; __ | | ,'. ; ,. :| : /`./ ; | ; __ ,' ,'| | | ,"' | + | : |.' .'' : / ' | |: :| : ;_ | : |.' .'' | | | | / | | + . | '_.' :| | ' ' | .; : \ \ `. . | '_.' :| | : | | | | | + ' ; : \ |; : | | : | `----. \ ' ; : \ |' : |__ | | | |/ + ' | '/ .'| , ; \ \ / / /`--' / ' | '/ .'| | '.'|| | |--' + | : / ---' `----' '--'. / | : / ; : ;| |/ + \ \ .' `--'---' \ \ .' | , / '---' + `---` `---` ---`-' + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + + + + + /****************************** NOTES *************************************** +-> Timers assignment <- + +- Timer1 used by TCP Stack (tick.c) +- Timer2 used by general timer module (timer.c) (see GP_TIMER_USE_TIMER_X definition below) + - timer3 used by input capture to detect PWM + - timer4 used by hall acquisition module (HallAcquisition.c) + - timer5 used by FPGAInterface to time-base SPI the transfer to the FPGA + + + -> Interrupt priority assignment <- + + Priority.SubPriority - Assignment +HIGHEST + 7.3 + 7.2 + 7.1 + 7.0 + 6.3 + 6.2 + 6.1 + 6.0 + 5.3 + 5.2 + 5.1 + 5.0 + 4.3 + 4.2 + 4.1 + 4.0 + 3.3 + 3.2 + 3.1 + 3.0 - Wifi chip IRQ (Ext INT 0) + 2.3 - TIMER2 (General purpose timer) + 2.2 + 2.1 - Ext Interrupt 1 (Led dimming knob) NOT USED!!! + 1.0 + 1.3 + 1.2 + 1.1 + 1.0 +LOWEST + + *****************************************************************************/ + +#ifndef DEFINE_H +#define DEFINE_H + +/* ************************************************************************** */ +/* Includes */ +#include + +//#include "CUHelperFcns.h" + +enum eWiFiState +{ + WIFI_MODULE_OFF_STATE = 0, + WIFI_CONNECTED_STATE, + WIFI_DISCONNECTED_STATE, + WIFI_INIT_ERROR_STATE, + WIFI_UNKNOWN_STATE +}; + +#define WIFI_MODULE_SPI_BAUDRATE 15000000 + +#define WIFI_CONNECT_TIMEOUT 10000 //The delay we allow the module to establish a connection. + +/* ************************************************************************** */ +/* Defines */ + +#define PIN_INPUT 1 +#define PIN_OUTPUT 0 +#define LED_ON 0 +#define LED_OFF 1 +#define false 0 +#define true 1 +#define MSB8(x) ((x >> 8) & 0xFF) +#define LSB8(x) (x & 0xFF) + +#define RET_OK true +#define RET_ERROR false + +#define bool unsigned int + +#define PI 3.1415926536 + +//#define ENABLE_DEBUG_LOG +#ifdef ENABLE_DEBUG_LOG + #include "util.h" +#endif + +////#define USE_HALL_ACQ_SIMULATOR //Use this switch for development to test hall acquisition traces +//#define USE_ENGINEERING_MODE //Use this switch to disable speed, position and halls traces and traces buffer allocation (all traces !) +////#define USE_TRACE_SIMULATOR //Use this switch to simulate trace data for development +////#define USE_SPI_DONGLE_SIMULATOR //Use this switch if you use the CUMUX as a SPI dongle instead of the CS16IS74 dongle. +////#define USE_PMP_AUTOINCREMENT //Use to speed-up AD2S data transfer +////#define USE_PWM_DETECTION //Use PWM detection to enable/disable bridge +////#define USE_AUTO_BRIDGE_CONTROL //Execute drive bridge control +////#define FORCE_BRIDGE_ON +////#define DRIVE_BOARD_NOT_INSTALLED +//#define DISABLE_PRINT_FAULT +//#define SPI_FAST +////#define USE_DMA_WITH_PMP +////#define USE_RESOLVER_STATEMACHINE +////#define DISABLE_DRIVE_PARAM_MGMT // uncomment to avoid setting the drive at power-up +#define NO_EXTERNAL_UART + +//Choose which timer to use for general purpose timer +#define GP_TIMER_USE_TIMER_1 + + +//#define POLL_UART1_RX +//#define POLL_UART2_RX + + +//#define NO_WIFI + +//Define the com port assignations +//---------------------------- +#define NETWORK_UART_PORT UART_1 + +#ifndef NO_WIFI +#define WIFI_MODULE_UART_PORT UART_2 +#endif + +// +//---------------------------- +//Enable only one of those 3 options +//#define USE_BLOCKING_PRINTF +//#define USE_UART_PRINTF +#define USE_SYSLOG + +#ifdef USE_UART_PRINTF +#ifdef USE_SYSLOG +#error "USE_UART_PRINTF and USE_SYSLOG defined simultaneously" +#endif +#endif +//#error test + +#ifdef USE_SYSLOG +#ifdef NO_WIFI +#undef USE_SYSLOG +#error "USE_SYSLOG defined with NO_WIFI" +#endif +#endif + +#ifdef USE_UART_PRINTF + #define PRINTF(n, a...) printf(n, ## a) +#elif defined USE_SYSLOG + #define PRINTF(n, a...) printf(n, ## a) +#else + #define PRINTF(n, a...) +#endif + +#ifndef NO_WIFI + // #define USE_WIFI_PRINTF +#endif + + //#define USE_UART_PRINTF +//#else +// +// #define NO_EXTERNAL_UART +//#endif + +//#define CONNECT_DEVICE_TO_NETWORK +//#define TERMINAL_USE_TELNET +//#define TERMINAL_USE_TCP_SERVER + + +/* ************************************************************************** */ +/* Type definitions */ + + +//----- STDINT.H TYPE DEFINITIONS ----- +//(Valid for XC16 & XC32 microchip PIC compilers) +#ifndef uint8_t +typedef unsigned char uint8_t; +#endif + +#ifndef int8_t +typedef signed char int8_t; +#endif + +#ifndef uint16_t +typedef unsigned short uint16_t; +#endif + +#ifndef int16_t +typedef signed short int16_t; +#endif + +/* +#ifndef uint32_t +typedef unsigned long uint32_t; +#endif + +#ifndef int32_t +typedef signed long int32_t; +#endif +*/ + +#ifndef uint64_t +typedef unsigned long long uint64_t; +#endif + +#ifndef int64_t +typedef signed long long int64_t; +#endif + + + + + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/define_WITT.h b/ChaloupeLora.X/Source/define_WITT.h new file mode 100644 index 0000000..346b03f --- /dev/null +++ b/ChaloupeLora.X/Source/define_WITT.h @@ -0,0 +1,168 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* ¤Revision: +000 20100616 HCAM, + Original version. + + + ,----.. ,----.. + / / \ / / \ ,--, + | : : __ ,-. ,---. | : : ,--.'| ,---, + . | ;. / ,' ,'/ /| ' ,'\ .--.--. . | ;. / | |, ,-+-. / | + . ; /--` ' | |' | / / | / / ' . ; /--` `--'_ ,--.'|' | + ; | ; __ | | ,'. ; ,. :| : /`./ ; | ; __ ,' ,'| | | ,"' | + | : |.' .'' : / ' | |: :| : ;_ | : |.' .'' | | | | / | | + . | '_.' :| | ' ' | .; : \ \ `. . | '_.' :| | : | | | | | + ' ; : \ |; : | | : | `----. \ ' ; : \ |' : |__ | | | |/ + ' | '/ .'| , ; \ \ / / /`--' / ' | '/ .'| | '.'|| | |--' + | : / ---' `----' '--'. / | : / ; : ;| |/ + \ \ .' `--'---' \ \ .' | , / '---' + `---` `---` ---`-' + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + + + + + /****************************** NOTES *************************************** + -> Timers assignment <- + + - Timer1 used by general timer module (timer.c) + - Timer2 used by time based Resolver data acquisition module (resolver.c) + - timer3 used by input capture to detect PWM + - timer4 used by hall acquisition module (HallAcquisition.c) + - timer5 used by FPGAInterface to time-base SPI the transfer to the FPGA + + + -> Interrupt priority assignment <- + + Priority.SubPriority - Assignment +HIGHEST + 7.3 + 7.2 + 7.1 - UART1 + 7.0 - UART2 + 6.3 - TIMER2 (Resolver acquisition & halls computation) + 6.2 - PMP + 6.1 + 6.0 - Input Capture + 5.3 - ADC + 5.2 - SPI + 5.1 + 5.0 + 4.3 - Drive Enable pin interrupt + 4.2 - AD2S DOS Pin + 4.1 - AD2S LOT Pin + 4.0 + 3.3 + 3.2 + 3.1 + 3.0 - TIMER5 (FPGA TX) + 2.3 - TIMER1 (General purpose timer) + 2.2 - TIMER3 (PWM Detection) + 2.1 + 1.0 + 1.3 + 1.2 + 1.1 + 1.0 +LOWEST + + *****************************************************************************/ + +#ifndef DEFINE_H +#define DEFINE_H + +/* ************************************************************************** */ +/* Includes */ +#include +//#include "CUHelperFcns.h" + +/* ************************************************************************** */ +/* Defines */ +#define SYS_FREQ (77824000L) //Clock period = 12.85 ns +#define PERIPHERAL_FREQ (77824000L) +#define PIN_INPUT 1 +#define PIN_OUTPUT 0 +#define LED_ON 0 +#define LED_OFF 1 +#define false 0 +#define true 1 +#define MSB8(x) ((x >> 8) & 0xFF) +#define LSB8(x) (x & 0xFF) + +#define PI 3.1415926536 + +//#define ENABLE_DEBUG_LOG +#ifdef ENABLE_DEBUG_LOG + #include "util.h" +#endif + +//#define USE_HALL_ACQ_SIMULATOR //Use this switch for development to test hall acquisition traces +#define USE_ENGINEERING_MODE //Use this switch to disable speed, position and halls traces and traces buffer allocation (all traces !) +//#define USE_TRACE_SIMULATOR //Use this switch to simulate trace data for development +//#define USE_SPI_DONGLE_SIMULATOR //Use this switch if you use the CUMUX as a SPI dongle instead of the CS16IS74 dongle. +//#define USE_PMP_AUTOINCREMENT //Use to speed-up AD2S data transfer +#define USE_PWM_DETECTION //Use PWM detection to enable/disable bridge +#define USE_AUTO_BRIDGE_CONTROL //Execute drive bridge control +//#define FORCE_BRIDGE_ON +//#define DRIVE_BOARD_NOT_INSTALLED +#define DISABLE_PRINT_FAULT +#define SPI_FAST +//#define USE_DMA_WITH_PMP +//#define USE_RESOLVER_STATEMACHINE +//#define DISABLE_DRIVE_PARAM_MGMT // uncomment to avoid setting the drive at power-up + +#define POLL_UART1_RX +#define POLL_UART2_RX + +// Uncomment next #define for testing with ICCA board +// #define USE_ICCA_CU_PA_UART_SNOOPING + + +//Define the com port assignations +//---------------------------- +#define DRIVE_UART_PORT UART_1 +#ifdef USE_ICCA_CU_PA_UART_SNOOPING + // Note: With this configuration there is no CU command going to the PA + #define CU_UART_PORT UART_3 + #define CONSOLE_UART_PORT UART_2 +#else + // Normal setting using PA SPI for UART_3 (CONSOLE_UART_PORT) + #define CU_UART_PORT UART_2 + #define CONSOLE_UART_PORT UART_3 +#endif + +#define ACTUATOR_WITTENSTEIN +//#define ACTUATOR_DS50 + +// +//---------------------------- +//#define USE_BLOCKING_PRINTF +#define USE_PRINTF + +#ifdef USE_PRINTF + #define PRINTF(n, a...) printf(n, ## a) +#else + #define PRINTF(n, a...) + #define NO_EXTERNAL_UART +#endif + + +/* ************************************************************************** */ +/* Type definitions */ +typedef int bool; + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/exceptions.c b/ChaloupeLora.X/Source/exceptions.c new file mode 100644 index 0000000..50f62af --- /dev/null +++ b/ChaloupeLora.X/Source/exceptions.c @@ -0,0 +1,129 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ + +/******************************************************************************/ +/* Exception Macro Definitions */ +/******************************************************************************/ + +/*When WRITE_EXCEPTION_CAUSE_TO_FLASH is defined the PIC32 executes a self +write routine to save the exception cause register.*/ + +/* #define WRITE_EXCEPTION_CAUSE_TO_FLASH */ + +#ifdef WRITE_EXCEPTION_CAUSE_TO_FLASH + +/* Physical Addresses which are at the end of KSEG 0 program memory. */ +/* User may want to adjust these values */ +#define EXCEPTION_CAUSE 0x1D007FFC +#define EXCEPTION_ADDR 0x1D007FF8 + +#endif + +/******************************************************************************/ +/* Exception Variable Declaration */ +/******************************************************************************/ + +/* static in case exception condition would stop auto variable being created */ +static enum { + EXCEP_IRQ = 0, /* interrupt */ + EXCEP_AdEL = 4, /* address error exception (load or ifetch) */ + EXCEP_AdES, /* address error exception (store) */ + EXCEP_IBE, /* bus error (ifetch) */ + EXCEP_DBE, /* bus error (load/store) */ + EXCEP_Sys, /* syscall */ + EXCEP_Bp, /* breakpoint */ + EXCEP_RI, /* reserved instruction */ + EXCEP_CpU, /* coprocessor unusable */ + EXCEP_Overflow, /* arithmetic overflow */ + EXCEP_Trap, /* trap (possible divide by zero) */ + EXCEP_IS1 = 16, /* implementation specfic 1 */ + EXCEP_CEU, /* CorExtend Unuseable */ + EXCEP_C2E /* coprocessor 2 */ +} _excep_code; + +/* static in case exception condition would stop auto variable being created */ +static unsigned int _epc_code; +static unsigned int _excep_addr; + +/******************************************************************************/ +/* Exception Handling */ +/******************************************************************************/ + +/* This function overrides the normal _weak_ _generic_exception_handler which +is defined in the C32 User's Guide. The _weak_ _generic_exception_handler +just does an infinite loop. */ +void _general_exception_handler(void) +{ + unsigned long t0 = _CP0_GET_COUNT(); /* Used for NVMOP 6 us Delay */ + + /* Mask off Mask of the ExcCode Field from the Cause Register + Refer to the MIPs M4K Software User's manual */ + _excep_code=_CP0_GET_CAUSE() & 0x0000007C >> 2; + _excep_addr=_CP0_GET_EPC(); + + _CP0_SET_STATUS(_CP0_GET_STATUS()&0xFFFFFFE); /* Disable Interrupts */ + +#ifdef WRITE_EXCEPTION_CAUSE_TO_FLASH + + /* Store the exception causes in program memory in case the part exhibited + the problem in release mode. Gives user a place to start debugging + the problem. */ + + NVMCON = 0x4001; /* set WREN and Word Programing mode */ + NVMADDR = EXCEPTION_CAUSE; /* PM Address at which we'll store the */ + /* cause register */ + NVMDATA = _excep_code; + + /* wait at least 6 us for LVD start-up + assume we're running at max frequency + (80 MHz) so we're always safe */ + { + while (_CP0_GET_COUNT() - t0 < (80/2)*6); + } + + NVMKEY = 0xAA996655; + NVMKEY = 0x556699AA; /* unlock sequence */ + NVMCONSET = NVMCON_WR; + while(NVMCON & NVMCON_WR); /* wait on write to finish */ + + NVMCON = 0x4001; /* set WREN and Word Programing mode */ + NVMADDR = EXCEPTION_ADDR; /* PM Address at which we'll store the */ + /* exception address register */ + NVMDATA = _excep_addr; + + /* wait at least 6 us for LVD start-up + assume we're running at max frequency + (80 MHz) so we're always safe */ + { + while (_CP0_GET_COUNT() - t0 < (80/2)*6); + } + + NVMKEY = 0xAA996655; + NVMKEY = 0x556699AA; /* unlock sequence */ + NVMCONSET = NVMCON_WR; + while(NVMCON & NVMCON_WR); + + /* Write the exception cause and address to the part can be read and + the cause determined. */ + NVMWriteWord((void*)EXCEPTION_CAUSE, _excep_code); + NVMWriteWord((void*)EXCEPTION_ADDR, _excep_addr); + +#endif + + + while (1) + { + /* Examine _excep_code to identify the type of exception */ + /* Examine _excep_addr to find the address that caused the exception */ + Nop(); + Nop(); + Nop(); + SoftReset(); + Nop(); + } +} diff --git a/ChaloupeLora.X/Source/hd44780.c b/ChaloupeLora.X/Source/hd44780.c new file mode 100644 index 0000000..486596c --- /dev/null +++ b/ChaloupeLora.X/Source/hd44780.c @@ -0,0 +1,649 @@ +/** + * ---------------------------------------------------------------+ + * @desc HD44780 LCD Driver + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 18.11.2020 + * @file hd44780.c + * @tested AVR Atmega16a + * + * @depend hd44780.h + * ---------------------------------------------------------------+ + * @usage default set 16x2 LCD + * 4-bit with 3 control wires (RW, RS, E) + */ + +// include libraries +#include +//#include +//#include +#include "hd44780.h" +#include "timer.h" + +// +---------------------------+ +// | Power on | +// | Wait for more than 15 ms | // 15 ms wait +// | after VCC rises to 4.5 V | +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | +// | 0 0 0 0 1 1 | // Initial sequence 0x30 +// | Wait for more than 4.1 ms | // 4.1 ms us writing DATA into DDRAM or CGRAM +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | +// | 0 0 0 0 1 1 | // Initial sequence 0x30 +// | Wait for more than 0.1 ms | // 100 us writing DATA into DDRAM or CGRAM +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Initial sequence 0x30 +// | 0 0 0 0 1 1 | // 37 us writing DATA into DDRAM or CGRAM 4 us tadd - time after busy flag disapeared +// | Wait for more than 45 us | // 37 us + 4 us = 41 us * (270/250) = 45us +// +---------------------------+ +// | +// +---------------------------+ // 4bit mode 0x20 !!! MUST BE SET TIME, BF CHECK DOESN'T WORK CORRECTLY !!! +// | RS R/W DB7 DB6 DB5 DB4 | // +// | 0 0 0 0 1 0 | // 37 us writing DATA into DDRAM or CGRAM 4 us tadd - time after busy flag disapeared +// | Wait for more than 45 us | // !!! MUST BE SET DELAY TIME, BUSY FLAG CHECK DOESN'T WORK CORRECTLY !!! +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Display off 0x08 +// | 0 0 0 0 1 0 | // +// | 0 0 1 0 0 0 | // +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Display clear 0x01 +// | 0 0 0 0 0 0 | // +// | 0 0 0 0 0 1 | // +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ +// | +// +---------------------------+ +// | RS R/W DB7 DB6 DB5 DB4 | // Entry mode set 0x06 +// | 0 0 0 0 0 0 | // +// | 0 0 0 1 1 0 | // shift cursor to the left, without text shifting +// | Wait for BF Cleared | // Wait for BF Cleared +// +---------------------------+ + +/** + * @desc LCD display clear + * + * @param void + * + * @return void + */ +void HD44780_DisplayClear (void) +{ + // Diplay clear + HD44780_SendInstruction(HD44780_DISP_CLEAR); +} + +/** + * @desc LCD display on + * + * @param void + * + * @return void + */ +void HD44780_DisplayOn (void) +{ + // send instruction - display on + HD44780_SendInstruction(HD44780_DISP_ON); +} + +/** + * @desc LCD cursor on, display on + * + * @param void + * + * @return void + */ +void HD44780_CursorOn (void) +{ + // send instruction - cursor on + HD44780_SendInstruction(HD44780_CURSOR_ON); +} + +/** + * @desc LCD cursor off + * + * @param void + * + * @return void + */ +void HD44780_CursorOff (void) +{ + // send instruction - cursor on + HD44780_SendInstruction(HD44780_CURSOR_OFF); +} + +/** + * @desc LCD cursor blink, cursor on, display on + * + * @param void + * + * @return void + */ +void HD44780_CursorBlink (void) +{ + // send instruction - Cursor blink + HD44780_SendInstruction(HD44780_CURSOR_BLINK); +} + +/** + * @desc LCD draw char + * + * @param char + * + * @return void + */ +void HD44780_DrawChar (char character) +{ + // Diplay clear + HD44780_SendData(character); +} + +/** + * @desc LCD draw string + * + * @param char * + * + * @return void + */ +void HD44780_DrawString (char *str) +{ + unsigned char i = 0; + // loop through 5 bytes + while (str[i] != '\0') { + //read characters and increment index + HD44780_SendData(str[i++]); + } +} + +/** + * @desc Got to position x,y + * + * @param char + * @param char + * + * @return char + */ +char HD44780_PositionXY (char x, char y) +{ + if (x > HD44780_COLS || y > HD44780_ROWS) { + // error + return ERROR; + } + // check which row + if (y == 0) { + // send instruction 1st row + HD44780_SendInstruction(HD44780_POSITION | (HD44780_ROW1_START + x)); + } else if (y == 1) { + // send instruction 2nd row + HD44780_SendInstruction(HD44780_POSITION | (HD44780_ROW2_START + x)); + } + // success + return 0; +} + +/** + * @desc Shift cursor / display to left / right + * + * @param char item {HD44780_CURSOR; HD44780_DISPLAY} + * @param char direction {HD44780_RIGHT; HD44780_LEFT} + * + * @return char + */ +char HD44780_Shift (char item, char direction) +{ + // check if item is cursor or display or direction is left or right + if ((item != HD44780_DISPLAY) && (item != HD44780_CURSOR)) { + // error + return ERROR; + } + // check if direction is left or right + if ((direction != HD44780_RIGHT) && (direction != HD44780_LEFT)) { + // error + return ERROR; + } + + // cursor shift + if (item == HD44780_CURSOR) { + // right shift + if (direction == HD44780_RIGHT) { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_CURSOR | HD44780_RIGHT); + } else { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_CURSOR | HD44780_LEFT); + } + // display shift + } else { + // right shift + if (direction == HD44780_RIGHT) { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_DISPLAY | HD44780_RIGHT); + } else { + // shit cursor / display to right / left + HD44780_SendInstruction(HD44780_SHIFT | HD44780_DISPLAY | HD44780_LEFT); + } + } + // success + return 0; +} + +/** + * @desc LCD init - initialisation routine + * + * @param void + * + * @return void + */ +void HD44780_Init (void) +{ + // set E as output + SETBIT(HD44780_DDR_E, HD44780_E); + // set RS as output + SETBIT(HD44780_DDR_RS, HD44780_RS); + // set RW as output + SETBIT(HD44780_DDR_RW, HD44780_RW); + + // set DB7-DB4 as output + HD44780_SetDDR_DATA4to7(); + + // clear RS + CLRBIT(HD44780_PORT_RS, HD44780_RS); + // clear RW + CLRBIT(HD44780_PORT_RW, HD44780_RW); + // clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + + // delay > 15ms + _delay_ms(16); + + + // Busy Flag (BF) cannot be checked in these instructions + // --------------------------------------------------------------------- + // Initial sequence 0x30 - send 4 bits in 4 bit mode + HD44780_SendInstruction(HD44780_INIT_SEQ); + // delay > 4.1ms + _delay_ms(5); + + // pulse E + HD44780_PulseE(); + // delay > 100us + _delay_us(110); + + // pulse E + HD44780_PulseE(); + // delay > 45us (=37+4 * 270/250) + _delay_us(50); + + // 4 bit mode 0x20 - send 4 bits in 4 bit mode + HD44780_Send4bitsIn4bitMode(HD44780_4BIT_MODE); + // pulse E + HD44780_PulseE(); + // delay > 45us (=37+4 * 270/250) + _delay_us(50); + // ---------------------------------------------------------------------- + + // 4-bit & 2-lines & 5x8-dots 0x28 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_4BIT_MODE | HD44780_2_ROWS | HD44780_FONT_5x8); + + // display off 0x08 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_DISP_OFF); + + // display clear 0x01 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_DISP_CLEAR); + + // entry mode set 0x06 - send 8 bits in 4 bit mode + HD44780_SendInstruction(HD44780_ENTRY_MODE); +} + +/** + * @desc Check Busy Flag (BF) in 4 bit mode + * + * @param void + * + * @return void + */ +void HD44780_CheckBFin4bitMode (void) +{ + unsigned char input = 0; + + // clear DB7-DB4 as input + HD44780_ClearDDR_DATA4to7(); + // set pull-up resistors for DB7-DB4 + HD44780_SetPORT_DATA4to7(); + + // clear RS + CLRBIT(HD44780_PORT_RS, HD44780_RS); + // set RW - read instruction + SETBIT(HD44780_PORT_RW, HD44780_RW); + + // test HIGH level on PIN DB7 + // after clear PIN DB7 should continue + // ------------------------------------- + // us: 0.5|0.5|0.5 + // ___ ___ + // E: ___/ \___/ \__ + // ___ ___ + // DB7: \___/ \___/ \__ + // + while (1) { + + // Read upper nibble + // -------------------------------- + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // PWeh > 0.5us + _delay_us(0.5); + // read upper nibble (tDDR > 360ns) + input = HD44780_PIN_DATA; + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + + // Read lower nibble + // -------------------------------- + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // PWeh > 0.5us + _delay_us(0.5); + // read lower nibble (tDDR > 360ns) + input |= HD44780_PIN_DATA >> 4; + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + + // check if DB7 is cleared + if (!(input & (1 << HD44780_DATA7))) { + // if BF cleared -> end loop + break; + } + } + + // clear RW + CLRBIT(HD44780_PORT_RW, HD44780_RW); + + // set DB7-DB4 as output + HD44780_SetDDR_DATA4to7(); +} + +/** + * @desc Check Busy Flag (BF) in 8 bit mode + * + * @param void + * @return void + */ +void HD44780_CheckBFin8bitMode (void) +{ +} + +/** + * @desc LCD send instruction + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SendInstruction (unsigned short int data) +{ + // Clear RS + HD44780_PORT_RS &= ~(1 << HD44780_RS); + + // 4bit mode + // ------------------------------------------ + if (HD44780_MODE == HD44780_4BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn4bitMode(data); + // check busy flag + HD44780_CheckBFin4bitMode(); + // 8 bit mode + // ------------------------------------------ + } else if (HD44780_MODE == HD44780_8BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn8bitMode(data); + // check busy flag + HD44780_CheckBFin8bitMode(); + } +} + +/** + * @desc LCD send data + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SendData (unsigned short int data) +{ + // Set RS + SETBIT(HD44780_PORT_RS, HD44780_RS); + + // 4bit mode + // ------------------------------------------ + if (HD44780_MODE == HD44780_4BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn4bitMode(data); + // check busy flag + HD44780_CheckBFin4bitMode(); + // 8 bit mode + // ------------------------------------------ + } else if (HD44780_MODE == HD44780_8BIT_MODE) { + // send required data in required mode + HD44780_Send8bitsIn8bitMode(data); + // check busy flag + HD44780_CheckBFin8bitMode(); + } + + // Clear RS + CLRBIT(HD44780_PORT_RS, HD44780_RS); +} + +/** + * @desc LCD send 4bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send4bitsIn4bitMode (unsigned short int data) +{ + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // send data to LCD + HD44780_SetUppNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send 8bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send8bitsIn4bitMode (unsigned short int data) +{ + // Send upper nibble + // ---------------------------------- + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // send data to LCD + HD44780_SetUppNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); + + // Send lower nibble + // ---------------------------------- + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // send data to LCD + HD44780_SetUppNibble(data << 4); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send 8bits instruction in 8 bit mode + * + * @param unsigned short int + * + * @return void + */ +void HD44780_Send8bitsIn8bitMode (unsigned short int data) +{ + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // send data to LCD + HD44780_SetUppNibble(data); + // send data to LCD + HD44780_SetLowNibble(data); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc LCD send upper nibble + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SetUppNibble (unsigned short int data) +{ + // clear bits DB7-DB4 + CLRBIT(HD44780_PORT_DATA, HD44780_DATA7); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA6); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA5); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA4); + // set DB7-DB4 if corresponding bit is set + if (data & 0x80) { SETBIT(HD44780_PORT_DATA, HD44780_DATA7); } + if (data & 0x40) { SETBIT(HD44780_PORT_DATA, HD44780_DATA6); } + if (data & 0x20) { SETBIT(HD44780_PORT_DATA, HD44780_DATA5); } + if (data & 0x10) { SETBIT(HD44780_PORT_DATA, HD44780_DATA4); } +} + +/** + * @desc LCD send lower nibble + * + * @param unsigned short int + * + * @return void + */ +void HD44780_SetLowNibble (unsigned short int data) +{ + // clear bits DB7-DB4 + CLRBIT(HD44780_PORT_DATA, HD44780_DATA3); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA2); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA1); + CLRBIT(HD44780_PORT_DATA, HD44780_DATA0); + // set DB7-DB4 if corresponding bit is set + if (data & 0x08) { SETBIT(HD44780_PORT_DATA, HD44780_DATA3); } + if (data & 0x04) { SETBIT(HD44780_PORT_DATA, HD44780_DATA2); } + if (data & 0x02) { SETBIT(HD44780_PORT_DATA, HD44780_DATA1); } + if (data & 0x01) { SETBIT(HD44780_PORT_DATA, HD44780_DATA0); } +} + +/** + * @desc LCD pulse E + * + * @param void + * + * @return void + */ +void HD44780_PulseE (void) +{ + // Set E + SETBIT(HD44780_PORT_E, HD44780_E); + // PWeh delay time > 450ns + _delay_us(0.5); + // Clear E + CLRBIT(HD44780_PORT_E, HD44780_E); + // TcycE > 1000ns -> delay depends on PWeh delay time + // delay = TcycE - PWeh = 1000 - 500 = 500ns + _delay_us(0.5); +} + +/** + * @desc Set PORT DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_SetPORT_DATA4to7 (void) +{ + // set DB4-DB7 + SETBIT(HD44780_PORT_DATA, HD44780_DATA4); + SETBIT(HD44780_PORT_DATA, HD44780_DATA5); + SETBIT(HD44780_PORT_DATA, HD44780_DATA6); + SETBIT(HD44780_PORT_DATA, HD44780_DATA7); +} + +/** + * @desc Clear DDR DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_ClearDDR_DATA4to7 (void) +{ + // set DB4-DB7 + CLRBIT(HD44780_DDR_DATA, HD44780_DATA4); + CLRBIT(HD44780_DDR_DATA, HD44780_DATA5); + CLRBIT(HD44780_DDR_DATA, HD44780_DATA6); + CLRBIT(HD44780_DDR_DATA, HD44780_DATA7); +} + +/** + * @desc Set DDR DB4 to DB7 + * + * @param void + * + * @return void + */ +void HD44780_SetDDR_DATA4to7 (void) +{ + // set DB7-DB4 as output + SETBIT(HD44780_DDR_DATA, HD44780_DATA4); + SETBIT(HD44780_DDR_DATA, HD44780_DATA5); + SETBIT(HD44780_DDR_DATA, HD44780_DATA6); + SETBIT(HD44780_DDR_DATA, HD44780_DATA7); +} diff --git a/ChaloupeLora.X/Source/hd44780.h b/ChaloupeLora.X/Source/hd44780.h new file mode 100644 index 0000000..2cedf87 --- /dev/null +++ b/ChaloupeLora.X/Source/hd44780.h @@ -0,0 +1,386 @@ +/** + * ---------------------------------------------------------------+ + * @desc HD44780 LCD Driver + * ---------------------------------------------------------------+ + * Copyright (C) 2020 Marian Hrinko. + * Written by Marian Hrinko (mato.hrinko@gmail.com) + * + * @author Marian Hrinko + * @datum 18.11.2020 + * @file hd44780.c + * @tested AVR Atmega16a + * + * @depend + * ---------------------------------------------------------------+ + * @usage default set 16x2 LCD + * 4-bit with 3 control wires (RW, RS, E) + * + */ +#ifndef __HD44780_H__ +#define __HD44780_H__ + + // Success + #ifndef SUCCESS + #define SUCCESS 0 + #endif + + // Error + #ifndef ERROR + #define ERROR 1 + #endif + + // define clock + #if defined(__AVR_ATmega8__) + #define _FCPU 8000000 + #elif defined(__AVR_ATmega16__) + #define _FCPU 16000000 + #endif + + //#if defined(__AVR_ATmega16__) + + // E port + // -------------------------------------- + #ifndef HD44780_DDR_E + #define HD44780_DDR_E TRISB + #endif + #ifndef HD44780_PORT_E + #define HD44780_PORT_E PORTB + #endif + #ifndef HD44780_E + #define HD44780_E 12 + #endif + + // RW port + // -------------------------------------- + #ifndef HD44780_DDR_RW + #define HD44780_DDR_RW TRISB + #endif + #ifndef HD44780_PORT_RW + #define HD44780_PORT_RW PORTB + #endif + #ifndef HD44780_RW + #define HD44780_RW 13 + #endif + + // RS port + // -------------------------------------- + #ifndef HD44780_DDR_RS + #define HD44780_DDR_RS TRISD + #endif + #ifndef HD44780_PORT_RS + #define HD44780_PORT_RS PORTD + #endif + #ifndef HD44780_RS + #define HD44780_RS 5 + #endif + + // DATA port / pin + // -------------------------------------- + #ifndef HD44780_DDR_DATA + #define HD44780_DDR_DATA TRISB + #endif + #ifndef HD44780_PORT_DATA + #define HD44780_PORT_DATA PORTB + #endif + #ifndef HD44780_PIN_DATA + #define HD44780_PIN_DATA PORTB + #endif + // pins + #ifndef HD44780_DATA7 + #define HD44780_DATA7 11 // LCD PORT DB7 + #endif + #ifndef HD44780_DATA6 + #define HD44780_DATA6 10 // LCD PORT DB6 + #endif + #ifndef HD44780_DATA5 + #define HD44780_DATA5 9 // LCD PORT DB5 + #endif + #ifndef HD44780_DATA4 + #define HD44780_DATA4 3 // LCD PORT DB4 + #endif + #ifndef HD44780_DATA3 + #define HD44780_DATA3 0 // LCD PORT DB3 + #endif + #ifndef HD44780_DATA2 + #define HD44780_DATA2 0 // LCD PORT DB2 + #endif + #ifndef HD44780_DATA1 + #define HD44780_DATA1 0 // LCD PORT DB1 + #endif + #ifndef HD44780_DATA0 + #define HD44780_DATA0 0 // LCD PORT DB0 + #endif + + // #endif + +#define _delay_ms(x) Sleep(x) +#define _delay_us(x) Sleep(1) + + #define BIT7 0x80 + #define BIT6 0x40 + #define BIT5 0x20 + #define BIT4 0x10 + #define BIT3 0x08 + #define BIT2 0x04 + #define BIT1 0x02 + #define BIT0 0x01 + + #define HD44780_BUSY_FLAG HD44780_DATA7 + #define HD44780_INIT_SEQ 0x30 + #define HD44780_DISP_CLEAR 0x01 + #define HD44780_DISP_OFF 0x08 + #define HD44780_DISP_ON 0x0C + #define HD44780_CURSOR_ON 0x0E + #define HD44780_CURSOR_OFF 0x0C + #define HD44780_CURSOR_BLINK 0x0F + #define HD44780_RETURN_HOME 0x02 + #define HD44780_ENTRY_MODE 0x06 + #define HD44780_4BIT_MODE 0x20 + #define HD44780_8BIT_MODE 0x30 + #define HD44780_2_ROWS 0x08 + #define HD44780_FONT_5x8 0x00 + #define HD44780_FONT_5x10 0x04 + #define HD44780_POSITION 0x80 + + #define HD44780_SHIFT 0x10 + #define HD44780_CURSOR 0x00 + #define HD44780_DISPLAY 0x08 + #define HD44780_LEFT 0x00 + #define HD44780_RIGHT 0x04 + + #define HD44780_ROWS 2 + #define HD44780_COLS 16 + + #define HD44780_ROW1_START 0x00 + #define HD44780_ROW1_END HD44780_COLS + #define HD44780_ROW2_START 0x40 + #define HD44780_ROW2_END HD44780_COLS + + // ********************************************** + // !!! + // MODE DEFINITION - CORRECTLY DEFINED + // + // ---------------------------------------------- + // + // HD44780_4BIT_MODE - 4 bit mode / 4 data wires + // HD44780_8BIT_MODE - 8 bit mode / 8 data wires + // + // ********************************************** + #define HD44780_MODE HD44780_4BIT_MODE + + // set bit + #define SETBIT(REG, BIT) { REG |= (1 << BIT); } + // clear bit + #define CLRBIT(REG, BIT) { REG &= ~(1 << BIT); } + // set port / pin if bit is set + #define SET_IF_BIT_IS_SET(REG, PORT, DATA, BIT) { if((DATA & BIT) > 0) { SETBIT(REG, PORT); } } + + /** + * @desc LCD init - initialisation routine + * + * @param void + * + * @return void + */ + void HD44780_Init (void); + + /** + * @desc LCD display clear + * + * @param void + * + * @return void + */ + void HD44780_DisplayClear (void); + + /** + * @desc LCD display on + * + * @param void + * + * @return void + */ + void HD44780_DisplayOn (void); + + /** + * @desc LCD cursor on, display on + * + * @param void + * + * @return void + */ + void HD44780_CursorOn (void); + + /** + * @desc LCD cursor off + * + * @param void + * + * @return void + */ + void HD44780_CursorOff (void); + + /** + * @desc LCD cursor blink, cursor on, display on + * + * @param void + * + * @return void + */ + void HD44780_CursorBlink (void); + + /** + * @desc LCD draw char + * + * @param char + * @return void + */ + void HD44780_DrawChar (char character); + + /** + * @desc LCD draw string + * + * @param char * + * + * @return void + */ + void HD44780_DrawString (char *str); + + /** + * @desc Got to position x,y + * + * @param char + * @param char + * + * @return char + */ + char HD44780_PositionXY (char x, char y); + + /** + * @desc Shift cursor / display to left / right + * + * @param char item {HD44780_CURSOR; HD44780_DISPLAY} + * @param char direction {HD44780_RIGHT; HD44780_LEFT} + * + * @return char + */ + char HD44780_Shift (char item, char direction); + + /** + * @desc Check Busy Flag (BF) in 8 bit mode + * + * @param void + * + * @return void + */ + void HD44780_CheckBFin8bitMode (void); + + /** + * @desc Check Busy Flag (BF) in 4 bit mode + * + * @param void + * + * @return void + */ + void HD44780_CheckBFin4bitMode (void); + + /** + * @desc LCD send instruction + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SendInstruction (unsigned short int); + + /** + * @desc LCD send data + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SendData (unsigned short int); + + /** + * @desc LCD send 4bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send4bitsIn4bitMode (unsigned short int); + + /** + * @desc LCD send 8bits instruction in 4 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send8bitsIn4bitMode (unsigned short int); + + /** + * @desc LCD send 8bits instruction in 8 bit mode + * + * @param unsigned short int + * + * @return void + */ + void HD44780_Send8bitsIn8bitMode (unsigned short int); + + /** + * @desc LCD send upper nibble + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SetUppNibble (unsigned short int); + + /** + * @desc LCD send lower nibble + * + * @param unsigned short int + * + * @return void + */ + void HD44780_SetLowNibble (unsigned short int); + + /** + * @desc LCD pulse E + * + * @param void + * + * @return void + */ + void HD44780_PulseE (void); + + /** + * @desc Set PORT DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_SetPORT_DATA4to7 (void); + + /** + * @desc Set DDR DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_SetDDR_DATA4to7 (void); + + /** + * @desc Clear DDR DB4 to DB7 + * + * @param void + * + * @return void + */ + void HD44780_ClearDDR_DATA4to7 (void); + +#endif diff --git a/ChaloupeLora.X/Source/ina219.c b/ChaloupeLora.X/Source/ina219.c new file mode 100644 index 0000000..fea36dc --- /dev/null +++ b/ChaloupeLora.X/Source/ina219.c @@ -0,0 +1,678 @@ +/**************************************************************************/ +/*! + @file ina219.c + @author K. Townsend (microBuilder.eu) + + @brief Driver for the TI INA219 current/power monitor + + @section DESCRIPTION + + The INA219 is an I2C-based current/power monitor that monitors the + voltage drop across a shunt resistor, as well as the supply voltage. + + @section EXAMPLE + @code + ina219Init(); + + int16_t current = 0; + int16_t power = 0; + int16_t current_mA = 0; + int16_t power_mW = 0; + int16_t busvoltage = 0; + int16_t shuntvoltage = 0; + int16_t loadVoltage = 0; + + while(1) + { + shuntvoltage = ina219GetShuntVoltage(); + busvoltage = ina219GetBusVoltage(); + power = ina219GetPower(); + current = ina219GetCurrent(); + power_mW = ina219GetPower_mW(); + current_mA = ina219GetCurrent_mA(); + loadVoltage = busvoltage + (shuntvoltage / 100); + printf("%-15s %6d = %d.%dmV (%duV) \r\n", "Shunt Voltage:", shuntvoltage, shuntvoltage / 100, shuntvoltage % 100, shuntvoltage * 10); + printf("%-15s %6d = %d.%dV \r\n", "Bus Voltage:", busvoltage, busvoltage / 1000, busvoltage % 1000); + printf("%-15s %6d = %d.%dV \r\n", "Load Voltage:", loadVoltage, loadVoltage / 1000, loadVoltage % 1000); + printf("%-15s %6d = %dmW \r\n", "Power:", power, power_mW); + printf("%-15s %6d = %dmA \r\n", "Current:", current, current_mA); + printf("\r\n"); + systickDelay(5000); + } + @endcode + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2012 Kevin Townsend + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/**************************************************************************/ +#include "ina219.h" +#include "I2C.h" +#include + +unsigned char I2CMasterBuffer[I2C_BUFSIZE]; +unsigned char I2CSlaveBuffer[I2C_BUFSIZE]; + +// The following multipliers are used to convert raw current and power +// values to mA and mW, taking into account the current config settings +uint32_t ina219_currentDivider_mA = 0; +uint32_t ina219_powerDivider_mW = 0; + +/**************************************************************************/ +/*! + @brief Sends a single command byte over I2C + */ +/**************************************************************************/ +static int ina219WriteRegister (uint8_t reg, uint16_t value) +{ + // Clear write buffers + uint32_t i; + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + //I2CWriteLength = 4; + // I2CReadLength = 0; + I2CMasterBuffer[0] = INA219_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Register + I2CMasterBuffer[2] = value >> 8; // Upper 8-bits + I2CMasterBuffer[3] = value & 0xFF; // Lower 8-bits + + return I2CWrite(I2CMasterBuffer,4); + + + + //i2cEngine(); +} + +/**************************************************************************/ +/*! + @brief Reads a 16 bit values over I2C + */ +/**************************************************************************/ +static void ina219Read16(uint8_t reg, uint16_t *value) +{ + // Clear write buffers + int RET = RET_OK; + uint32_t i; + for ( i = 0; i < I2C_BUFSIZE; i++ ) + { + I2CMasterBuffer[i] = 0x00; + } + + // I2CWriteLength = 2; + //I2CReadLength = 2; + I2CMasterBuffer[0] = INA219_ADDRESS; // I2C device address + I2CMasterBuffer[1] = reg; // Command register + // Append address w/read bit + I2CMasterBuffer[2] = INA219_ADDRESS | INA219_READ; + // i2cEngine(); + + I2CWrite(I2CMasterBuffer,2); //write pointer to the good register + RET = I2CRead(I2CMasterBuffer[2],&I2CSlaveBuffer[0],2); //read the data + + if(RET != RET_OK) + { + * value = 0; + return; + } + // Shift values to create properly formed integer + *value = ((I2CSlaveBuffer[0] << 8) | I2CSlaveBuffer[1]); +} + +void ina219SetCalibration_13V_10A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 13V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 3.2A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.00009765 (98µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000488 (488µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0001 (100µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 4096 (0x1000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.002 (2mW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 3.2767A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.32V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 3.2 * 32V + // MaximumPower = 102.4W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10) + ina219_powerDivider_mW = 2; // Power LSB = 1mW per bit (2/1) + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x1000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + // INA219_CONFIG_MODE_SVOLT_CONTINUOUS; + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 32V and 2A + of current. Each unit of current corresponds to 100uA, and + each unit of power corresponds to 2mW. Counter overflow + occurs at 3.2A. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_32V_2A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 32V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 2.0A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.000061 (61µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000488 (488µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0001 (100µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 4096 (0x1000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.002 (2mW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 3.2767A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.32V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 3.2 * 32V + // MaximumPower = 102.4W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 10; // Current LSB = 100uA per bit (1000/100 = 10) + ina219_powerDivider_mW = 2; // Power LSB = 1mW per bit (2/1) + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x1000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 32V and 1A + of current. Each unit of current corresponds to 40uA, and each + unit of power corresponds to 800µW. Counter overflow occurs at + 1.3A. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_32V_1A(void) +{ + // By default we use a pretty huge range for the input voltage, + // which probably isn't the most appropriate choice for system + // that don't use a lot of power. But all of the calculations + // are shown below if you want to change the settings. You will + // also need to change any relevant register settings, such as + // setting the VBUS_MAX to 16V instead of 32V, etc. + + // VBUS_MAX = 32V (Assumes 32V, can also be set to 16V) + // VSHUNT_MAX = 0.32 (Assumes Gain 8, 320mV, can also be 0.16, 0.08, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 3.2A + + // 2. Determine max expected current + // MaxExpected_I = 1.0A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.0000305 (30.5µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0.000244 (244µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0000400 (40µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 10240 (0x2800) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0008 (800µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 1.31068A before overflow + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // ... In this case, we're good though since Max_Current is less than MaxPossible_I + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.131068V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 1.31068 * 32V + // MaximumPower = 41.94176W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 25; // Current LSB = 40uA per bit (1000/40 = 25) + ina219_powerDivider_mW = 1; // Power LSB = 800µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x2800); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_32V | + INA219_CONFIG_GAIN_8_320MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 16V and 500mA + of current. Each unit of current corresponds to 25uA, and each + unit of power corresponds to 500µW. Counter overflow occurs at + 800mA. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_16V_500mA(void) +{ + // VBUS_MAX = 16V + // VSHUNT_MAX = 0.08 (Assumes Gain 2, 80mV, can also be 0.32, 0.16, 0.04) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 0.8A + + // 2. Determine max expected current + // MaxExpected_I = 0.5A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.0000153 (15.3µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0.0001221 (122µA per bit) + + // 4. Choose an LSB between the min and max values + // (Preferrably a roundish number close to MinLSB) + // CurrentLSB = 0.0000250 (25µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 16384 (0x4000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0005 (500µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 0.819175 (819 mA before overflow) + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_Current_Before_Overflow = 0.8A + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.8 * 0.1 + // Max_ShuntVoltage = 0.08V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 0.8 * 16V + // MaximumPower = 12.8W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 40; // Current LSB = 25uA per bit (1000/25 = 40) + ina219_powerDivider_mW = 1; // Power LSB = 500µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0x4000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V | + INA219_CONFIG_GAIN_2_80MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Configures to INA219 to be able to measure up to 16V and 200mA + of current. Each unit of current corresponds to 10uA, and each + unit of power corresponds to 200µW. Counter overflow occurs at + 327mA. + + @note These calculations assume a 0.1 ohm resistor is present + */ +/**************************************************************************/ +void ina219SetCalibration_16V_200mA(void) +{ + // VBUS_MAX = 16V + // VSHUNT_MAX = 0.04 (Assumes Gain 1, 40mV, can also be 0.32, 0.16, 0.08) + // RSHUNT = 0.1 (Resistor value in ohms) + + // 1. Determine max possible current + // MaxPossible_I = VSHUNT_MAX / RSHUNT + // MaxPossible_I = 0.4A + + // 2. Determine max expected current + // MaxExpected_I = 0.2A + + // 3. Calculate possible range of LSBs (Min = 15-bit, Max = 12-bit) + // MinimumLSB = MaxExpected_I/32767 + // MinimumLSB = 0.000006104 (6.104µA per bit) + // MaximumLSB = MaxExpected_I/4096 + // MaximumLSB = 0,000048828 (48.82µA per bit) + + // 4. Choose an LSB between the min and max values + // CurrentLSB = 0.000010 (10µA per bit) + + // 5. Compute the calibration register + // Cal = trunc (0.04096 / (Current_LSB * RSHUNT)) + // Cal = 40960 (0xA000) + + // 6. Calculate the power LSB + // PowerLSB = 20 * CurrentLSB + // PowerLSB = 0.0002 (200µW per bit) + + // 7. Compute the maximum current and shunt voltage values before overflow + // + // Max_Current = Current_LSB * 32767 + // Max_Current = 0.32767 (328 mA before overflow) + // + // If Max_Current > Max_Possible_I then + // Max_Current_Before_Overflow = MaxPossible_I + // Else + // Max_Current_Before_Overflow = Max_Current + // End If + // + // Max_ShuntVoltage = Max_Current_Before_Overflow * RSHUNT + // Max_ShuntVoltage = 0.032767V + // + // If Max_ShuntVoltage >= VSHUNT_MAX + // Max_ShuntVoltage_Before_Overflow = VSHUNT_MAX + // Else + // Max_ShuntVoltage_Before_Overflow = Max_ShuntVoltage + // End If + + // 8. Computer the Maximum Power + // MaximumPower = Max_Current_Before_Overflow * VBUS_MAX + // MaximumPower = 0.32767 * 16V + // MaximumPower = 5.24W + + // Set multipliers to convert raw current/power values + ina219_currentDivider_mA = 100; // Current LSB = 10uA per bit (1000/10 = 100) + ina219_powerDivider_mW = 1; // Power LSB = 200µW per bit + + // Set Calibration register to 'Cal' calculated above + ina219WriteRegister(INA219_REG_CALIBRATION, 0xA000); + + // Set Config register to take into account the settings above + uint16_t config = INA219_CONFIG_BVOLTAGERANGE_16V | + INA219_CONFIG_GAIN_1_40MV | + INA219_CONFIG_BADCRES_12BIT | + INA219_CONFIG_SADCRES_12BIT_1S_532US | + INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS; + ina219WriteRegister(INA219_REG_CONFIG, config); +} + +/**************************************************************************/ +/*! + @brief Initialises the I2C block + */ +/**************************************************************************/ +int ina219Init(void) +{ + int RET = RET_OK; + uint16_t ReadBack; + // Reset INA219 (set to default values) + RET = ina219WriteRegister(INA219_REG_CONFIG, INA219_CONFIG_RESET); + ina219Read16(INA219_REG_CONFIG,&ReadBack); + + if(ReadBack != INA219_CONFIG_RESET_READBACK) + { + return RET_ERROR; + } + + + + // Setup chip for 32V and 2A by default + // ina219SetCalibration_32V_2A(); + ina219SetCalibration_13V_10A(); + + return RET; +} + +/**************************************************************************/ +/*! + @brief Gets the shunt voltage (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetShuntVoltage(void) +{ + uint16_t value; + ina219Read16(INA219_REG_SHUNTVOLTAGE, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the shunt voltage (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetBusVoltage(void) +{ + uint16_t value; + ina219Read16(INA219_REG_BUSVOLTAGE, &value); + // Shift to the right 3 to drop CNVR and OVF and then multiply by LSB + return (value >> 3) * 4; +} + +/**************************************************************************/ +/*! + @brief Gets the raw power value (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetPower(void) +{ + uint16_t value; + ina219Read16(INA219_REG_POWER, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the power value in mW, taking into account the config + settings and power LSB + */ +/**************************************************************************/ +int16_t ina219GetPower_mW(void) +{ + uint16_t value; + ina219Read16(INA219_REG_POWER, &value); + return value / ina219_powerDivider_mW; +} + +/**************************************************************************/ +/*! + @brief Gets the raw current value (16-bit signed integer, so +-32767) + */ +/**************************************************************************/ +int16_t ina219GetCurrent(void) +{ + uint16_t value; + ina219Read16(INA219_REG_CURRENT, &value); + return value; +} + +/**************************************************************************/ +/*! + @brief Gets the current value in mA, taking into account the + config settings and current LSB + */ +/**************************************************************************/ +int16_t ina219GetCurrent_mA(void) +{ + uint16_t value; + ina219Read16(INA219_REG_CURRENT, &value); + return value / ina219_currentDivider_mA; +} + + diff --git a/ChaloupeLora.X/Source/ina219.h b/ChaloupeLora.X/Source/ina219.h new file mode 100644 index 0000000..65eb4fc --- /dev/null +++ b/ChaloupeLora.X/Source/ina219.h @@ -0,0 +1,141 @@ +/**************************************************************************/ +/*! + @file ina219.h + @author K. Townsend (microBuilder.eu) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2012 Kevin Townsend + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef _INA219_H_ +#define _INS219_H_ + +#include "define.h" +//#include "projectconfig.h" +//#include "core/i2c/i2c.h" + + + +/*========================================================================= + I2C ADDRESS/BITS + -----------------------------------------------------------------------*/ + #define INA219_ADDRESS (0x80) // 1000000x (A0+A1=GND) + #define INA219_READ (0x01) +/*=========================================================================*/ + +/*========================================================================= + CONFIG REGISTER (R/W) + -----------------------------------------------------------------------*/ + #define INA219_REG_CONFIG (0x00) + /*---------------------------------------------------------------------*/ + #define INA219_CONFIG_RESET (0x8000) // Reset Bit + #define INA219_CONFIG_RESET_READBACK 0x39FF + + #define INA219_CONFIG_BVOLTAGERANGE_MASK (0x4000) // Bus Voltage Range Mask + #define INA219_CONFIG_BVOLTAGERANGE_16V (0x0000) // 0-16V Range + #define INA219_CONFIG_BVOLTAGERANGE_32V (0x4000) // 0-32V Range + + #define INA219_CONFIG_GAIN_MASK (0x1800) // Gain Mask + #define INA219_CONFIG_GAIN_1_40MV (0x0000) // Gain 1, 40mV Range + #define INA219_CONFIG_GAIN_2_80MV (0x0800) // Gain 2, 80mV Range + #define INA219_CONFIG_GAIN_4_160MV (0x1000) // Gain 4, 160mV Range + #define INA219_CONFIG_GAIN_8_320MV (0x1800) // Gain 8, 320mV Range + + #define INA219_CONFIG_BADCRES_MASK (0x0780) // Bus ADC Resolution Mask + #define INA219_CONFIG_BADCRES_9BIT (0x0080) // 9-bit bus res = 0..511 + #define INA219_CONFIG_BADCRES_10BIT (0x0100) // 10-bit bus res = 0..1023 + #define INA219_CONFIG_BADCRES_11BIT (0x0200) // 11-bit bus res = 0..2047 + #define INA219_CONFIG_BADCRES_12BIT (0x0400) // 12-bit bus res = 0..4097 + + #define INA219_CONFIG_SADCRES_MASK (0x0078) // Shunt ADC Resolution and Averaging Mask + #define INA219_CONFIG_SADCRES_9BIT_1S_84US (0x0000) // 1 x 9-bit shunt sample + #define INA219_CONFIG_SADCRES_10BIT_1S_148US (0x0008) // 1 x 10-bit shunt sample + #define INA219_CONFIG_SADCRES_11BIT_1S_276US (0x0010) // 1 x 11-bit shunt sample + #define INA219_CONFIG_SADCRES_12BIT_1S_532US (0x0018) // 1 x 12-bit shunt sample + #define INA219_CONFIG_SADCRES_12BIT_2S_1060US (0x0048) // 2 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_4S_2130US (0x0050) // 4 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_8S_4260US (0x0058) // 8 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_16S_8510US (0x0060) // 16 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_32S_17MS (0x0068) // 32 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_64S_34MS (0x0070) // 64 x 12-bit shunt samples averaged together + #define INA219_CONFIG_SADCRES_12BIT_128S_69MS (0x0078) // 128 x 12-bit shunt samples averaged together + + #define INA219_CONFIG_MODE_MASK (0x0007) // Operating Mode Mask + #define INA219_CONFIG_MODE_POWERDOWN (0x0000) + #define INA219_CONFIG_MODE_SVOLT_TRIGGERED (0x0001) + #define INA219_CONFIG_MODE_BVOLT_TRIGGERED (0x0002) + #define INA219_CONFIG_MODE_SANDBVOLT_TRIGGERED (0x0003) + #define INA219_CONFIG_MODE_ADCOFF (0x0004) + #define INA219_CONFIG_MODE_SVOLT_CONTINUOUS (0x0005) + #define INA219_CONFIG_MODE_BVOLT_CONTINUOUS (0x0006) + #define INA219_CONFIG_MODE_SANDBVOLT_CONTINUOUS (0x0007) +/*=========================================================================*/ + +/*========================================================================= + SHUNT VOLTAGE REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_SHUNTVOLTAGE (0x01) +/*=========================================================================*/ + +/*========================================================================= + BUS VOLTAGE REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_BUSVOLTAGE (0x02) +/*=========================================================================*/ + +/*========================================================================= + POWER REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_POWER (0x03) +/*=========================================================================*/ + +/*========================================================================= + CURRENT REGISTER (R) + -----------------------------------------------------------------------*/ + #define INA219_REG_CURRENT (0x04) +/*=========================================================================*/ + +/*========================================================================= + CALIBRATION REGISTER (R/W) + -----------------------------------------------------------------------*/ + #define INA219_REG_CALIBRATION (0x05) +/*=========================================================================*/ + +int ina219Init(void); +int16_t ina219GetShuntVoltage(void); +int16_t ina219GetBusVoltage(void); +int16_t ina219GetPower(void); +int16_t ina219GetPower_mW(void); +int16_t ina219GetCurrent(void); +int16_t ina219GetCurrent_mA(void); + +#endif + + diff --git a/ChaloupeLora.X/Source/interrupts.c b/ChaloupeLora.X/Source/interrupts.c new file mode 100644 index 0000000..e26f215 --- /dev/null +++ b/ChaloupeLora.X/Source/interrupts.c @@ -0,0 +1,75 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For __ISR definition */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ + +/******************************************************************************/ +/* Interrupt Vector Options */ +/******************************************************************************/ +/* */ +/* VECTOR NAMES: */ +/* */ +/* _CORE_TIMER_VECTOR _COMPARATOR_2_VECTOR */ +/* _CORE_SOFTWARE_0_VECTOR _UART_2A_VECTOR */ +/* _CORE_SOFTWARE_1_VECTOR _I2C_2A_VECTOR */ +/* _EXTERNAL_0_VECTOR _SPI_2_VECTOR */ +/* _TIMER_1_VECTOR _SPI_2A_VECTOR */ +/* _INPUT_CAPTURE_1_VECTOR _I2C_4_VECTOR */ +/* _OUTPUT_COMPARE_1_VECTOR _UART_3_VECTOR */ +/* _EXTERNAL_1_VECTOR _UART_2_VECTOR */ +/* _TIMER_2_VECTOR _SPI_3A_VECTOR */ +/* _INPUT_CAPTURE_2_VECTOR _I2C_3A_VECTOR */ +/* _OUTPUT_COMPARE_2_VECTOR _UART_3A_VECTOR */ +/* _EXTERNAL_2_VECTOR _SPI_4_VECTOR */ +/* _TIMER_3_VECTOR _I2C_5_VECTOR */ +/* _INPUT_CAPTURE_3_VECTOR _I2C_2_VECTOR */ +/* _OUTPUT_COMPARE_3_VECTOR _FAIL_SAFE_MONITOR_VECTOR */ +/* _EXTERNAL_3_VECTOR _RTCC_VECTOR */ +/* _TIMER_4_VECTOR _DMA_0_VECTOR */ +/* _INPUT_CAPTURE_4_VECTOR _DMA_1_VECTOR */ +/* _OUTPUT_COMPARE_4_VECTOR _DMA_2_VECTOR */ +/* _EXTERNAL_4_VECTOR _DMA_3_VECTOR */ +/* _TIMER_5_VECTOR _DMA_4_VECTOR */ +/* _INPUT_CAPTURE_5_VECTOR _DMA_5_VECTOR */ +/* _OUTPUT_COMPARE_5_VECTOR _DMA_6_VECTOR */ +/* _SPI_1_VECTOR _DMA_7_VECTOR */ +/* _I2C_3_VECTOR _FCE_VECTOR */ +/* _UART_1A_VECTOR _USB_1_VECTOR */ +/* _UART_1_VECTOR _CAN_1_VECTOR */ +/* _SPI_1A_VECTOR _CAN_2_VECTOR */ +/* _I2C_1A_VECTOR _ETH_VECTOR */ +/* _SPI_3_VECTOR _UART_4_VECTOR */ +/* _I2C_1_VECTOR _UART_1B_VECTOR */ +/* _CHANGE_NOTICE_VECTOR _UART_6_VECTOR */ +/* _ADC_VECTOR _UART_2B_VECTOR */ +/* _PMP_VECTOR _UART_5_VECTOR */ +/* _COMPARATOR_1_VECTOR _UART_3B_VECTOR */ +/* */ +/* Refer to the device specific .h file in the C32 Compiler */ +/* pic32mx\include\proc directory for a complete Vector and IRQ mnemonic */ +/* listings for the PIC32 device. */ +/* */ +/* PRIORITY OPTIONS: */ +/* */ +/* (default) IPL0AUTO, IPL1, IPL2, ... IPL7 (highest) */ +/* */ +/* Example Shorthand Syntax */ +/* */ +/* void __ISR(,) user_interrupt_routine_name(void) */ +/* { */ +/* */ +/* } */ +/* */ +/* For more interrupt macro examples refer to the C compiler User Guide in */ +/* the C compiler /doc directory. */ +/* */ +/******************************************************************************/ +/* Interrupt Routines */ +/******************************************************************************/ + +/* TODO Add interrupt routine code here. */ + diff --git a/ChaloupeLora.X/Source/main.c b/ChaloupeLora.X/Source/main.c new file mode 100644 index 0000000..ccb53fa --- /dev/null +++ b/ChaloupeLora.X/Source/main.c @@ -0,0 +1,239 @@ + +/* + Description: + This is a template file for standard C header file. + + */ + +/* ************************************************************************** */ +/* Revision: + ### 20120515 JFM + Original version. + + ### YYYYMMDD Initial, Bug Identification + Change description. + */ + +//JFM WINC TODO + + +#include "define.h" + + +#include "Uart.h" +#include "BoardCfg.h" +#include "timer.h" +#include "Watchdog.h" +//#include "PWMCtrl.h" +//#include "KnobEncoderCtrl.h" +//#include "LedLightCtrl.h" +//#include "PrintfServer.h" + +//#include "MasterCtrlInterface.h" +//#include "SDCardMgr.h" +//#include "FatFS/ff.h" +#include "main.h" +#include "NetworkProtocol.h" +#include "ChaletPowerRelay.h" +#include "BatteryMonitor.h" +#include "CurrentSensor.h" +#include "I2C.h" +#include "SPI_Flash.h" +#include "TemperatureSensor.h" +#include "LoraWatchdog.h" + + +#include "BootloaderInterface.h" + + +//#define NO_WIFI +#ifndef NO_WIFI +#include "Terminal.h" +#include "WiFiCtrl.h" +#include "InternalUart.h" +#endif + +#ifdef USE_PRINTF +void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +#elif defined USE_SYSLOG +#include "Syslog.h" +void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B +#endif + +#define HEARTBEAT_LED_TIMEOUT 400 +#define VOLTS_PER_BITS (float)3.3/1023 + +static void InitializeBoard(void); + +#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF, WDTPS = PS4096 //Watchdog timeout = 4,096s +#pragma config POSCMOD = EC, FNOSC = PRIPLL, FPBDIV = DIV_1 +//#pragma config POSCMOD = XT, FNOSC = PRIPLL, FPBDIV = DIV_1 +#pragma config ICESEL = ICS_PGx2, BWP = OFF +#pragma config FSOSCEN = OFF + +int main(void) +{ + int mRetCode = 1; + + + + + SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE); //Use peripheral library to optimize configuration + INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);// configure for multi-vectored mode interrupts + OSCCONbits.SOSCEN = 0; + +#ifndef __32MX330F064H__ + AD1PCFG = 0xFFFF; //Sart with I/O pins configured as digital I/O +#endif + + InitBoard(); + INTEnableInterrupts(); + + TimerInit(); + InitWatchdog(); + // I2CInit(); + InitChaletPowerRelay(); + InitBatteryMonitor(); + InitHarakiriRelay(); + InitTempSensor(); + + + InitUart(); + ProtocolInit(); + InitLoraWatchdog(); + + InitSPIFlash(); + + + +#ifdef USE_SYSLOG + InitSyslog(); +#endif + + + printf("ChaletDuino V2 Initialized\n"); + + SPIFlashCheckAndConfigure(); + TempSensorCheckAndConfigure(); + + BootloaderInterfaceInit(); + + +// SPIFlashErase64KSector(0x180000,1); +// +// unsigned char test[100]; +// int i = 0; +// +// for(i = 0; i < 100; i++) +// { +// test[i] = i; +// } +// +// +// SPIFlashWriteBuffer(test,100,0x180000); +// +// for(i = 0; i < 100; i++) +// { +// test[i] = 0; +// } +// +// SPIFlashReadBuffer(test,100,0x180000); +// + + +#ifndef NO_WIFI + InitTerminal(); + + InitWiFi(); + + +#endif + + // unsigned int bw; + + // FRESULT res; + // res = f_mount(&FatFs, "", 0); /* Give a work area to the default drive */ + // if(!res) + // { + // printf("Could not mount SD card\n"); + // } + // else + // { + // printf("SD Card mounted successfuly"); + // } + // + // if (f_open(&File[0], "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) /* Create a file */ + //// { + // + // res = f_write(&File[0], "It works!\r\n", 11, &bw); /* Write data to the file */ + // + // res = f_close(&File[0]); /* Close the file */ + // + // } + + // int res = OpenPrintfServer(); + + TimerStart(HEARTBEAT_LED_TMR,HEARTBEAT_LED_TIMEOUT); + + + + + // printf("Lora Monitor Started\n"); + printf("test %d\n", 1); + + EnableWatchdog(); + KickWatchdog(); + mRetCode = 1; + + + + while(mRetCode == 1) + { + + KickWatchdog(); + +#ifndef NO_WIFI + TickWiFi(); +#endif + TickTerminal(); + UartTick(); + ChaletPowerRelayTick(); + BatteryMonitorTick(); + SyslogTick(); + TickTempSensor(); + BootloaderInterfaceTick(); + TickLoraWatchdog(); + + if(IsTimerExpired(HEARTBEAT_LED_TMR)) + { + HEARTBEAT_LED_2_PIN = ~HEARTBEAT_LED_2_PIN; + TimerStart(HEARTBEAT_LED_TMR,HEARTBEAT_LED_TIMEOUT); + } + } + + return mRetCode; +} + + +void InitializeBoard() +{ + InitBoard(); + +} + +#ifdef USE_PRINTF +void _mon_putc(char c) +{ + U2TXREG = c; + while (U2STAbits.TRMT==0); +} +#elif defined USE_SYSLOG +void _mon_putc(char c) +{ + SyslogNewByte(c); +} + +#endif + +//EOF + diff --git a/ChaloupeLora.X/Source/main.h b/ChaloupeLora.X/Source/main.h new file mode 100644 index 0000000..fad916a --- /dev/null +++ b/ChaloupeLora.X/Source/main.h @@ -0,0 +1,165 @@ +/** + * \file + * + * \brief MAIN configuration. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef MAIN_H_INCLUDED +#define MAIN_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +//#include "driver/include/m2m_wifi.h" +// +//// <<< Use Configuration Wizard in Context Menu >>> +//// General network settings in AP (access point) mode +//// Network SSID +//// app_main_m2m_device_name +//#ifndef MAIN_M2M_SSID +//#define MAIN_M2M_SSID "WINC1500_00:00" +//#endif +// +//// Security type +//// <1=> Wi-Fi network is not secured +//// <2=> WPA/WPA2 personal(PSK) +//// <3=> WEP (40 or 104) OPEN OR SHARED +//// <4=> WPA/WPA2 Enterprise.IEEE802.1x +//// app_main_m2m_ap_sec +//#ifndef MAIN_M2M_AP_SEC +//#define MAIN_M2M_AP_SEC 1 +//#endif +// +//// Security key +//// app_main_m2m_ap_key +//#ifndef MAIN_M2M_AP_KEY +//#define MAIN_M2M_AP_KEY "12345FFFFF" +//#endif +// +//// SSID mode +//// <0=>SSID is visible to others +//// <1=>SSID is hidden +//// app_main_m2m_ap_ssid_mode +//#ifndef MAIN_M2M_AP_SSID_MODE +//#define MAIN_M2M_AP_SSID_MODE 0 +//#endif +//// +//// DHCP server IP address in AP (access point) mode +//// DHCP server IP address 1 <0-255> +//// app_ip_address_1 +//#ifndef DHCP_IP_ADDRESS_1 +//#define DHCP_IP_ADDRESS_1 192 +//#endif +// +//// DHCP server IP address 2 <0-255> +//// app_ip_address_2 +//#ifndef DHCP_IP_ADDRESS_2 +//#define DHCP_IP_ADDRESS_2 168 +//#endif +// +//// DHCP server IP address 3 <0-255> +//// app_ip_address_3 +//#ifndef DHCP_IP_ADDRESS_3 +//#define DHCP_IP_ADDRESS_3 1 +//#endif +// +//// DHCP server IP address 4 <0-255> +//// app_ip_address_4 +//#ifndef DHCP_IP_ADDRESS_4 +//#define DHCP_IP_ADDRESS_4 1 +//#endif +//// +//// <<< end of configuration section >>> +// +///** Using broadcast address for simplicity. */ +//#define MAIN_SERVER_PORT (80) +// +///** Using IP address. */ +//#define IPV4_BYTE(val, index) ((val >> (index * 8)) & 0xFF) +// +///** Send buffer of TCP socket. */ +//#define MAIN_PREFIX_BUFFER "GET /data/2.5/weather?q=" +//#define MAIN_POST_BUFFER \ +// "&mode=xml&units=metric&appid=c592e14137c3471fa9627b44f6649db4 HTTP/1.1\r\nHost: " \ +// "api.openweathermap.org\r\nAccept: */*\r\n\r\n" +///** Weather information provider server. */ +//#define MAIN_WEATHER_SERVER_NAME "openweathermap.org" +// +///** Input City Name. */ +//#define MAIN_CITY_NAME "london" +// +///** Receive buffer size. */ +//#define MAIN_WIFI_M2M_BUFFER_SIZE 1024 +// +//#define MAIN_M2M_DHCP_SERVER_IP \ +// { \ +// DHCP_IP_ADDRESS_1, DHCP_IP_ADDRESS_2, DHCP_IP_ADDRESS_3, DHCP_IP_ADDRESS_4 \ +// } +//#define MAIN_HTTP_PROV_SERVER_DOMAIN_NAME "atmel.com" +// +//#define MAIN_MAC_ADDRESS \ +// { \ +// 0xf8, 0xf0, 0x05, 0x45, 0xD4, 0x84 \ +// } +// +//#define MAIN_HEX2ASCII(x) (((x) >= 10) ? (((x)-10) + 'A') : ((x) + '0')) +// +//#define TEMPERATURE_ABS(a) (((a) > 0) ? (a) : -(a)) +// +//static tstrM2MAPConfig gstrM2MAPConfig = {MAIN_M2M_SSID, +// 1, +// 0, +// sizeof(MAIN_M2M_AP_KEY) - 1, +// MAIN_M2M_AP_KEY, +// MAIN_M2M_AP_SEC, +// MAIN_M2M_AP_SSID_MODE, +// MAIN_M2M_DHCP_SERVER_IP}; +// +//static CONST char gacHttpProvDomainName[] = MAIN_HTTP_PROV_SERVER_DOMAIN_NAME; +// +//static uint8 gau8MacAddr[] = MAIN_MAC_ADDRESS; +//static sint8 gacDeviceName[] = MAIN_M2M_SSID; +// +//#define MAIN_WAITING_TIME 3000 +//#define MAIN_RETRY_COUNT 10 + +#ifdef __cplusplus +} +#endif + +#endif /* MAIN_H_INCLUDED */ diff --git a/ChaloupeLora.X/Source/system.c b/ChaloupeLora.X/Source/system.c new file mode 100644 index 0000000..5dca97c --- /dev/null +++ b/ChaloupeLora.X/Source/system.c @@ -0,0 +1,20 @@ +/******************************************************************************/ +/* Files to Include */ +/******************************************************************************/ + +#include /* Include to use PIC32 peripheral libraries */ +#include /* For uint32_t definition */ +#include /* For true/false definition */ +#include "system.h" /* variables/params used by system.c */ + +/******************************************************************************/ +/* System Level Functions */ +/* */ +/* Custom oscillator configuration funtions, reset source evaluation */ +/* functions, and other non-peripheral microcontroller initialization */ +/* functions get placed in system.c */ +/* */ +/******************************************************************************/ + +/* */ + diff --git a/ChaloupeLora.X/Source/system.h b/ChaloupeLora.X/Source/system.h new file mode 100644 index 0000000..f1f513b --- /dev/null +++ b/ChaloupeLora.X/Source/system.h @@ -0,0 +1,19 @@ +/******************************************************************************/ +/* System Level #define Macros */ +/******************************************************************************/ + +/* TODO Define system operating frequency */ + +/* Microcontroller MIPs (FCY) */ +#define SYS_FREQ 80000000L +#define FCY SYS_FREQ + +/******************************************************************************/ +/* System Function Prototypes */ +/******************************************************************************/ + +/* Custom oscillator configuration funtions, reset source evaluation +functions, and other non-peripheral microcontroller initialization functions +go here. */ + + diff --git a/ChaloupeLora.X/Source/template.c b/ChaloupeLora.X/Source/template.c new file mode 100644 index 0000000..97c3ffe --- /dev/null +++ b/ChaloupeLora.X/Source/template.c @@ -0,0 +1,38 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" + +/* Global variables */ + +/* Implementation */ + +//---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- + +//EOF + diff --git a/ChaloupeLora.X/Source/template.h b/ChaloupeLora.X/Source/template.h new file mode 100644 index 0000000..31f9d80 --- /dev/null +++ b/ChaloupeLora.X/Source/template.h @@ -0,0 +1,47 @@ +/******************************************************************************* +* * +* Copyright 2012 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +### YYYYMMDD JFM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef TEMPLATE_H +#define TEMPLATE_H + +/* ************************************************************************** */ +/* Includes */ + + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ + + +/* ************************************************************************** */ +/* Prototypes */ + + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/timer.c b/ChaloupeLora.X/Source/timer.c new file mode 100644 index 0000000..97729b3 --- /dev/null +++ b/ChaloupeLora.X/Source/timer.c @@ -0,0 +1,300 @@ +/******************************************************************************* + * * + * Copyright 2010 Rheinmetall Canada Inc. * + * * + * No part of this document may be reproduced, stored in * + * a retrieval system, or transmitted, in any form or by any means, * + * electronic, mechanical, photocopying, recording, or otherwise, * + * without the prior written permission of Rheinmetall Canada Inc. * + * * + *******************************************************************************/ + +#include "timer.h" +#include "define.h" +#include +//#include +//#include "./FatFS/diskio.h" + +//unsigned int MillisecCounter[TIMER_MAX_ID]; +//unsigned int SecondCounter; +//int CalcPeriod; +stTimer astTimer[TIMER_MAX_ID]; + +//------------------------------------------------------- +void TimerInit(void) +{ +#ifdef GP_TIMER_USE_TIMER_1 + + T1CON = 0; + + T1CONbits.TCKPS = 0b01; //1:8 prescaler + TMR1 = 0; + PR1 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms + + IPC1bits.T1IP = 2; //timer interrupt priority = 2; + IPC1bits.T1IS = 3; //timer interrupt sub-priority = 2; + IFS0bits.T1IF = 0; + IEC0bits.T1IE = 1; //start timer + + T1CONbits.ON = 1; + +#endif +#ifdef GP_TIMER_USE_TIMER_2 + T2CON = 0; + + T2CONbits.TCKPS = 0b011; //1:8 prescaler + TMR2 = 0; + PR2 = 10000; //77.824MHz clock with 1:8 prescaler = timer period of 102.8ns. 1ms period --> 9728 * 102.8ns = 1ms + + IPC2bits.T2IP = 2; //timer interrupt priority = 2; + IPC2bits.T2IS = 3; //timer interrupt sub-priority = 2; + IFS0bits.T2IF = 0; + IEC0bits.T2IE = 1; //start timer + + T2CONbits.ON = 1; +#endif + + memset(&astTimer[0], 0, sizeof(astTimer)); +} + +//------------------------------------------------------- +/*unsigned int GetActualTimerMilliSec(void) + { + return MillisecCounter; + }*/ + +//------------------------------------------------------- +/*unsigned int GetActualTimerSec(void) + { + return SecondCounter; + }*/ + + +//------------------------------------------------------- +int IsMilliSecTimerExpired(eTimerID p_eTimerID) +{ + int CalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + CalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + //if(CalcPeriod > 0 && CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + if(CalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(CalcPeriod < 0) + { + if((1000 + CalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + + return 0; +} + +//------------------------------------------------------- +int IsSecTimerExpired(eTimerID p_eTimerID) +{ + int iCalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart; + //if(iCalcPeriod > 0 && iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiSecondCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + //TimerReset(p_eTimerID); + (astTimer+p_eTimerID)->uiSecondCounter = 0; + return 1; + } + } + } + + return 0; +} + +//------------------------------------------------------- +int IsTimerExpired(eTimerID p_eTimerID) +{ + int iCalcPeriod = 0; + + if ((astTimer+p_eTimerID)->bRunning) + { + /*if (IsSecTimerExpired(p_eTimerID) && IsMilliSecTimerExpired(p_eTimerID)) + return 1;*/ + + iCalcPeriod = (astTimer+p_eTimerID)->uiSecondCounter - (astTimer+p_eTimerID)->uiStart; + + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + else if(iCalcPeriod < 0) + { + if(((unsigned)0xFFFFFFFF + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodSecond) + { + iCalcPeriod = (astTimer+p_eTimerID)->uiMillisecCounter - (astTimer+p_eTimerID)->uiStart; + if(iCalcPeriod >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + else if(iCalcPeriod < 0) + { + if((1000 + iCalcPeriod) >= (astTimer+p_eTimerID)->uiPeriodMillisec) + { + (astTimer+p_eTimerID)->uiSecondCounter = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + return 1; + } + } + } + } + } + + return 0; +} + +//------------------------------------------------------- +void TimerStart(eTimerID p_eTimerID, unsigned int p_uiPeriod) +{ + (astTimer+p_eTimerID)->bRunning = true; + if (p_uiPeriod >= 1000) + { + (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod / 1000; + (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod % 1000; + } + else + { + (astTimer+p_eTimerID)->uiPeriodSecond = 0; + (astTimer+p_eTimerID)->uiPeriodMillisec = p_uiPeriod; + } + TimerReset(p_eTimerID); +} +void TimerStartSeconds(eTimerID p_eTimerID, unsigned int p_uiPeriod) +{ + (astTimer+p_eTimerID)->bRunning = true; + (astTimer+p_eTimerID)->uiPeriodSecond = p_uiPeriod; + (astTimer+p_eTimerID)->uiPeriodMillisec = 0; + TimerReset(p_eTimerID); +} +//------------------------------------------------------- +void TimerReset(eTimerID p_eTimerID) +{ + (astTimer+p_eTimerID)->uiStart = 0; + (astTimer+p_eTimerID)->uiMillisecCounter = 0; + (astTimer+p_eTimerID)->uiSecondCounter = 0; +} + +//------------------------------------------------------- +bool IsTimerRunning(eTimerID p_eTimerID) +{ + return (astTimer+p_eTimerID)->bRunning; +} + + +//------------------------------------------------------- +void TimerStop(eTimerID p_eTimerID) +{ + (astTimer+p_eTimerID)->bRunning = false; +} + +//------------------------------------------------------- +void Sleep(unsigned int timeout) +{ + TimerStart(SLEEP_FCN_TIMER,timeout); + + while(!IsTimerExpired(SLEEP_FCN_TIMER)) + { + Nop(); + } + TimerStop(SLEEP_FCN_TIMER); +} + + +#ifdef GP_TIMER_USE_TIMER_1 + +void __ISR(_TIMER_1_VECTOR, ipl2) Timer1MilliSecInterrupt(void) +{ + unsigned int i; + stTimer* pstPtr = &astTimer[0]; + + // disk_timerproc(); + + // Update all timers + for (i=0; ibRunning) + { + if(pstPtr->uiMillisecCounter++ == 1000) + { + pstPtr->uiMillisecCounter = 0; + pstPtr->uiSecondCounter++; + } + } + pstPtr++; + } + + IFS0bits.T1IF = 0; //Clear interrupt flag +} +#endif + +#ifdef GP_TIMER_USE_TIMER_2 + +void __ISR(_TIMER_2_VECTOR, ipl2) Timer2MilliSecInterrupt(void) { + unsigned int i; + stTimer* pstPtr = &astTimer[0]; + + //disk_timerproc(); + + // Update all timers + for (i = 0; i < TIMER_MAX_ID; i++) { + // update timer only if timer is running + if (pstPtr->bRunning) { + if (pstPtr->uiMillisecCounter++ == 1000) { + pstPtr->uiMillisecCounter = 0; + pstPtr->uiSecondCounter++; + } + } + pstPtr++; + } + + IFS0bits.T2IF = 0; //Clear interrupt flag +} +#endif + +//EOF + + diff --git a/ChaloupeLora.X/Source/timer.h b/ChaloupeLora.X/Source/timer.h new file mode 100644 index 0000000..e2cd076 --- /dev/null +++ b/ChaloupeLora.X/Source/timer.h @@ -0,0 +1,82 @@ +/******************************************************************************* +* * +* Copyright 2010 Rheinmetall Canada Inc. * +* * +* No part of this document may be reproduced, stored in * +* a retrieval system, or transmitted, in any form or by any means, * +* electronic, mechanical, photocopying, recording, or otherwise, * +* without the prior written permission of Rheinmetall Canada Inc. * +* * +*******************************************************************************/ +/* + Description: + This is a template file for standard C header file. + +*/ + +/* ************************************************************************** */ +/* Revision: +000 20100616 HCAM + Original version. + +### YYYYMMDD Initial, Bug Identification + Change description. + */ + +#ifndef TIMER_H +#define TIMER_H + + +/* ************************************************************************** */ +/* Includes */ +#include "define.h" + +/* ************************************************************************** */ +/* Defines */ + + +/* ************************************************************************** */ +/* Type definitions */ +typedef enum +{ + HEARTBEAT_LED_TMR = 0, + CHALET_POWER_RELAY_COIL_TIMER, + SLEEP_FCN_TIMER, + BATTERY_MONITOR_TIMER, + CHALET_POWER_RELAY_AUTOTURNOFF_TIMER, + WIFI_RECONNECT_TIMER, + WIFI_TICK_TIMER, + SYSLOG_TX_TIMER, + TEMP_SENSOR_REFRESH_TIMER, + BOOTLOADER_FLASH_POLL_TIMER, + LORA_WATCHDOG_TIMER, + TIMER_MAX_ID +}eTimerID; + +typedef struct +{ + unsigned int uiStart; + unsigned int uiMillisecCounter; + unsigned int uiSecondCounter; + unsigned int uiPeriodMillisec; + unsigned int uiPeriodSecond; + bool bRunning; +} stTimer; + +/* ************************************************************************** */ +/* Prototypes */ +void TimerInit(void); +int IsMilliSecTimerExpired(eTimerID p_eTimerID); +int IsSecTimerExpired(eTimerID p_eTimerID); +int IsTimerExpired(eTimerID p_eTimerID); +void TimerStart(eTimerID p_eTimerID, unsigned int p_uiPeriod); +void TimerStartSeconds(eTimerID p_eTimerID, unsigned int p_uiPeriod); +void TimerStop(eTimerID p_eTimerID); +void TimerReset(eTimerID p_eTimerID); +bool IsTimerRunning(eTimerID p_eTimerID); + +void Sleep(unsigned int millisecs); + +#endif +//EOF + diff --git a/ChaloupeLora.X/Source/versionbuild.h b/ChaloupeLora.X/Source/versionbuild.h new file mode 100644 index 0000000..ac6b02b --- /dev/null +++ b/ChaloupeLora.X/Source/versionbuild.h @@ -0,0 +1,5 @@ +#define VERSIONNUMBER "CHALET_V01.00.2" //shall be 15 chars... +//Force DHCP instead of static IP. + +//#define VERSIONNUMBER "CHALET_V01.00.1" //shall be 15 chars... +//#define VERSIONNUMBER "-__--TEST--__" //shall be 15 chars... diff --git a/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp.h b/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp.h new file mode 100644 index 0000000..abfbec3 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp.h @@ -0,0 +1,317 @@ +/** + * + * \file + * + * \brief WINC BSP API Declarations. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/** \defgroup nm_bsp BSP + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define NMI_API + +#include "winc1500_config.h" +#include "math.h" + +#define NM_EDGE_INTERRUPT (1) + +#define NM_DEBUG CONF_WINC_DEBUG +#define NM_BSP_PRINTF CONF_WINC_PRINTF +/*!< + * Attribute used to define memory section to map Functions in host memory. + */ +#define CONST const + +/*!< + * Used for code portability. + */ + +#ifndef NULL +#define NULL ((void *)0) +#endif +/*!< + * Void Pointer to '0' in case of NULL is not defined. + */ + +#define BSP_MIN(x, y) ((x) > (y) ? (y) : (x)) +/*!< + * Computes the minimum of \b x and \b y. + */ + +//@} + +/**@defgroup DataT DataTypes + * @ingroup nm_bsp + * @{ + */ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); +/*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + +/*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + +/*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; +/*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + +/*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + +/*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; +//@} + +#ifndef CORTUS_APP + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup BSPAPI Function + * @ingroup nm_bsp + */ + +/** @defgroup NmBspInitFn nm_bsp_init + * @ingroup BSPAPI + * + * Initialization for BSP (Board Support Package) such as Reset and Chip Enable Pins for WINC, delays, + * register ISR, enable/disable IRQ for WINC, ...etc. You must use this function in the head of your application to + * enable WINC and Host Driver to communicate with each other. + */ +/**@{*/ +/*! + * @fn sint8 nm_bsp_init(void); + * @brief This function is used to initialize the Board Support Package (BSP) in order to prepare the WINC + * before it start working. + * + * The nm_bsp_init function is the first function that should be called at the beginning of + * every application to initialize the BSP and the WINC board. Otherwise, the rest of the BSP function + * calls will return with failure. This function should also be called after the WINC has been switched off + with + * a successful call to "nm_bsp_deinit" in order to reinitialize the BSP before the user can use any of the + WINC API + * functions again. After the function initialize the WINC. Hard reset must be applied to start the WINC + board. + * @note Implementation of this function is host dependent. + * @warning inappropriate use of this function will lead to unavailability of host-chip communication.\n + * + * @see nm_bsp_deinit, nm_bsp_reset + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_init(void); +/**@}*/ + +/** @defgroup NmBspDeinitFn nm_bsp_deinit + * @ingroup BSPAPI + * De-initialization for BSP ((Board Support Package)). This function should be called only after + * a successful call to nm_bsp_init. + */ +/**@{*/ +/*! + * @fn sint8 nm_bsp_deinit(void); + * @pre The BSP should be initialized through \ref nm_bsp_init first. + * @brief This function is used to de-initialize the BSP and turn off the WINC board. + * + * The nm_bsp_deinit is the last function that should be called after the application has finished and + before the WINC is switched * off. The function call turns off the WINC board by setting CHIP_EN and + RESET_N signals low.Every function call of "nm_bsp_init" should + * be matched with a call to nm_bsp_deinit. Failure to do so may result in the WINC consuming higher power + than expected. + * @note Implementation of this function is host dependent. + * @warning misuse may lead to unknown behavior in case of soft reset.\n + * @see nm_bsp_init + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_deinit(void); +/**@}*/ + +/** @defgroup NmBspResetFn nm_bsp_reset + * @ingroup BSPAPI + * Resetting WINC1500 SoC by setting CHIP_EN and RESET_N signals low, then after specific delay the function will + * put CHIP_EN high then RESET_N high, for the timing between signals please review the WINC data-sheet + */ +/**@{*/ +/*! +* @fn void nm_bsp_reset(void); +* @param [in] None +* @brief Applies a hardware reset to the WINC board. +* The "nm_bsp_reset" is used to apply a hard reset to the WINC board by setting CHIP_EN and RESET_N +signals low, then after specific delay +* the function will put CHIP_EN high then RESET_N high, for the detailed timing between signals please +review the WINC data-sheet. After a * successful call, the WINC board firmware will kick off to load and +kick off the WINC firmware. This function should be called to reset the * WINC firmware after the BSP is +initialized and before the start of any communication with WINC board. Calling this function at any other time * +will result in losing the state and connections saved in the WINC board and starting again from the initial state. The +host driver will need +* to be de-initialized before calling nm_bsp_reset and initialized again after it using the " +m2m_wifi_(de)init". +* @pre Initialize \ref nm_bsp_init first +* @note Implementation of this function is host dependent and called by HIF layer. +* @warning Calling this function will drop any connection and internal state saved on the WINC firmware. +* @see nm_bsp_init, m2m_wifi_init, m2m_wifi_deinit +* @return None + +*/ +void nm_bsp_reset(void); +/**@}*/ + +/** @defgroup NmBspSleepFn nm_bsp_sleep + * @ingroup BSPAPI + * Sleep in units of milliseconds.\n + * This function used by HIF Layer according to different situations. + */ +/**@{*/ +/*! + * @fn void nm_bsp_sleep(uint32); + * @brief Used to put the host to sleep for the specified duration. + * Forcing the host to sleep for extended period may lead to host not being able to respond to WINC board + *events.It's important to be considerate while choosing the sleep period. + * @param [in] u32TimeMsec + * Time unit in milliseconds + * @pre Initialize \ref nm_bsp_init first + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds.\n + * @note Implementation of this function is host dependent. + * @see nm_bsp_init + * @return None + */ +void nm_bsp_sleep(uint32 u32TimeMsec); +/**@}*/ + +/** @defgroup NmBspRegisterFn nm_bsp_register_isr + * @ingroup BSPAPI + * Register ISR (Interrupt Service Routine) in the initialization of HIF (Host Interface) Layer. + * When the interrupt trigger the BSP layer should call the pfisr function once inside the interrupt. + */ +/**@{*/ +/*! + * @fn void nm_bsp_register_isr(tpfNmBspIsr); + * @param [in] tpfNmBspIsr pfIsr + * Pointer to ISR handler in HIF + * @brief Register the host interface interrupt service routine. + * WINC board utilize SPI interface to communicate with the host. This function register the SPI interrupt + the notify * the host whenever there is an outstanding message from the WINC board. The function should + be called during the initialization * of the host interface. It an internal driver function and shouldn't + be called by the application. + * @warning Make sure that ISR for IRQ pin for WINC is disabled by default in your implementation. + * @note Implementation of this function is host dependent and called by HIF layer. + * @see tpfNmBspIsr + * @return None + + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr); +/**@}*/ + +/** @defgroup NmBspInterruptCtrl nm_bsp_interrupt_ctrl + * @ingroup BSPAPI + * Synchronous enable/disable interrupts function + */ +/**@{*/ +/*! + * @fn void nm_bsp_interrupt_ctrl(uint8); + * @pre The interrupt must be registered using nm_bsp_register_isr first. + * @brief Enable/Disable interrupts + * This function can be used to enable/disable the WINC to host interrupt as the depending on how the driver + is implemented. + * It an internal driver function and shouldn't be called by the application. + * @param [in] u8Enable + * '0' disable interrupts. '1' enable interrupts + * @see tpfNmBspIsr, nm_bsp_register_isr + * @note Implementation of this function is host dependent and called by HIF layer. + * @return None + + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable); +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif + +#ifdef _NM_BSP_BIG_END +#define NM_BSP_B_L_32(x) \ + ((((x)&0x000000FF) << 24) + (((x)&0x0000FF00) << 8) + (((x)&0x00FF0000) >> 8) + (((x)&0xFF000000) >> 24)) +#define NM_BSP_B_L_16(x) ((((x)&0x00FF) << 8) + (((x)&0xFF00) >> 8)) +#else +#define NM_BSP_B_L_32(x) (x) +#define NM_BSP_B_L_16(x) (x) +#endif + +#endif /*_NM_BSP_H_*/ diff --git a/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp_internal.h b/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp_internal.h new file mode 100644 index 0000000..4ba0d1f --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/bsp/include/nm_bsp_internal.h @@ -0,0 +1,104 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 BSP APIs declarations. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_INTERNAL_H_ +#define _NM_BSP_INTERNAL_H_ + +#ifdef WIN32 +#include "nm_bsp_win32.h" +#endif + +#ifdef __K20D50M__ +#include "nm_bsp_k20d50m.h" +#endif + +#ifdef __MSP430FR5739__ +#include "bsp_msp430fr5739.h" +#endif + +#ifdef _FREESCALE_MCF51CN128_ +#include "bsp/include/nm_bsp_mcf51cn128.h" +#endif + +#ifdef __MCF964548__ +#include "bsp/include/nm_bsp_mc96f4548.h" +#endif + +#ifdef __APP_APS3_CORTUS__ +#include "nm_bsp_aps3_cortus.h" +#endif + +#if (defined __SAMR21G18A__) +#include "bsp/include/nm_bsp_samr21.h" +#endif + +#if (defined __SAML21J18A__) || (defined __SAML21J18B__) +#include "bsp/include/nm_bsp_saml21.h" +#endif + +#if (defined __SAML22N18A__) +#include "bsp/include/nm_bsp_saml22.h" +#endif + +#if (defined __SAM4S16C__) || (defined __SAM4SD32C__) +#include "bsp/include/nm_bsp_sam4s.h" +#endif + +#if (defined __SAME70Q21__) || (defined __SAMV71Q21__) +#include "bsp/include/nm_bsp_same70.h" +#endif + +#ifdef CORTUS_APP +#include "crt_iface.h" +#endif + +#ifdef NRF51 +#include "nm_bsp_nrf51822.h" +#endif + +#ifdef _ARDUINO_UNO_ +#include "bsp/include/nm_bsp_arduino_uno.h" +#endif + +#endif //_NM_BSP_INTERNAL_H_ diff --git a/ChaloupeLora.X/Source/winc1500/bsp/source/nm_bsp.c b/ChaloupeLora.X/Source/winc1500/bsp/source/nm_bsp.c new file mode 100644 index 0000000..2fc1f8a --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/bsp/source/nm_bsp.c @@ -0,0 +1,181 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "timer.h" +#include "define.h" +#include "BoardCfg.h" +//#include + +//#include "atmel_start.h" +//#include "winc_init.h" + +#ifndef CONF_WINC_EXT_INT_PIN +#define CONF_WINC_EXT_INT_PIN 0 +#endif + +static tpfNmBspIsr gpfIsr = NULL; + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + if (gpfIsr) + { + gpfIsr(); + } + + IFS0bits.INT0IF = 0; +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; +// +//JFM Not necessary, we know our timer base is 1ms... + +// /* Make sure a 1ms Systick is configured. */ +// if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { +// delay_init(SysTick); +// } + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_bsp_reset(void) +{ +// GP_DEBUG_1_PIN = 1; + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(10); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(15); + WIFI_CHP_RST_PIN = 1; + + // GP_DEBUG_1_PIN = 0; + + +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, false); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, false); +// nm_bsp_sleep(1); +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, true); +// nm_bsp_sleep(5); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + Sleep(u32TimeMsec); + + + +// while (u32TimeMsec--) { +// delay_ms(1); +// } +} + +/** + * \internal Get the PIO hardware instance + * + * \param[in] pin The PIO pin + * + * \return The instance of PIO hardware + */ + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + gpfIsr = pfIsr; +// +// ext_irq_register(CONF_WINC_EXT_INT_PIN, chip_isr); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if(u8Enable == 0) + { + IEC0bits.INT0IE = 0; + } + else + { + IEC0bits.INT0IE = 1; + } +// _ext_irq_enable(CONF_WINC_EXT_INT_PIN, u8Enable); +} diff --git a/ChaloupeLora.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h b/ChaloupeLora.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h new file mode 100644 index 0000000..2c7102a --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/bus_wrapper/include/nm_bus_wrapper.h @@ -0,0 +1,173 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BUS_WRAPPER_H_ +#define _NM_BUS_WRAPPER_H_ + +#include "common/include/nm_common.h" + +/** + BUS Type +**/ +#define NM_BUS_TYPE_I2C ((uint8)0) +#define NM_BUS_TYPE_SPI ((uint8)1) +#define NM_BUS_TYPE_UART ((uint8)2) +/** + IOCTL commands +**/ +#define NM_BUS_IOCTL_R ((uint8)0) /*!< Read only ==> I2C/UART. Parameter:tstrNmI2cDefault/tstrNmUartDefault */ +#define NM_BUS_IOCTL_W ((uint8)1) /*!< Write only ==> I2C/UART. Parameter type tstrNmI2cDefault/tstrNmUartDefault*/ +#define NM_BUS_IOCTL_W_SPECIAL \ + ((uint8)2) /*!< Write two buffers within the same transaction \ + (same start/stop conditions) ==> I2C only. Parameter:tstrNmI2cSpecial */ +#define NM_BUS_IOCTL_RW ((uint8)3) /*!< Read/Write at the same time ==> SPI only. Parameter:tstrNmSpiRw */ + +#define NM_BUS_IOCTL_WR_RESTART \ + ((uint8)4) /*!< Write buffer then made restart condition then read ==> I2C only. parameter:tstrNmI2cSpecial */ +/** + * @struct tstrNmBusCapabilities + * @brief Structure holding bus capabilities information + * @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI + */ +typedef struct { + uint16 u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +/** + * @struct tstrNmI2cDefault + * @brief Structure holding I2C default operation parameters + * @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W + */ +typedef struct { + uint8 u8SlaveAdr; + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmI2cDefault; + +/** + * @struct tstrNmI2cSpecial + * @brief Structure holding I2C special operation parameters + * @sa NM_BUS_IOCTL_W_SPECIAL + */ +typedef struct { + uint8 u8SlaveAdr; + uint8 *pu8Buf1; /*!< pointer to the 1st buffer */ + uint8 *pu8Buf2; /*!< pointer to the 2nd buffer */ + uint16 u16Sz1; /*!< 1st buffer size */ + uint16 u16Sz2; /*!< 2nd buffer size */ +} tstrNmI2cSpecial; + +/** + * @struct tstrNmSpiRw + * @brief Structure holding SPI R/W parameters + * @sa NM_BUS_IOCTL_RW + */ +typedef struct { + uint8 *pu8InBuf; /*!< pointer to input buffer. + Can be set to null and in this case zeros should be sent at MOSI */ + uint8 *pu8OutBuf; /*!< pointer to output buffer. + Can be set to null and in this case data from MISO can be ignored */ + uint16 u16Sz; /*!< Transfere size */ +} tstrNmSpiRw; + +/** + * @struct tstrNmUartDefault + * @brief Structure holding UART default operation parameters + * @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W + */ +typedef struct { + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmUartDefault; +/*!< Bus capabilities. This structure must be declared at platform specific bus wrapper */ +extern tstrNmBusCapabilities egstrNmBusCapabilities; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_init(void *); + +/** + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param [in] u8Cmd + * IOCTL command for the operation + * @param [in] pvParameter + * Arbitrary parameter depending on IOCTL + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter); + +/** + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_deinit(void); + +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *); +/* + * @fn nm_bus_get_chip_type + * @brief get chip type + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +#ifdef CONF_WINC_USE_UART +uint8 nm_bus_get_chip_type(void); +sint8 nm_bus_break(void); +#endif +#ifdef __cplusplus +} +#endif + +#endif /*_NM_BUS_WRAPPER_H_*/ diff --git a/ChaloupeLora.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c b/ChaloupeLora.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c new file mode 100644 index 0000000..edb34c8 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/bus_wrapper/source/nm_bus_wrapper.c @@ -0,0 +1,206 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" +//#include "atmel_start.h" +//#include "winc_init.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = {NM_BUS_MAX_TRX_SZ}; + + +static sint8 spi_rw(uint8 *pu8Mosi, uint8 *pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + + if (!u8SkipMiso) + { + while(u16Sz-- != 0) + { + uint8 tmp; + tmp = SPITransaction(0xDE); + *pu8Miso++ = tmp; + } + } + if (!u8SkipMosi) + { + while(u16Sz-- != 0) + { + uint8 tmp; + tmp = SPITransaction(*pu8Mosi++); //assign to tmp for debug purposes only. + } + } + WIFI_SPI_SS_PIN = 1; + + + /*uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, false); + if (!u8SkipMiso) { + io_read(io, pu8Miso, u16Sz); + } + if (!u8SkipMosi) { + io_write(io, pu8Mosi, u16Sz); + } + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, true);*/ + + return M2M_SUCCESS; +} + +/* + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_init(void *pvinit) +{ + sint8 result = M2M_SUCCESS; + nm_bsp_reset(); + nm_bsp_sleep(1); + return result; +} + + + + //JFM The SPI module has been initialized in InitBoard() + //so the two following lines are not needed. +/* spi_m_sync_get_io_descriptor(spi_instance, &io); + spi_m_sync_enable(spi_instance);/* + + nm_bsp_reset(); + nm_bsp_sleep(1); + + return result; +} + +/* + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param[IN] u8Cmd + * IOCTL command for the operation + * @param[IN] pvParameter + * Arbitrary parameter depenging on IOCTL + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter) +{ + sint8 s8Ret = 0; + switch (u8Cmd) + { + case NM_BUS_IOCTL_RW: + { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + break; + } + + + default: + { + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + } + return s8Ret; +} + +/* + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + */ +sint8 nm_bus_deinit(void) +{ + sint8 result = 0; + return result; +} +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *config) +{ + return M2M_SUCCESS; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc1500/common/include/nm_common.h b/ChaloupeLora.X/Source/winc1500/common/include/nm_common.h new file mode 100644 index 0000000..043ec1d --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/common/include/nm_common.h @@ -0,0 +1,150 @@ +/** + * + * \file + * + * \brief WINC Driver Common API Declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_debug.h" + +/**@defgroup CommonDefines CommonDefines + * @ingroup WlanDefines + */ +/**@{*/ +#define M2M_TIME_OUT_DELAY 10000 + +/*states*/ +#define M2M_SUCCESS ((sint8)0) +#define M2M_ERR_SEND ((sint8)-1) +#define M2M_ERR_RCV ((sint8)-2) +#define M2M_ERR_MEM_ALLOC ((sint8)-3) +#define M2M_ERR_TIME_OUT ((sint8)-4) +#define M2M_ERR_INIT ((sint8)-5) +#define M2M_ERR_BUS_FAIL ((sint8)-6) +#define M2M_NOT_YET ((sint8)-7) +#define M2M_ERR_FIRMWARE ((sint8)-8) +#define M2M_SPI_FAIL ((sint8)-9) +#define M2M_ERR_FIRMWARE_bURN ((sint8)-10) +#define M2M_ACK ((sint8)-11) +#define M2M_ERR_FAIL ((sint8)-12) +#define M2M_ERR_FW_VER_MISMATCH ((sint8)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((sint8)-14) +#define M2M_ERR_INVALID_ARG ((sint8)-15) +#define M2M_ERR_INVALID ((sint8)-16) + +/*i2c MAASTER ERR*/ +#define I2C_ERR_LARGE_ADDRESS 0xE1UL /*the address exceed the max addressing mode in i2c flash*/ +#define I2C_ERR_TX_ABRT 0xE2UL /*NO ACK from slave*/ +#define I2C_ERR_OVER_SIZE 0xE3UL /**/ +#define ERR_PREFIX_NMIS 0xE4UL /*wrong first four byte in flash NMIS*/ +#define ERR_FIRMEWARE_EXCEED_SIZE 0xE5UL /*Total size of firmware exceed the max size 256k*/ +/**/ +#define PROGRAM_START 0x26961735UL +#define BOOT_SUCCESS 0x10add09eUL +#define BOOT_START 0x12345678UL + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +#define M2M_MAX(A, B) ((A) > (B) ? (A) : (B)) +#define M2M_SEL(x, m1, m2, m3) ((x > 1) ? ((x > 2) ? (m3) : (m2)) : (m1)) +#define WORD_ALIGN(val) (((val)&0x03) ? ((val) + 4 - ((val)&0x03)) : (val)) + +#define DATA_PKT_OFFSET 4 + +#ifndef BIG_ENDIAN +#define BYTE_0(word) ((uint8)(((word) >> 0) & 0x000000FFUL)) +#define BYTE_1(word) ((uint8)(((word) >> 8) & 0x000000FFUL)) +#define BYTE_2(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +#define BYTE_3(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#else +#define BYTE_0(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#define BYTE_1(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +#define BYTE_2(word) ((uint8)(((word) >> 8) & 0x000000FFUL)) +#define BYTE_3(word) ((uint8)(((word) >> 0) & 0x000000FFUL)) +#endif + +/**@}*/ +#ifdef __cplusplus +extern "C" { +#endif +NMI_API void m2m_memcpy(uint8 *pDst, uint8 *pSrc, uint32 sz); +NMI_API void m2m_memset(uint8 *pBuf, uint8 val, uint32 sz); +NMI_API uint16 m2m_strlen(uint8 *pcStr); +NMI_API sint8 m2m_memcmp(uint8 *pu8Buff1, uint8 *pu8Buff2, uint32 u32Size); +NMI_API uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); +NMI_API uint8 *m2m_strstr(uint8 *pcIn, uint8 *pcStr); +NMI_API uint8 m2m_checksum(uint8 *buf, int sz); + +#ifdef __cplusplus +} +#endif +#endif /*_NM_COMMON_H_*/ diff --git a/ChaloupeLora.X/Source/winc1500/common/include/nm_debug.h b/ChaloupeLora.X/Source/winc1500/common/include/nm_debug.h new file mode 100644 index 0000000..d5ff946 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/common/include/nm_debug.h @@ -0,0 +1,117 @@ +/** + * + * \file + * + * \brief This module contains debug APIs declarations. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + +#include "bsp/include/nm_bsp.h" +/* #include "bsp/include/nm_bsp_internal.h" */ + +/**@defgroup DebugDefines DebugDefines + * @ingroup WlanDefines + */ +/**@{*/ + +#define M2M_LOG_NONE 0 +#define M2M_LOG_ERROR 1 +#define M2M_LOG_INFO 2 +#define M2M_LOG_REQ 3 +#define M2M_LOG_DBG 4 + +#if (defined __APS3_CORTUS__) +#define M2M_LOG_LEVEL M2M_LOG_INFO +#else +#define M2M_LOG_LEVEL M2M_LOG_REQ +#endif + +#define M2M_ERR(...) +#define M2M_INFO(...) +#define M2M_REQ(...) +#define M2M_DBG(...) +#define M2M_PRINT(...) + +#if (CONF_WINC_DEBUG == 1) +#undef M2M_PRINT +#define M2M_PRINT(...) \ + do { \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_ERROR) +#undef M2M_ERR +#define M2M_ERR(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(ERR)[%s][%d]", __FUNCTION__, __LINE__); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_INFO) +#undef M2M_INFO +#define M2M_INFO(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(INFO)"); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_REQ) +#undef M2M_REQ +#define M2M_REQ(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(R)"); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#if (M2M_LOG_LEVEL >= M2M_LOG_DBG) +#undef M2M_DBG +#define M2M_DBG(...) \ + do { \ + CONF_WINC_PRINTF("(APP)(DBG)[%s][%d]", __FUNCTION__, __LINE__); \ + CONF_WINC_PRINTF(__VA_ARGS__); \ + CONF_WINC_PRINTF("\r"); \ + } while (0) +#endif /*M2M_LOG_DBG*/ +#endif /*M2M_LOG_REQ*/ +#endif /*M2M_LOG_INFO*/ +#endif /*M2M_LOG_ERROR*/ +#endif /*CONF_WINC_DEBUG */ + +/**@}*/ +#endif /* _NM_DEBUG_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/common/source/nm_common.c b/ChaloupeLora.X/Source/winc1500/common/source/nm_common.c new file mode 100644 index 0000000..a39b7db --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/common/source/nm_common.c @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +void m2m_memcpy(uint8 *pDst, uint8 *pSrc, uint32 sz) +{ + if (sz == 0) + return; + do { + *pDst = *pSrc; + pDst++; + pSrc++; + } while (--sz); +} +uint8 m2m_checksum(uint8 *buf, int sz) +{ + uint8 cs = 0; + while (--sz) { + cs ^= *buf; + buf++; + } + + return cs; +} + +void m2m_memset(uint8 *pBuf, uint8 val, uint32 sz) +{ + if (sz == 0) + return; + do { + *pBuf = val; + pBuf++; + } while (--sz); +} + +uint16 m2m_strlen(uint8 *pcStr) +{ + uint16 u16StrLen = 0; + while (*pcStr) { + u16StrLen++; + pcStr++; + } + return u16StrLen; +} + +uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len) +{ + for (; u16Len > 0; pcS1++, pcS2++, --u16Len) + if (*pcS1 != *pcS2) + return ((*(uint8 *)pcS1 < *(uint8 *)pcS2) ? -1 : +1); + else if (*pcS1 == '\0') + return 0; + return 0; +} + +/* Finds the occurance of pcStr in pcIn. +If pcStr is part of pcIn it returns a valid pointer to the start of pcStr within pcIn. +Otherwise a NULL Pointer is returned. +*/ +uint8 *m2m_strstr(uint8 *pcIn, uint8 *pcStr) +{ + uint8 u8c; + uint16 u16StrLen; + + u8c = *pcStr++; + if (!u8c) + return (uint8 *)pcIn; // Trivial empty string case + + u16StrLen = m2m_strlen(pcStr); + do { + uint8 u8Sc; + + do { + u8Sc = *pcIn++; + if (!u8Sc) + return (uint8 *)0; + } while (u8Sc != u8c); + } while (m2m_strncmp(pcIn, pcStr, u16StrLen) != 0); + + return (uint8 *)(pcIn - 1); +} + +sint8 m2m_memcmp(uint8 *pu8Buff1, uint8 *pu8Buff2, uint32 u32Size) +{ + uint32 i; + sint8 s8Result = 0; + for (i = 0; i < u32Size; i++) { + if (pu8Buff1[i] != pu8Buff2[i]) { + s8Result = 1; + break; + } + } + return s8Result; +} diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/ecc_types.h b/ChaloupeLora.X/Source/winc1500/driver/include/ecc_types.h new file mode 100644 index 0000000..ef1d4d5 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/ecc_types.h @@ -0,0 +1,232 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _FIRMWARE_ +#include "driver/include/m2m_types.h" +#else +#include "m2m_types.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + +#if 0 +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +#endif +/*!< + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve { + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +} tenuEcNamedCurve; + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint { + uint8 X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8 Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16 u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16 u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +} tstrECPoint; + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam { + uint32 p[ECC_POINT_MAX_SIZE_WORDS]; + uint32 a[ECC_POINT_MAX_SIZE_WORDS]; + uint32 b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +} tstrECDomainParam; + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct { + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +} tstrEllipticCurve; + +typedef enum { + ECC_REQ_NONE, + ECC_REQ_CLIENT_ECDH, + ECC_REQ_SERVER_ECDH, + ECC_REQ_GEN_KEY, + ECC_REQ_SIGN_GEN, + ECC_REQ_SIGN_VERIFY +} tenuEccREQ; + +typedef struct { + tstrECPoint strPubKey; + uint8 au8Key[ECC_POINT_MAX_SIZE]; +} tstrEcdhReqInfo; + +typedef struct { + uint32 u32nSig; +} tstrEcdsaVerifyReqInfo; + +typedef struct { + uint16 u16CurveType; + uint16 u16HashSz; +} tstrEcdsaSignReqInfo; + +typedef struct { + uint16 u16REQ; + uint16 u16Status; + uint32 u32UserData; + uint32 u32SeqNo; + union { + tstrEcdhReqInfo strEcdhREQ; + tstrEcdsaSignReqInfo strEcdsaSignREQ; + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + }; +} tstrEccReqInfo; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#if 0 +static tstrEllipticCurve gastrECCSuppList[] = { + { + EC_SECP256R1, + { + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0x27D2604B, 0x3BCE3C3E, 0xCC53B0F6, 0x651D06B0, 0x769886BC, 0xB3EBBD55, 0xAA3A93E7, 0x5AC635D8}, + { + { + 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, 0x63, 0xA4, 0x40, 0xF2, + 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 + }, + { + 0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A, 0x7C, 0x0F, 0x9E, 0x16, + 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5 + }, + 32 + } + } + } +}; +#endif + +/*!< + List of supported Elliptic Curves ordered by security level (most secure curve is at index ZERO). +*/ + +#endif /* __ECC_TYPES_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ate_mode.h b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ate_mode.h new file mode 100644 index 0000000..6f9c14a --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ate_mode.h @@ -0,0 +1,750 @@ +/** + * + * \file + * + * \brief WINC ATE Test Driver Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ + +#ifndef _M2M_ATE_MODE_H_ +#define _M2M_ATE_MODE_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/** \defgroup m2m_ate ATE + */ +/**@defgroup ATEDefine Defines + * @ingroup m2m_ate + * @{ + */ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_ATE_MAX_NUM_OF_RATES (20) +/*!< +Maximum number of all rates (b,g and n) + */ +#define M2M_ATE_MAX_FRAME_LENGTH (1024) +/*!< Maximum number of length for each frame + */ +#define M2M_ATE_MIN_FRAME_LENGTH (1) +/*!< Minimum number of length for each frame + */ +#define M2M_ATE_SUCCESS (M2M_SUCCESS) +/*!< No Error and operation completed successfully. + */ +#define M2M_ATE_ERR_VALIDATE (M2M_ERR_FAIL) +/*!< Error in parameters passed to functions. + */ +#define M2M_ATE_ERR_TX_ALREADY_RUNNING (-1) +/*!< Error in starting a transmission test. Another test is already running and its not allowed to start another ATE + * test. + */ +#define M2M_ATE_ERR_RX_ALREADY_RUNNING (-2) +/*!< Error in starting a reception test. Another test is already running and its not allowed to start another ATE test. + */ +#define M2M_ATE_ERR_UNHANDLED_CASE (-3) +/*!< Invalid case. + */ +#define M2M_ATE_RX_DISABLE_DA 0x0 +/*!< Filter selection for received frames: Disable filtering received frames by the destination address. + */ +#define M2M_ATE_RX_ENABLE_DA 0x1 +/*!< Filter selection for received frames: Enable filtering received frames by the destination address. + */ +#define M2M_ATE_RX_DISABLE_SA 0x0 +/*!< Filter selection for received frames: Disable filtering received frames by the source address. + */ +#define M2M_ATE_RX_ENABLE_SA 0x1 +/*!< Filter selection for received frames: Enable filtering received frames by the source address. + */ +#define M2M_ATE_DISABLE_SELF_MACADDR 0x0 +/*!\n",ret); + while(1); + } + //Initialize the OTA module + m2m_ota_init(OtaUpdateCb,NULL); + //connect to AP that provide connection to the OTA server + m2m_wifi_default_connect(); + + while(1) + { + + //Handle the app state machine plus the WINC event handler + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + + } + + } +} +@endcode + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 *u8DownloadUrl); +/**@}*/ +/** @defgroup OtaStartUpdatefn m2m_ota_start_update_crt + * @ingroup WLANAPI + * Request OTA start for cortus application image using the downloaded URL, the OTA module will download the OTA image + *and ensure integrity of the image, and update the validity of the image in control structure. Switching to that image + *requires calling @ref m2m_ota_switch_crt API. As a prerequisite @ref m2m_ota_init should be called before using + *@ref m2m_ota_start_update_crt(). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); + +@param [in] u8DownloadUrl + The cortus application image url. +@warning + Calling this API does not guarantee cortus application image update, It depends on the connection with the download +server and the validity of the image. If the API response is failure this may invalidate the roll-back image if it was +previously valid, since the WINC does not have any internal memory except the flash roll-back image location to validate +the downloaded image from + +@see + m2m_ota_init + tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_start_update_crt(uint8 *u8DownloadUrl); +/**@}*/ +/** @defgroup OtaRollbackfn m2m_ota_rollback +* @ingroup WLANAPI + Request OTA Roll-back to the old (other) WINC image, the WINC firmware will check the validation of the Roll-back +image and switch to it if it is valid. If the API response is success, system restart is required (re-initialize the +driver with hardware rest) update the host driver version may be required if it is did not match the minimum version +supported by the WINC firmware. + +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void); +/**@}*/ +/** @defgroup OtaRollbackfn m2m_ota_rollback_crt +* @ingroup WLANAPI + Request Cortus application OTA Roll-back to the old (other) cortus application image, the WINC firmware will check +the validation of the Roll-back image and switch to it if it is valid. If the API response is success, system restart is +required (re-initialize the driver with hardware rest) update the host driver version may be required. + +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback_crt(void); + +@sa + m2m_ota_init + m2m_ota_start_update_crt + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback_crt(void); +/**@}*/ +/** @defgroup OtaAbortfn m2m_ota_abort +* @ingroup WLANAPI + Request abort of current OTA download. + The WINC firmware will terminate the OTA download if one is in progress. + If no download is in progress, the API will respond with failure. +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void); +/**@}*/ +/**@}*/ +/** @defgroup OtaSwitchFirmware m2m_ota_switch_firmware +* @ingroup WLANAPI +* Switch to the upgraded Firmware, that API will update the control structure working image to the upgraded image + take effect will be on the next system restart +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@warning + It is important to note that if the API succeeds, system restart is required (re-initializing the driver with +hardware reset) updating the host driver version may be required if it does not match the minimum driver version +supported by the WINC's firmware. +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void); +/**@}*/ +/**@}*/ +/** @defgroup OtaSwitchFirmware m2m_ota_switch_crt +* @ingroup WLANAPI +* Switch to the upgraded cortus application, that API will update the control structure working image to the upgraded +image take effect will be on the next system restart +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@warning + It is important to note that if the API succeeds, system restart is required (re-initializing the driver with +hardware reset) updating the host driver version may be required if it does not match the minimum driver version +supported by the WINC's firmware. +@sa + m2m_ota_init + m2m_ota_start_update_crt + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_crt(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(void); + +@brief + Get the OTA Firmware version. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); +/**@}*/ +NMI_API sint8 m2m_ota_test(void); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/m2m_periph.h b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_periph.h new file mode 100644 index 0000000..ce2f009 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_periph.h @@ -0,0 +1,404 @@ +/** + * + * \file + * + * \brief WINC Peripherals Application Interface. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrPerphInitParam + +@brief + Peripheral module initialization parameters. +*/ +typedef struct { + void *arg; +} tstrPerphInitParam; + +/*! +@enum \ + tenuGpioNum + +@brief + A list of GPIO numbers configurable through the m2m_periph module. +*/ +typedef enum { + M2M_PERIPH_GPIO3, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO4, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO5, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO6, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + +/*! +@enum \ + tenuI2cMasterSclMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SCL signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is avaiable on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is avaiable on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is avaiable on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is avaiable on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is avaiable on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! +@enum \ + tenuI2cMasterSdaMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SDA signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK, /*!< I2C master SDA is avaiable on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is avaiable on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is avaiable on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is avaiable on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is avaiable on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + +/*! +@struct \ + tstrI2cMasterInitParam + +@brief + I2C master configuration parameters. +@sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt +*/ +typedef struct { + uint8 enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8 enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8 u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! +@enum \ + tenuI2cMasterFlags + +@brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read +@sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read +*/ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! +@enum \ + tenuPullupMask + +@brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. +@sa + m2m_periph_pullup_ctrl + +*/ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_DAT2_SPI_RXD = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 12), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 13), + M2M_PERIPH_PULLUP_DIS_I2C_SCL = (1ul << 14), + M2M_PERIPH_PULLUP_DIS_I2C_SDA = (1ul << 15), + M2M_PERIPH_PULLUP_DIS_GPIO_11 = (1ul << 16), + M2M_PERIPH_PULLUP_DIS_GPIO_12 = (1ul << 17), + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 18), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 19), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 20), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 21), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 22), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 23), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 24), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_21 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 28), + M2M_PERIPH_PULLUP_DIS_GPIO_24 = (1ul << 29), +} tenuPullupMask; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@fn \ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + +@brief + Initialize the NMC1500 peripheral driver module. + +@param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrPerphInitParam +*/ +NMI_API sint8 m2m_periph_init(tstrPerphInitParam *param); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + +@brief + Configure a specific NMC1500 pad as a GPIO and sets its direction (input or output). + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + +@brief + Set an NMC1500 GPIO output level high or low. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + +@brief + Read an NMC1500 GPIO input level. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 *pu8GpioVal); + +/*! +@fn \ + NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); + +@brief + Set an NMC1500 GPIO pullup resisitor enable or disable. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8PullupEn + Zero: pullup disabled. Non-zero: pullup enabled. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam * param); + +@brief + Initialize and configure the NMC1500 I2C master peripheral. + +@param [in] param + I2C master initialization structure. See members of tstrI2cMasterInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrI2cMasterInitParam +*/ +NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam *param); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint8 flags); + +@brief + Write a stream of bytes to the I2C slave device. + +@param [in] u8SlaveAddr + 7-bit I2C slave address. +@param [in] pu8Buf + A pointer to an input buffer which contains a stream of bytes. +@param [in] u16BufLen + Input buffer length in bytes. +@param [in] flags + Write operation bitwise-ORed flags. See tenuI2cMasterFlags. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuI2cMasterFlags +*/ +NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint8 flags); + +/*! +@fn \ + NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint16 * pu16ReadLen, +uint8 flags); + +@brief + Write a stream of bytes to the I2C slave device. + +@param [in] u8SlaveAddr + 7-bit I2C slave address. +@param [out] pu8Buf + A pointer to an output buffer in which a stream of bytes are received. +@param [in] u16BufLen + Max output buffer length in bytes. +@param [out] pu16ReadLen + Actual number of bytes received. +@param [in] flags + Write operation bitwise-ORed flags. See tenuI2cMasterFlags. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuI2cMasterFlags +*/ +NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint16 *pu16ReadLen, + uint8 flags); + +/*! +@fn \ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +@brief + Control the programmable pull-up resistor on the chip pads . + +@param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in +tenuPullupMask. + +@param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuPullupMask +*/ +NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_PERIPH_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ssl.h b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ssl.h new file mode 100644 index 0000000..4b6a7b5 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_ssl.h @@ -0,0 +1,182 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/**@defgroup SSLAPI SSL + */ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" +#include "ecc_types.h" +#include "socket/include/socket.h" + +/**@defgroup SSLEnums Enumeration/Typedefs + * @ingroup SSLAPI + * @{*/ + +/*! +@typedef \ + void (*tpfAppSslCb) (uint8 u8MsgType, void * pvMsg); + +@brief A callback to get SSL notifications. + +@param[in] u8MsgType +@param[in] pvMsg A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb)(uint8 u8MsgType, void *pvMsg); + +/**@} + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SSLFUNCTIONS Functions + * @ingroup SSLAPI + */ + +/**@{*/ +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! + @fn \ NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8 *pu8RspDataBuff, uint16 u16RspDataSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8 *pu8Buffer, uint32 u32BufferSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* + pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16 *pu16CurveType, uint8 *pu8Hash, uint8 *pu8Sig, tstrECPoint *pu8Key); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8 *pu8Hash, uint16 u16HashSz); + +/*! + @fn \ NMI_API void m2m_ssl_stop_processing_certs(void) + @brief Allow ssl driver to tidy up in case application does not read all available certificates. + @warning This API must only be called if some certificates are left unread. + @return None. +*/ +NMI_API void m2m_ssl_stop_processing_certs(void); + +/*! + @fn \ NMI_API void m2m_ssl_ecc_process_done(void) + @brief Allow ssl driver to tidy up after application has finished processing ecc message. + @warning This API must be called after receiving a SSL callback with type @ref M2M_SSL_REQ_ECC + @return None. +*/ +NMI_API void m2m_ssl_ecc_process_done(void); + +/*! +@fn \ + NMI_API sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the +form of a bitmap containing the required ciphers to be on. There is no need to call this function if the application +will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC +ciphersuites. The caller can override the default with any desired combination, except for combinations involving both +RSA and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. If u32SslCsBMP does not +contain any ciphersuites supported by firmware, then the current active list will not be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + +/**@}*/ +#endif /* __M2M_SSL_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/m2m_types.h b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_types.h new file mode 100644 index 0000000..c63246d --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_types.h @@ -0,0 +1,2511 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +//#include "m2m_svnrev.h" + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "common/include/nm_common.h" +#else +#ifndef LINT +#include "m2m_common.h" +#else +#include "../../../firmware/wifi_v111/src/m2m/include/m2m_common.h" +#endif +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup WlanDefines Defines + * @ingroup m2m_wifi + */ +/**@{*/ +#define M2M_MAJOR_SHIFT (8) +#define M2M_MINOR_SHIFT (4) +#define M2M_PATCH_SHIFT (0) + +#define M2M_DRV_VERSION_SHIFT (16) +#define M2M_FW_VERSION_SHIFT (0) + +#define M2M_GET_MAJOR(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_MAJOR_SHIFT) & 0xff) +#define M2M_GET_MINOR(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_MINOR_SHIFT) & 0x0f) +#define M2M_GET_PATCH(ver_info_hword) ((uint8)((ver_info_hword) >> M2M_PATCH_SHIFT) & 0x0f) + +#define M2M_GET_FW_VER(ver_info_word) ((uint16)((ver_info_word) >> M2M_FW_VERSION_SHIFT)) +#define M2M_GET_DRV_VER(ver_info_word) ((uint16)((ver_info_word) >> M2M_DRV_VERSION_SHIFT)) + +#define M2M_GET_DRV_MAJOR(ver_info_word) M2M_GET_MAJOR(M2M_GET_DRV_VER(ver_info_word)) +#define M2M_GET_DRV_MINOR(ver_info_word) M2M_GET_MINOR(M2M_GET_DRV_VER(ver_info_word)) +#define M2M_GET_DRV_PATCH(ver_info_word) M2M_GET_PATCH(M2M_GET_DRV_VER(ver_info_word)) + +#define M2M_GET_FW_MAJOR(ver_info_word) M2M_GET_MAJOR(M2M_GET_FW_VER(ver_info_word)) +#define M2M_GET_FW_MINOR(ver_info_word) M2M_GET_MINOR(M2M_GET_FW_VER(ver_info_word)) +#define M2M_GET_FW_PATCH(ver_info_word) M2M_GET_PATCH(M2M_GET_FW_VER(ver_info_word)) + +#define M2M_MAKE_VERSION(major, minor, patch) \ + (((uint16)((major)&0xff) << M2M_MAJOR_SHIFT) | ((uint16)((minor)&0x0f) << M2M_MINOR_SHIFT) \ + | ((uint16)((patch)&0x0f) << M2M_PATCH_SHIFT)) + +#define M2M_MAKE_VERSION_INFO(fw_major, fw_minor, fw_patch, drv_major, drv_minor, drv_patch) \ + ((((uint32)M2M_MAKE_VERSION((fw_major), (fw_minor), (fw_patch))) << M2M_FW_VERSION_SHIFT) \ + | (((uint32)M2M_MAKE_VERSION((drv_major), (drv_minor), (drv_patch))) << M2M_DRV_VERSION_SHIFT)) + +#define REL_19_5_3_VER M2M_MAKE_VERSION_INFO(19, 5, 3, 19, 3, 0) +#define REL_19_5_2_VER M2M_MAKE_VERSION_INFO(19, 5, 2, 19, 3, 0) +#define REL_19_5_1_VER M2M_MAKE_VERSION_INFO(19, 5, 1, 19, 3, 0) +#define REL_19_5_0_VER M2M_MAKE_VERSION_INFO(19, 5, 0, 19, 3, 0) +#define REL_19_4_6_VER M2M_MAKE_VERSION_INFO(19, 4, 6, 19, 3, 0) +#define REL_19_4_5_VER M2M_MAKE_VERSION_INFO(19, 4, 5, 19, 3, 0) +#define REL_19_4_4_VER M2M_MAKE_VERSION_INFO(19, 4, 4, 19, 3, 0) +#define REL_19_4_3_VER M2M_MAKE_VERSION_INFO(19, 4, 3, 19, 3, 0) +#define REL_19_4_2_VER M2M_MAKE_VERSION_INFO(19, 4, 2, 19, 3, 0) +#define REL_19_4_1_VER M2M_MAKE_VERSION_INFO(19, 4, 1, 19, 3, 0) +#define REL_19_4_0_VER M2M_MAKE_VERSION_INFO(19, 4, 0, 19, 3, 0) +#define REL_19_3_1_VER M2M_MAKE_VERSION_INFO(19, 3, 1, 19, 3, 0) +#define REL_19_3_0_VER M2M_MAKE_VERSION_INFO(19, 3, 0, 19, 3, 0) +#define REL_19_2_2_VER M2M_MAKE_VERSION_INFO(19, 2, 2, 19, 2, 0) +#define REL_19_2_1_VER M2M_MAKE_VERSION_INFO(19, 2, 1, 19, 2, 0) +#define REL_19_2_0_VER M2M_MAKE_VERSION_INFO(19, 2, 0, 19, 2, 0) +#define REL_19_1_0_VER M2M_MAKE_VERSION_INFO(19, 1, 0, 18, 2, 0) +#define REL_19_0_0_VER M2M_MAKE_VERSION_INFO(19, 0, 0, 18, 1, 1) + +/*======*======*======*======* + FIRMWARE VERSION NO INFO + *======*======*======*======*/ + +#define M2M_RELEASE_VERSION_MAJOR_NO (19) +/*!< Firmware Major release version number. + */ + +#define M2M_RELEASE_VERSION_MINOR_NO (5) +/*!< Firmware Minor release version number. + */ + +#define M2M_RELEASE_VERSION_PATCH_NO (4) +/*!< Firmware patch release version number. + */ + +//#define M2M_RELEASE_VERSION_SVN_VERSION (SVN_REVISION) +/*!< Firmware SVN release version number. + */ + +/*======*======*======*======* + SUPPORTED DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_MIN_REQ_DRV_VERSION_MAJOR_NO (19) +/*!< Driver Major release version number. + */ + +#define M2M_MIN_REQ_DRV_VERSION_MINOR_NO (3) +/*!< Driver Minor release version number. + */ + +#define M2M_MIN_REQ_DRV_VERSION_PATCH_NO (0) +/*!< Driver patch release version number. + */ + +#define M2M_MIN_REQ_DRV_SVN_VERSION (0) +/*!< Driver svn version. + */ + +#if !defined(M2M_RELEASE_VERSION_MAJOR_NO) || !defined(M2M_RELEASE_VERSION_MINOR_NO) +#error Undefined version number +#endif + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + +#define M2M_MAC_ADDRES_LEN 6 +/*!< The size fo 802 MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< The offset of the Ethernet header within the WLAN Tx Buffer. + */ + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the Etherenet header in bytes. + */ + +#define M2M_MAX_SSID_LEN 33 +/*!< Maximum size for the Wi-Fi SSID including the NULL termination. + */ + +#define M2M_MAX_PSK_LEN 65 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_MIN_PSK_LEN 9 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + +#define MAX_HIDDEN_SITES 4 +/*!< + max number of hidden SSID suuported by scan request +*/ + +#define M2M_1X_USR_NAME_MAX 21 +/*!< The maximum size of the user name including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_1X_PWD_MAX 41 +/*!< The maximum size of the password including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< The maximum size of IE (Information Element). + */ + +#define PWR_DEFAULT PWR_HIGH +/********************* + * + * WIFI GROUP requests + */ + +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the host configuration commands opcodes. + */ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the station mode host commands opcodes. + */ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. + */ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. + */ +#define M2M_SERVER_CMD_BASE 100 +/*!< The base value of all the power save mode host commands codes. + */ +/********************** + * OTA GROUP requests + */ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. + * The OTA Have special group so can extended from 1-M2M_MAX_GRP_NUM_REQ + */ +/*********************** + * + * CRYPTO group requests + */ +#define M2M_CRYPTO_CMD_BASE 1 +/*!< The base value of all the crypto mode host commands opcodes. + * The crypto Have special group so can extended from 1-M2M_MAX_GRP_NUM_REQ + */ + +#define M2M_MAX_GRP_NUM_REQ (127) +/*!< max number of request in one group equal to 127 as the last bit reserved for config or data pkt + */ + +#define WEP_40_KEY_STRING_SIZE ((uint8)10) +/*!< Indicate the wep key size in bytes for 40 bit string passphrase. + */ + +#define WEP_104_KEY_STRING_SIZE ((uint8)26) +/*!< Indicate the wep key size in bytes for 104 bit string passphrase. + */ +#define WEP_KEY_MAX_INDEX ((uint8)4) +/*!< Indicate the max key index value for WEP authentication + */ +#define M2M_SHA256_CONTEXT_BUFF_LEN (128) +/*!< sha256 context size + */ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default. number of scan slots performed by the WINC board. + */ +#define M2M_SCAN_DEFAULT_SLOT_TIME (30) +/*!< The default. duration in miliseconds of a scan slots performed by the WINC board. + */ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default. number of scan slots performed by the WINC board. + */ + +/*======*======*======*======* + CONNECTION ERROR DEFINITIONS + *======*======*======*======*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((sint8)-23), + /*!< + A failure that indicates that a default connection or forced connection is in progress + */ + M2M_DEFAULT_CONN_FAIL, + /*!< + A failure response that indicates that the winc failed to connect to the cached network + */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< + A failure response that indicates that no one of the cached networks + was found in the scan results, as a result to the function call m2m_default_connect. + */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< + A failure response that indicates an empty network list as + a result to the function call m2m_default_connect. + */ + +} tenuM2mDefaultConnErrcode; + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name including null terminator. + */ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. + */ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. + */ +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value updated in the Control structure in case of ROLLACK image Valid +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value updated in the Control structure in case of ROLLACK image InValid +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header +*/ +#define M2M_MAGIC_APP (0xef522f61UL) +/*!< + Magic value set at the beginning of the Cortus OTA image header +*/ + +#define OTA_FORMAT_VER_0 (0) /*Till 19.2.2 format*/ +#define OTA_FORMAT_VER_1 (1) /*starting from 19.3.0 CRC is used and sequence number is used*/ +/*!< + Control structure format version +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + Sha256 digest size in the OTA image, + the sha256 digest is set at the beginning of image before the OTA header + */ + +/*======*======*======*======* + SSL DEFINITIONS + *======*======*======*======*/ + +#define TLS_CRL_DATA_MAX_LEN 64 +/* Every bit have 3dB gain control each. + for example: + 1 ->3db + 3 ->6db + 7 ->9db + */ + uint16 u8PPAGFor11GN; + /*!< PPA gain for 11GN (as the RF document represented) + PPA_AGC<0:2> Every bit have 3dB gain control each. + for example: + 1 ->3db + 3 ->6db + 7 ->9db + */ +} tstrM2mWifiGainsParams; + +/*! +@struct \ + tstrM2mWifiWepParams + +@brief + WEP security key parameters. +*/ +typedef struct { + uint8 u8KeyIndx; + /*!< Wep key Index. + */ + uint8 u8KeySz; + /*!< Wep key Size. + */ + uint8 au8WepKey[WEP_104_KEY_STRING_SIZE + 1]; + /*!< WEP Key represented as a NULL terminated ASCII string. + */ + uint8 __PAD24__[3]; + /*!< Padding bytes to keep the structure word alligned. + */ +} tstrM2mWifiWepParams; + +/*! +@struct \ + tstr1xAuthCredentials + +@brief + Credentials for the user to authenticate with the AAA server (WPA-Enterprise Mode IEEE802.1x). +*/ +typedef struct { + uint8 au8UserName[M2M_1X_USR_NAME_MAX]; + /*!< User Name. It must be Null terminated string. + */ + uint8 au8Passwd[M2M_1X_PWD_MAX]; + /*!< Password corresponding to the user name. It must be Null terminated string. + */ +} tstr1xAuthCredentials; + +/*! +@union \ + tuniM2MWifiAuth + +@brief + Wi-Fi Security Parameters for all supported security modes. +*/ +typedef union { + uint8 au8PSK[M2M_MAX_PSK_LEN]; + /*!< Pre-Shared Key in case of WPA-Personal security. + */ + tstr1xAuthCredentials strCred1x; + /*!< Credentials for RADIUS server authentication in case of WPA-Enterprise security. + */ + tstrM2mWifiWepParams strWepInfo; + /*!< WEP key parameters in case of WEP security. + */ +} tuniM2MWifiAuth; + +/*! +@struct \ + tstrM2MWifiSecInfo + +@brief + Authentication credentials to connect to a Wi-Fi network. +*/ +typedef struct { + tuniM2MWifiAuth uniAuth; + /*!< Union holding all possible authentication parameters corresponding the current security types. + */ + uint8 u8SecType; + /*!< Wi-Fi network security type. See tenuM2mSecType for supported security types. + */ +#define __PADDING__ (4 - ((sizeof(tuniM2MWifiAuth) + 1) % 4)) + uint8 __PAD__[__PADDING__]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiSecInfo; + +/*! +@struct \ + tstrM2mWifiConnect + +@brief + Wi-Fi Connect Request +*/ +typedef struct { + tstrM2MWifiSecInfo strSec; + /*!< Security parameters for authenticating with the AP. + */ + uint16 u16Ch; + /*!< RF Channel for the target SSID as enumerated in tenuM2mScanCh. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< SSID of the desired AP. It must be NULL terminated string. + */ + uint8 u8NoSaveCred; + /*!< Set to '1' to prevent WINC from saving authentication info (PSK, WEP key, 801.1x password) on WINC flash. + */ +#define __CONN_PAD_SIZE__ (4 - ((sizeof(tstrM2MWifiSecInfo) + M2M_MAX_SSID_LEN + 3) % 4)) + uint8 __PAD__[__CONN_PAD_SIZE__]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiConnect; + +/*! +@struct \ + tstrM2MWPSConnect + +@brief + WPS Configuration parameters + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint8 u8TriggerType; + /*!< WPS triggering method (Push button or PIN) + */ + char acPinNumber[8]; + /*!< WPS PIN No (for PIN method) + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWPSConnect; + +/*! +@struct \ + tstrM2MWPSInfo + +@brief WPS Result + + This structure is passed to the application in response to a WPS request. If the WPS session is completed +successfully, the structure will have Non-ZERO authentication type. If the WPS Session fails (due to error or timeout) +the authentication type is set to ZERO. + +@sa + tenuM2mSecType +*/ +typedef struct { + uint8 u8AuthType; + /*!< Network authentication type. + */ + uint8 u8Ch; + /*!< RF Channel for the AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< SSID obtained from WPS. + */ + uint8 au8PSK[M2M_MAX_PSK_LEN]; + /*!< PSK for the network obtained from WPS. + */ +} tstrM2MWPSInfo; + +/*! +@struct \ + tstrM2MDefaultConnResp + +@brief + Response error of the m2m_default_connect + +@sa + M2M_DEFAULT_CONN_SCAN_MISMATCH + M2M_DEFAULT_CONN_EMPTY_LIST +*/ +typedef struct { + sint8 s8ErrorCode; + /*!< + Default connect error code. possible values are: + - M2M_DEFAULT_CONN_EMPTY_LIST + - M2M_DEFAULT_CONN_SCAN_MISMATCH + */ + uint8 __PAD24__[3]; +} tstrM2MDefaultConnResp; + +/*! +@struct \ + tstrM2MScanOption + +@brief + Scan options and configurations. + +@sa + tenuM2mScanCh + tstrM2MScan +*/ +typedef struct { + uint8 u8NumOfSlot; + /*|< The min number of slots is 2 for every channel, + every slot the soc will send Probe Request on air, and wait/listen for PROBE RESP/BEACONS for the u16slotTime + */ + uint8 u8SlotTime; + /*|< the time that the Soc will wait on every channel listening to the frames on air + when that time increaseed number of AP will increased in the scan results + min time is 10 ms and the max is 250 ms + */ + uint8 u8ProbesPerSlot; + /*!< Number of probe requests to be sent per channel scan slot. + */ + sint8 s8RssiThresh; + /*! < The RSSI threshold of the AP which will be connected to directly. + */ + +} tstrM2MScanOption; + +/*! +@struct \ + tstrM2MScanRegion + +@brief + Wi-Fi channel regulation region information. + +@sa + tenuM2mScanRegion +*/ +typedef struct { + uint16 u16ScanRegion; + /*|< Specifies the number of channels allowed in the region (e.g. North America = 11 ... etc.). + */ + uint8 __PAD16__[2]; + +} tstrM2MScanRegion; + +/*! +@struct \ + tstrM2MScan + +@brief + Wi-Fi Scan Request + +@sa + tenuM2mScanCh + tstrM2MScanOption +*/ +typedef struct { + uint8 u8ChNum; + /*!< The Wi-Fi RF Channel number + */ + uint8 __RSVD8__[1]; + /*!< Reserved for future use. + */ + uint16 u16PassiveScanTime; + /*!< Passive Scan Timeout in ms. The field is ignored for active scan. + */ +} tstrM2MScan; + +/*! +@struct \ + tstrCyptoResp + +@brief + crypto response +*/ +typedef struct { + sint8 s8Resp; + /***/ + uint8 __PAD24__[3]; + /* + */ +} tstrCyptoResp; + +/*! +@struct \ + tstrM2mScanDone + +@brief + Wi-Fi Scan Result +*/ +typedef struct { + uint8 u8NumofCh; + /*!< Number of found APs + */ + sint8 s8ScanState; + /*!< Scan status + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mScanDone; + +/*! +@struct \ + tstrM2mReqScanResult + +@brief Scan Result Request + + The Wi-Fi Scan results list is stored in Firmware. The application can request a certain scan result by its index. +*/ +typedef struct { + uint8 u8Index; + /*!< Index of the desired scan result + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mReqScanResult; + +/*! +@struct \ + tstrM2mWifiscanResult + +@brief Wi-Fi Scan Result + + Information corresponding to an AP in the Scan Result list identified by its order (index) in the list. +*/ +typedef struct { + uint8 u8index; + /*!< AP index in the scan result list. + */ + sint8 s8rssi; + /*!< AP signal strength. + */ + uint8 u8AuthType; + /*!< AP authentication type. + */ + uint8 u8ch; + /*!< AP RF channel. + */ + uint8 au8BSSID[6]; + /*!< BSSID of the AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< AP ssid. + */ + uint8 _PAD8_; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiscanResult; + +/*! +@struct \ + tstrM2mWifiStateChanged + +@brief + Wi-Fi Connection State + +@sa + M2M_WIFI_DISCONNECTED, M2M_WIFI_CONNECTED, M2M_WIFI_REQ_CON_STATE_CHANGED,tenuM2mConnChangedErrcode +*/ +typedef struct { + uint8 u8CurrState; + /*!< Current Wi-Fi connection state + */ + uint8 u8ErrCode; + /*!< Error type review tenuM2mConnChangedErrcode + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mWifiStateChanged; + +/*! +@struct \ + tstrM2mPsType + +@brief + Power Save Configuration + +@sa + tenuPowerSaveModes +*/ +typedef struct { + uint8 u8PsType; + /*!< Power save operating mode + */ + uint8 u8BcastEn; + /*!< + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mPsType; + +/*! +@struct \ + tstrM2mSlpReqTime + +@brief + Manual power save request sleep time + +*/ +typedef struct { + /*!< Sleep time in ms + */ + uint32 u32SleepTime; + +} tstrM2mSlpReqTime; + +/*! +@struct \ + tstrM2mLsnInt + +@brief Listen interval + + It is the value of the Wi-Fi STA listen interval for power saving. It is given in units of Beacon period. + Periodically after the listen interval fires, the WINC is wakeup and listen to the beacon and check for any buffered +frames for it from the AP. +*/ +typedef struct { + uint16 u16LsnInt; + /*!< Listen interval in Beacon period count. + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mLsnInt; + +/*! +@struct \ + tstrM2MWifiMonitorModeCtrl + +@brief Wi-Fi Monitor Mode Filter + + This structure sets the filtering criteria for WLAN packets when monitoring mode is enable. + The received packets matching the filtering parameters, are passed directly to the application. +*/ +typedef struct { + uint8 u8ChannelID; + /* !< RF Channel ID. It must use values from tenuM2mScanCh + */ + uint8 u8FrameType; + /*!< It must use values from tenuWifiFrameType. + */ + uint8 u8FrameSubtype; + /*!< It must use values from tenuSubTypes. + */ + uint8 au8SrcMacAddress[6]; + /* ZERO means DO NOT FILTER Source address. + */ + uint8 au8DstMacAddress[6]; + /* ZERO means DO NOT FILTER Destination address. + */ + uint8 au8BSSID[6]; + /* ZERO means DO NOT FILTER BSSID. + */ + uint8 u8EnRecvHdr; + /* + Enable recv the full hder before the payload + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiMonitorModeCtrl; + +/*! +@struct \ + tstrM2MWifiRxPacketInfo + +@brief Wi-Fi RX Frame Header + + The M2M application has the ability to allow Wi-Fi monitoring mode for receiving all Wi-Fi Raw frames matching a +well defined filtering criteria. When a target Wi-Fi packet is received, the header information are extracted and +assigned in this structure. +*/ +typedef struct { + uint8 u8FrameType; + /*!< It must use values from tenuWifiFrameType. + */ + uint8 u8FrameSubtype; + /*!< It must use values from tenuSubTypes. + */ + uint8 u8ServiceClass; + /*!< Service class from Wi-Fi header. + */ + uint8 u8Priority; + /*!< Priority from Wi-Fi header. + */ + uint8 u8HeaderLength; + /*!< Frame Header length. + */ + uint8 u8CipherType; + /*!< Encryption type for the rx packet. + */ + uint8 au8SrcMacAddress[6]; + /* ZERO means DO NOT FILTER Source address. + */ + uint8 au8DstMacAddress[6]; + /* ZERO means DO NOT FILTER Destination address. + */ + uint8 au8BSSID[6]; + /* ZERO means DO NOT FILTER BSSID. + */ + uint16 u16DataLength; + /*!< Data payload length (Header excluded). + */ + uint16 u16FrameLength; + /*!< Total frame length (Header + Data). + */ + uint32 u32DataRateKbps; + /*!< Data Rate in Kbps. + */ + sint8 s8RSSI; + /*!< RSSI. + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MWifiRxPacketInfo; + +/*! +@struct \ + tstrM2MWifiTxPacketInfo + +@brief Wi-Fi TX Packet Info + + The M2M Application has the ability to compose a RAW Wi-Fi frames (under the application responsibility). + When transmitting a Wi-Fi packet, the application must supply the firmware with this structure for sending the +target frame. +*/ +typedef struct { + uint16 u16PacketSize; + /*!< Wlan frame length. + */ + uint16 u16HeaderLength; + /*!< Wlan frame header length. + */ +} tstrM2MWifiTxPacketInfo; + +/*! + @struct \ + tstrM2MP2PConnect + + @brief + Set the device to operate in the Wi-Fi Direct (P2P) mode. +*/ +typedef struct { + uint8 u8ListenChannel; + /*!< P2P Listen Channel (1, 6 or 11) + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MP2PConnect; + +/*! +@struct \ + tstrM2MAPConfig + +@brief AP Configuration + + This structure holds the configuration parameters for the M2M AP mode. It should be set by the application when + it requests to enable the M2M AP operation mode. The M2M AP mode currently supports only WEP security (with + the NO Security option available of course). +*/ +typedef struct { + /*!< + Configuration parameters for the WiFi AP. + */ + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< AP SSID + */ + uint8 u8ListenChannel; + /*!< Wi-Fi RF Channel which the AP will operate on + */ + uint8 u8KeyIndx; + /*!< Wep key Index + */ + uint8 u8KeySz; + /*!< Wep/WPA key Size + */ + uint8 au8WepKey[WEP_104_KEY_STRING_SIZE + 1]; + /*!< Wep key + */ + uint8 u8SecType; + /*!< Security type: Open or WEP or WPA in the current implementation + */ + uint8 u8SsidHide; + /*!< SSID Status "Hidden(1)/Visible(0)" + */ + uint8 au8DHCPServerIP[4]; + /*!< Ap IP server address + */ + uint8 au8Key[M2M_MAX_PSK_LEN]; + /*!< WPA key + */ + uint8 __PAD24__[2]; + /*!< Padding bytes for forcing alignment + */ +} tstrM2MAPConfig; + +/*! +@struct \ + tstrM2mServerInit + +@brief + PS Server initialization. +*/ +typedef struct { + uint8 u8Channel; + /*!< Server Listen channel + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mServerInit; + +/*! +@struct \ + tstrM2mClientState + +@brief + PS Client State. +*/ +typedef struct { + uint8 u8State; + /*!< PS Client State + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mClientState; + +/*! +@struct \ + tstrM2Mservercmd + +@brief + PS Server CMD +*/ +typedef struct { + uint8 u8cmd; + /*!< PS Server Cmd + */ + uint8 __PAD24__[3]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2Mservercmd; + +/*! +@struct \ + tstrM2mSetMacAddress + +@brief + Sets the MAC address from application. The WINC load the mac address from the effuse by default to the WINC +configuration memory, but that function is used to let the application overwrite the configuration memory with the mac +address from the host. + +@note + It's recommended to call this only once before calling connect request and after the m2m_wifi_init +*/ +typedef struct { + uint8 au8Mac[6]; + /*!< MAC address array + */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2mSetMacAddress; + +/*! +@struct \ + tstrM2MDeviceNameConfig + +@brief Device name + + It is assigned by the application. It is used mainly for Wi-Fi Direct device + discovery and WPS device information. +*/ +typedef struct { + uint8 au8DeviceName[M2M_DEVICE_NAME_MAX]; + /*!< NULL terminated device name + */ +} tstrM2MDeviceNameConfig; + +/*! +@struct \ + tstrM2MIPConfig + +@brief + IP configuration (static/DHCP). The same structure is used for DCHP callback as well as static IP configuration. + +@note + All member IP addresses are expressed in Network Byte Order (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + */ +typedef struct { + uint32 u32StaticIP; + /*!< If DHCP callback, this is the IP address obtained from the DHCP. In static IP config, this is the assigned to + * the device from the application. + */ + uint32 u32Gateway; + /*!< IP of the default internet gateway. + */ + uint32 u32DNS; + /*!< IP for the DNS server. + */ + uint32 u32AlternateDNS; + /*!< IP for the secondary DNS server (if any). Must set to zero if not provided in static IP configuration from the + * application. + */ + uint32 u32SubnetMask; + /*!< Subnet mask for the local area network. + */ + uint32 u32DhcpLeaseTime; + /*!< DHCP Lease Time in sec. This field is is ignored in static IP configuration. + */ +} tstrM2MIPConfig; + +/*! +@struct \ + tstrM2mIpRsvdPkt + +@brief + Received Packet Size and Data Offset + + */ +typedef struct { + uint16 u16PktSz; + uint16 u16PktOffset; +} tstrM2mIpRsvdPkt; + +/*! +@struct \ + tstrM2MProvisionModeConfig + +@brief + M2M Provisioning Mode Configuration + */ + +typedef struct { + tstrM2MAPConfig strApConfig; + /*!< + Configuration parameters for the WiFi AP. + */ + char acHttpServerDomainName[64]; + /*!< + The device domain name for HTTP provisioning. + */ + uint8 u8EnableRedirect; + /*!< + A flag to enable/disable HTTP redirect feature for the HTTP Provisioning server. If the Redirect is enabled, + all HTTP traffic (http://URL) from the device associated with WINC AP will be redirected to the HTTP + Provisioning Web page. + - 0 : Disable HTTP Redirect. + - 1 : Enable HTTP Redirect. + */ + uint8 __PAD24__[3]; +} tstrM2MProvisionModeConfig; + +/*! +@struct \ + tstrM2MProvisionInfo + +@brief + M2M Provisioning Information obtained from the HTTP Provisioning server. + */ +typedef struct { + uint8 au8SSID[M2M_MAX_SSID_LEN]; + /*!< + Provisioned SSID. + */ + uint8 au8Password[M2M_MAX_PSK_LEN]; + /*!< + Provisioned Password. + */ + uint8 u8SecType; + /*!< + Wifi Security type. + */ + uint8 u8Status; + /*!< + Provisioning status. It must be checked before reading the provisioning information. It may be + - M2M_SUCCESS : Provision successful. + - M2M_FAIL : Provision Failed. + */ +} tstrM2MProvisionInfo; + +/*! +@struct \ + tstrM2MConnInfo + +@brief + M2M Provisioning Information obtained from the HTTP Provisioning server. + */ +typedef struct { + char acSSID[M2M_MAX_SSID_LEN]; + /*!< AP connection SSID name */ + uint8 u8SecType; + /*!< Security type */ + uint8 au8IPAddr[4]; + /*!< Connection IP address */ + uint8 au8MACAddress[6]; + /*!< MAC address of the peer Wi-Fi station */ + sint8 s8RSSI; + /*!< Connection RSSI signal */ + uint8 u8CurrChannel; + /*!< Wi-Fi RF channel number 1,2,... 14. */ + uint8 __PAD16__[2]; + /*!< Padding bytes for forcing 4-byte alignment */ +} tstrM2MConnInfo; + +/*! +@struct \ + tstrOtaInitHdr + +@brief + OTA Image Header + */ + +typedef struct { + uint32 u32OtaMagicValue; + /*!< Magic value kept in the OTA image after the + sha256 Digest buffer to define the Start of OTA Header */ + uint32 u32OtaPayloadSzie; + /*!< + The Total OTA image payload size, include the sha256 key size + */ + +} tstrOtaInitHdr; + +/*! +@struct \ + tstrOtaControlSec + +@brief + Control section structure is used to define the working image and + the validity of the roll-back image and its offset, also both firmware versions is kept in that structure. + */ + +typedef struct { + uint32 u32OtaMagicValue; + /*!< + Magic value used to ensure the structure is valid or not + */ + uint32 u32OtaFormatVersion; + /*!< + NA NA NA Flash version cs struct version + 00 00 00 00 00 + Control structure format version, the value will be incremented in case of structure changed or updated + */ + uint32 u32OtaSequenceNumber; + /*!< + Sequence number is used while update the control structure to keep track of how many times that section updated + */ + uint32 u32OtaLastCheckTime; + /*!< + Last time OTA check for update + */ + uint32 u32OtaCurrentworkingImagOffset; + /*!< + Current working offset in flash + */ + uint32 u32OtaCurrentworkingImagFirmwareVer; + /*!< + current working image version ex 18.0.1 + */ + uint32 u32OtaRollbackImageOffset; + /*!< + Roll-back image offset in flash + */ + uint32 u32OtaRollbackImageValidStatus; + /*!< + roll-back image valid status + */ + uint32 u32OtaRollbackImagFirmwareVer; + /*!< + Roll-back image version (ex 18.0.3) + */ + uint32 u32OtaCortusAppWorkingOffset; + /*!< + cortus app working offset in flash + */ + uint32 u32OtaCortusAppWorkingValidSts; + /*!< + Working Cortus app valid status + */ + uint32 u32OtaCortusAppWorkingVer; + /*!< + Working cortus app version (ex 18.0.3) + */ + uint32 u32OtaCortusAppRollbackOffset; + /*!< + cortus app rollback offset in flash + */ + uint32 u32OtaCortusAppRollbackValidSts; + /*!< + roll-back cortus app valid status + */ + uint32 u32OtaCortusAppRollbackVer; + /*!< + Roll-back cortus app version (ex 18.0.3) + */ + uint32 u32OtaControlSecCrc; + /*!< + CRC for the control structure to ensure validity + */ +} tstrOtaControlSec; + +/*! +@enum \ + tenuOtaUpdateStatus + +@brief + OTA return status +*/ +typedef enum { + OTA_STATUS_SUCSESS = 0, + /*!< OTA Success with not errors. */ + OTA_STATUS_FAIL = 1, + /*!< OTA generic fail. */ + OTA_STATUS_INVAILD_ARG = 2, + /*!< Invalid or malformed download URL. */ + OTA_STATUS_INVAILD_RB_IMAGE = 3, + /*!< Invalid rollback image. */ + OTA_STATUS_INVAILD_FLASH_SIZE = 4, + /*!< Flash size on device is not enough for OTA. */ + OTA_STATUS_AlREADY_ENABLED = 5, + /*!< An OTA operation is already enabled. */ + OTA_STATUS_UPDATE_INPROGRESS = 6, + /*!< An OTA operation update is in progress */ + OTA_STATUS_IMAGE_VERIF_FAILED = 7, + /*!< OTA Verfication failed */ + OTA_STATUS_CONNECTION_ERROR = 8, + /*!< OTA connection error */ + OTA_STATUS_SERVER_ERROR = 9, + /*!< OTA server Error (file not found or else ...) */ + OTA_STATUS_ABORTED = 10 + /*!< OTA download has been aborted by the application. */ +} tenuOtaUpdateStatus; +/*! +@enum \ + tenuOtaUpdateStatusType + +@brief + OTA update Status type +*/ +typedef enum { + + DL_STATUS = 1, + /*!< Download OTA file status + */ + SW_STATUS = 2, + /*!< Switching to the upgrade firmware status + */ + RB_STATUS = 3, + /*!< Roll-back status + */ + AB_STATUS = 4 + /*!< Abort status + */ +} tenuOtaUpdateStatusType; + +/*! +@struct \ + tstrOtaUpdateStatusResp + +@brief + OTA Update Information + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint8 u8OtaUpdateStatusType; + /*!< + Status type tenuOtaUpdateStatusType + */ + uint8 u8OtaUpdateStatus; + /*!< + OTA_SUCCESS + OTA_ERR_WORKING_IMAGE_LOAD_FAIL + OTA_ERR_INVAILD_CONTROL_SEC + M2M_ERR_OTA_SWITCH_FAIL + M2M_ERR_OTA_START_UPDATE_FAIL + M2M_ERR_OTA_ROLLBACK_FAIL + M2M_ERR_OTA_INVAILD_FLASH_SIZE + M2M_ERR_OTA_INVAILD_ARG + */ + uint8 _PAD16_[2]; +} tstrOtaUpdateStatusResp; + +/*! +@struct \ + tstrOtaUpdateInfo + +@brief + OTA Update Information + +@sa + tenuWPSTrigger +*/ +typedef struct { + uint32 u8NcfUpgradeVersion; + /*!< NCF OTA Upgrade Version + */ + uint32 u8NcfCurrentVersion; + /*!< NCF OTA Current firmware version + */ + uint32 u8NcdUpgradeVersion; + /*!< NCD (host) upgraded version (if the u8NcdRequiredUpgrade == true) + */ + uint8 u8NcdRequiredUpgrade; + /*!< NCD Required upgrade to the above version + */ + uint8 u8DownloadUrlOffset; + /*!< Download URL offset in the received packet + */ + uint8 u8DownloadUrlSize; + /*!< Download URL size in the received packet + */ + uint8 __PAD8__; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrOtaUpdateInfo; + +/*! +@struct \ + tstrSystemTime + +@brief + Used for time storage. +*/ +typedef struct { + uint16 u16Year; + uint8 u8Month; + uint8 u8Day; + uint8 u8Hour; + uint8 u8Minute; + uint8 u8Second; + uint8 __PAD8__; +} tstrSystemTime; + +/*! +@struct \ + tstrM2MMulticastMac + +@brief + M2M add/remove multi-cast mac address + */ +typedef struct { + uint8 au8macaddress[M2M_MAC_ADDRES_LEN]; + /*!< + Mac address needed to be added or removed from filter. + */ + uint8 u8AddRemove; + /*!< + set by 1 to add or 0 to remove from filter. + */ + uint8 __PAD8__; + /*!< Padding bytes for forcing 4-byte alignment + */ +} tstrM2MMulticastMac; + +/*! +@struct \ + tstrPrng + +@brief + M2M Request PRNG + */ +typedef struct { + /*!< + return buffer address + */ + uint8 *pu8RngBuff; + /*!< + PRNG size requested + */ + uint16 u16PrngSize; + /*!< + PRNG pads + */ + uint8 __PAD16__[2]; +} tstrPrng; + +/* + * TLS certificate revocation list + * Typedefs common between fw and host + */ + +/*! +@struct \ + tstrTlsCrlEntry + +@brief + Certificate data for inclusion in a revocation list (CRL) +*/ +typedef struct { + uint8 u8DataLen; + /*!< + Length of certificate data (maximum possible is @ref TLS_CRL_DATA_MAX_LEN) + */ + uint8 au8Data[TLS_CRL_DATA_MAX_LEN]; + /*!< + Certificate data + */ + uint8 __PAD24__[3]; + /*!< + Padding bytes for forcing 4-byte alignment + */ +} tstrTlsCrlEntry; + +/*! +@struct \ + tstrTlsCrlInfo + +@brief + Certificate revocation list details +*/ +typedef struct { + uint8 u8CrlType; + /*!< + Type of certificate data contained in list + */ + uint8 u8Rsv1; + /*!< + Reserved for future use + */ + uint8 u8Rsv2; + /*!< + Reserved for future use + */ + uint8 u8Rsv3; + /*!< + Reserved for future use + */ + tstrTlsCrlEntry astrTlsCrl[TLS_CRL_MAX_ENTRIES]; + /*!< + List entries + */ +} tstrTlsCrlInfo; + +/*! +@enum\ + tenuSslCertExpSettings + +@brief SSL Certificate Expiry Validation Options +*/ +typedef enum { + SSL_CERT_EXP_CHECK_DISABLE, + /*!< + ALWAYS OFF. + Ignore certificate expiration date validation. If a certificate is + expired or there is no configured system time, the SSL connection SUCCEEDs. + */ + SSL_CERT_EXP_CHECK_ENABLE, + /*!< + ALWAYS ON. + Validate certificate expiration date. If a certificate is expired or + there is no configured system time, the SSL connection FAILs. + */ + SSL_CERT_EXP_CHECK_EN_IF_SYS_TIME + /*!< + CONDITIONAL VALIDATION (Default setting at startup). + Validate the certificate expiration date only if there is a configured system time. + If there is no configured system time, the certificate expiration is bypassed and the + SSL connection SUCCEEDs. + */ +} tenuSslCertExpSettings; + +/*! +@struct \ + tstrTlsSrvSecFileEntry + +@brief + This struct contains a TLS certificate. + */ +typedef struct { + char acFileName[TLS_FILE_NAME_MAX]; + /*!< Name of the certificate. */ + uint32 u32FileSize; + /*!< Size of the certificate. */ + uint32 u32FileAddr; + /*!< Error Code. */ +} tstrTlsSrvSecFileEntry; + +/*! +@struct \ + tstrTlsSrvSecHdr + +@brief + This struct contains a set of TLS certificates. + */ +typedef struct { + uint8 au8SecStartPattern[TLS_SRV_SEC_START_PATTERN_LEN]; + /*!< Start pattern. */ + uint32 u32nEntries; + /*!< Number of certificates stored in the struct. */ + uint32 u32NextWriteAddr; + /*!< TLS Certificates. */ + tstrTlsSrvSecFileEntry astrEntries[TLS_SRV_SEC_MAX_FILES]; +} tstrTlsSrvSecHdr; + +typedef struct { + uint32 u32CsBMP; +} tstrSslSetActiveCsList; + +/*! +@enum\ + tenuWlanTxRate + +@brief All possible supported 802.11 WLAN TX rates. +*/ +typedef enum { + TX_RATE_AUTO = 0xFF, /*!< Automatic rate selection */ + TX_RATE_LOWEST = 0xFE, /*!< Force the lowest possible data rate for longest range. */ + TX_RATE_1 = 0x00, /* 1 Mbps */ + TX_RATE_2 = 0x01, /* 2 Mbps */ + TX_RATE_5_5 = 0x02, /* 5 Mbps */ + TX_RATE_11 = 0x0B, /* 11 Mbps */ + TX_RATE_6 = 0x80, /* 6 Mbps */ + TX_RATE_9 = 0x0F, /* 9 Mbps */ + TX_RATE_12 = 0x03, /* 12 Mbps */ + TX_RATE_18 = 0x0A, /* 18 Mbps */ + TX_RATE_24 = 0x81, /* 24 Mbps */ + TX_RATE_36 = 0x0E, /* 36 Mbps */ + TX_RATE_48 = 0x82, /* 48 Mbps */ + TX_RATE_54 = 0x09, /* 54 Mbps */ + TX_RATE_MCS_0 = 0x83, /* MCS-0: 6.5 Mbps */ + TX_RATE_MCS_1 = 0x0D, /* MCS-1: 13 Mbps */ + TX_RATE_MCS_2 = 0x84, /* MCS-2: 19.5 Mbps */ + TX_RATE_MCS_3 = 0x08, /* MCS-3: 26 Mbps */ + TX_RATE_MCS_4 = 0x85, /* MCS-4: 39 Mbps */ + TX_RATE_MCS_5 = 0x0C, /* MCS-5: 52 Mbps */ + TX_RATE_MCS_6 = 0x86, /* MCS-6: 58.5 Mbps */ + TX_RATE_MCS_7 = 0x87, /* MCS-7: 65 Mbps */ +} tenuWlanTxRate; + +/* Commonly used initalizers for rate lists for B, G, N or mixed modes for iteration on rates. */ +#define WLAN_11B_RATES_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_11 \ + } + +#define WLAN_11G_RATES_INITIALIZER \ + { \ + TX_RATE_6, TX_RATE_9, TX_RATE_12, TX_RATE_18, TX_RATE_24, TX_RATE_36, TX_RATE_48, TX_RATE_54 \ + } + +#define WLAN_11N_RATES_INITIALIZER \ + { \ + TX_RATE_MCS_0, TX_RATE_MCS_1, TX_RATE_MCS_2, TX_RATE_MCS_3, TX_RATE_MCS_4, TX_RATE_MCS_5, TX_RATE_MCS_6, \ + TX_RATE_MCS_7 \ + } + +#define WLAN_11BGN_RATES_ASC_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_6, TX_RATE_MCS_0, TX_RATE_9, TX_RATE_11, TX_RATE_12, TX_RATE_MCS_1, \ + TX_RATE_18, TX_RATE_MCS_2, TX_RATE_24, TX_RATE_MCS_3, TX_RATE_36, TX_RATE_MCS_4, TX_RATE_48, \ + TX_RATE_MCS_5, TX_RATE_54, TX_RATE_MCS_6, TX_RATE_MCS_7, \ + } + +#define WLAN_11BG_RATES_ASC_INITIALIZER \ + { \ + TX_RATE_1, TX_RATE_2, TX_RATE_5_5, TX_RATE_6, TX_RATE_9, TX_RATE_11, TX_RATE_12, TX_RATE_18, TX_RATE_24, \ + TX_RATE_36, TX_RATE_48, TX_RATE_54 \ + } + +/*! +@struct \ + tstrConfAutoRate + +@brief + Auto TX rate selection parameters passed to m2m_wifi_conf_auto_rate. +*/ +typedef struct { + uint16 u16ArMaxRecoveryFailThreshold; + /*!< + To stabilize the TX rate and avoid oscillation, the algorithm will not attempt to + push the rate up again after a failed attempt to push the rate up. + An attempt to push the rate up is considered failed if the next rate suffers from + very high retransmission. In this case, WINC will not attempt again until a + duration of time is elased to keep the TX rate stable. + The min duration is (u16ArMinRecoveryFailThreshold) seconds and doubles + on every failed attempt. The doubling continues until the duration is + (u16ArMaxRecoveryFailThreshold) max. + + Increasing u16ArMaxRecoveryFailThreshold this will cause the TX rate to be + stable over a long period of time with fewer attempts to increase the data rate. + However, increasing this to a very large value will deter the algorithm from + attempting to increase the rate if, for instance, the wireless conditions befores better. + + Default is 5 seconds. + */ + uint16 u16ArMinRecoveryFailThreshold; + /*!< + To stabilize the TX rate and avoid oscillation, the algorithm will not attempt to + push the rate up again after a failed attempt to push the rate up. + An attempt to push the rate up is considered failed if the next rate suffers from + very high retransmission. In this case, WINC will not attempt again until a + duration of time is elased to keep the TX rate stable. + The min duration is (u16ArMinRecoveryFailThreshold) seconds and doubles + on every failed attempt. The doubling continues until the duration is + (u16ArMaxRecoveryFailThreshold) max. + + Default is 1 second. + */ + + tenuWlanTxRate enuWlanTxRate; + /*!< + The TX data rate setlected as enumerated in tenuWlanTxRate + Default is TX_RATE_AUTO. + + WINC shall override the rate provided through this API if it not supported by the peer WLAN device (STA/AP). + For instance, if the TX_RATE_MCS_0 is requested while the connection is to a BG only AP, WINC shall + elect the nearest BG data rate to the requested rate. In this example, it will be TX_RATE_9. + */ + tenuWlanTxRate enuArInitialRateSel; + /*!< + Configures the initial WLAN TX rate used right after association. + This is the starting point for auto rate algorithm. + The algorithm tunes the rate up or down based on the wireless + medium condition if enuWlanTxRate is set to TX_RATE_AUTO. + If enuWlanTxRate is set to any value other than TX_RATE_AUTO, then + u8ArInitialRateSel is ignored. + + By default WINC selects the best initial rate based on the recevie + signal level from the WLAN peer. For applications that favor range + right after association, TX_RATE_LOWEST can bs used. + */ + uint8 u8ArEnoughTxThreshold; + /*!< + Configures the minimum number of transmitted packets per second for auto + rate selection algorithm to start to make rate up or down decisions. + Default is 10. + */ + uint8 u8ArSuccessTXThreshold; + /*!< + Configures the threshold for rate up. Rate goes up if number of + WLAN TX retries is less than (1/u8ArSuccessTXThreshold) of the + number of packet transmitted within one second. + This can be tuned to speed up or slow down the rate at which the algorithm + moves the WLAN TX rate up. Default value is 5. + */ + uint8 u8ArFailTxThreshold; + /*!< + Configures the threshold for rate down. Rate goes down if number of + WLAN TX retries is greater than (1/u8ArFailTxThreshold) of the + number of packet transmitted within one second. + This can be tuned to speed up or slow down the rate at which the algorithm + moves the WLAN TX rate down. Default value is 3. + */ + uint8 __PAD24__[3]; + /*!< Pad bytes for forcing 4-byte alignment + */ +} tstrConfAutoRate; + +#define DEFAULT_CONF_AR_INITIALIZER \ + { \ + 5, 1, TX_RATE_AUTO, TX_RATE_AUTO, 10, 5, 3 \ + } + +/**@}*/ + +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/include/m2m_wifi.h b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_wifi.h new file mode 100644 index 0000000..282bef3 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/include/m2m_wifi.h @@ -0,0 +1,3000 @@ +/** + * + * \file + * + * \brief WINC WLAN Application Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_H__ +#define __M2M_WIFI_H__ + +/** \defgroup m2m_wifi WLAN + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" + +#ifdef CONF_MGMT + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup WlanEnums DataTypes + * @ingroup m2m_wifi + * @{*/ +/*! +@enum \ + tenuWifiFrameType + +@brief + Enumeration for Wi-Fi MAC frame type codes (2-bit) + The following types are used to identify the type of frame sent or received. + Each frame type constitutes a number of frame subtypes as defined in @ref tenuSubTypes to specify the exact type of +frame. Values are defined as per the IEEE 802.11 standard. + +@remarks + The following frame types are useful for advanced user usage when monitoring mode is used (defining @ref CONF_MGMT) + and the user application requires to monitor the frame transmission and reception. +@see + tenuSubTypes +*/ +typedef enum { + MANAGEMENT = 0x00, + /*!< Wi-Fi Management frame (Probe Req/Resp, Beacon, Association Req/Resp ...etc). + */ + CONTROL = 0x04, + /*!< Wi-Fi Control frame (eg. ACK frame). + */ + DATA_BASICTYPE = 0x08, + /*!< Wi-Fi Data frame. + */ + RESERVED = 0x0C, + + M2M_WIFI_FRAME_TYPE_ANY = 0xFF + /*!< Set monitor mode to receive any of the frames types + */ +} tenuWifiFrameType; + +/*! +@enum \ + tenuSubTypes + +@brief + Enumeration for Wi-Fi MAC Frame subtype code (6-bit). + The frame subtypes fall into one of the three frame type groups as defined in @ref tenuWifiFrameType + (MANAGEMENT, CONTROL & DATA). + Values are defined as per the IEEE 802.11 standard. +@remarks + The following sub-frame types are useful for advanced user usage when @ref CONF_MGMT is defined + and the application developer requires to monitor the frame transmission and reception. +@see + tenuWifiFrameType + tstrM2MWifiMonitorModeCtrl +*/ +typedef enum { + /*!< Sub-Types related to Management Sub-Types */ + ASSOC_REQ = 0x00, + ASSOC_RSP = 0x10, + REASSOC_REQ = 0x20, + REASSOC_RSP = 0x30, + PROBE_REQ = 0x40, + PROBE_RSP = 0x50, + BEACON = 0x80, + ATIM = 0x90, + DISASOC = 0xA0, + AUTH = 0xB0, + DEAUTH = 0xC0, + ACTION = 0xD0, + /**@{*/ + /* Sub-Types related to Control */ + PS_POLL = 0xA4, + RTS = 0xB4, + CTS = 0xC4, + ACK = 0xD4, + CFEND = 0xE4, + CFEND_ACK = 0xF4, + BLOCKACK_REQ = 0x84, + BLOCKACK = 0x94, + /**@{*/ + /* Sub-Types related to Data */ + DATA = 0x08, + DATA_ACK = 0x18, + DATA_POLL = 0x28, + DATA_POLL_ACK = 0x38, + NULL_FRAME = 0x48, + CFACK = 0x58, + CFPOLL = 0x68, + CFPOLL_ACK = 0x78, + QOS_DATA = 0x88, + QOS_DATA_ACK = 0x98, + QOS_DATA_POLL = 0xA8, + QOS_DATA_POLL_ACK = 0xB8, + QOS_NULL_FRAME = 0xC8, + QOS_CFPOLL = 0xE8, + QOS_CFPOLL_ACK = 0xF8, + M2M_WIFI_FRAME_SUB_TYPE_ANY = 0xFF + /*!< Set monitor mode to receive any of the frames types + */ +} tenuSubTypes; + +/*! +@enum \ + tenuInfoElementId + +@brief + Enumeration for the Wi-Fi Information Element(IE) IDs, which indicates the specific type of IEs. + IEs are management frame information included in management frames. + Values are defined as per the IEEE 802.11 standard. + +*/ +typedef enum { + ISSID = 0, + /*!< Service Set Identifier (SSID) + */ + ISUPRATES = 1, + /*!< Supported Rates + */ + IFHPARMS = 2, + /*!< FH parameter set + */ + IDSPARMS = 3, + /*!< DS parameter set + */ + ICFPARMS = 4, + /*!< CF parameter set + */ + ITIM = 5, + /*!< Traffic Information Map + */ + IIBPARMS = 6, + /*!< IBSS parameter set + */ + ICOUNTRY = 7, + /*!< Country element. + */ + IEDCAPARAMS = 12, + /*!< EDCA parameter set + */ + ITSPEC = 13, + /*!< Traffic Specification + */ + ITCLAS = 14, + /*!< Traffic Classification + */ + ISCHED = 15, + /*!< Schedule. + */ + ICTEXT = 16, + /*!< Challenge Text + */ + IPOWERCONSTRAINT = 32, + /*!< Power Constraint. + */ + IPOWERCAPABILITY = 33, + /*!< Power Capability + */ + ITPCREQUEST = 34, + /*!< TPC Request + */ + ITPCREPORT = 35, + /*!< TPC Report + */ + ISUPCHANNEL = 36, + /* Supported channel list + */ + ICHSWANNOUNC = 37, + /*!< Channel Switch Announcement + */ + IMEASUREMENTREQUEST = 38, + /*!< Measurement request + */ + IMEASUREMENTREPORT = 39, + /*!< Measurement report + */ + IQUIET = 40, + /*!< Quiet element Info + */ + IIBSSDFS = 41, + /*!< IBSS DFS + */ + IERPINFO = 42, + /*!< ERP Information + */ + ITSDELAY = 43, + /*!< TS Delay + */ + ITCLASPROCESS = 44, + /*!< TCLAS Processing + */ + IHTCAP = 45, + /*!< HT Capabilities + */ + IQOSCAP = 46, + /*!< QoS Capability + */ + IRSNELEMENT = 48, + /*!< RSN Information Element + */ + IEXSUPRATES = 50, + /*!< Extended Supported Rates + */ + IEXCHSWANNOUNC = 60, + /*!< Extended Ch Switch Announcement + */ + IHTOPERATION = 61, + /*!< HT Information + */ + ISECCHOFF = 62, + /*!< Secondary Channel Offset + */ + I2040COEX = 72, + /*!< 20/40 Coexistence IE + */ + I2040INTOLCHREPORT = 73, + /*!< 20/40 Intolerant channel report + */ + IOBSSSCAN = 74, + /*!< OBSS Scan parameters + */ + IEXTCAP = 127, + /*!< Extended capability + */ + IWMM = 221, + /*!< WMM parameters + */ + IWPAELEMENT = 221 + /*!< WPA Information Element + */ +} tenuInfoElementId; + +/*! +@struct \ + tenuWifiCapability + +@brief + Enumeration for capability Information field bit. + The value of the capability information field from the 802.11 management frames received by the wireless LAN +interface. Defining the capabilities of the Wi-Fi system. Values are defined as per the IEEE 802.11 standard. + +@details + Capabilities:- + ESS/IBSS : Defines whether a frame is coming from an AP or not. + POLLABLE : CF Poll-able + POLLREQ : Request to be polled + PRIVACY : WEP encryption supported + SHORTPREAMBLE : Short Preamble is supported + SHORTSLOT : Short Slot is supported + PBCC :PBCC + CHANNELAGILITY :Channel Agility + SPECTRUM_MGMT :Spectrum Management + DSSS_OFDM : DSSS-OFDM +*/ +typedef enum { + ESS = 0x01, + /*!< ESS capability + */ + IBSS = 0x02, + /*!< IBSS mode + */ + POLLABLE = 0x04, + /*!< CF Pollable + */ + POLLREQ = 0x08, + /*!< Request to be polled + */ + PRIVACY = 0x10, + /*!< WEP encryption supported + */ + SHORTPREAMBLE = 0x20, + /*!< Short Preamble is supported + */ + SHORTSLOT = 0x400, + /*!< Short Slot is supported + */ + PBCC = 0x40, + /*!< PBCC + */ + CHANNELAGILITY = 0x80, + /*!< Channel Agility + */ + SPECTRUM_MGMT = 0x100, + /*!< Spectrum Management + */ + DSSS_OFDM = 0x2000 + /*!< DSSS-OFDM + */ +} tenuWifiCapability; + +#endif + +/*! +@typedef \ + tpfAppWifiCb + +@brief + Wi-Fi's main callback function handler, for handling the M2M_WIFI events received on the Wi-Fi +interface. Such notifications are received in response to Wi-Fi/P2P operations such as @ref m2m_wifi_request_scan, + @ref m2m_wifi_connect. + Wi-Fi/P2P operations are implemented in an asynchronous mode, and all incoming information/status + are to be handled through this callback function when the corresponding notification is received. + Applications are expected to assign this wi-fi callback function by calling @ref m2m_wifi_init +@param [in] u8MsgType + Type of notifications. Possible types are: + /ref M2M_WIFI_RESP_CON_STATE_CHANGED + /ref M2M_WIFI_RESP_CONN_INFO + /ref M2M_WIFI_REQ_DHCP_CONF + /ref M2M_WIFI_REQ_WPS + /ref M2M_WIFI_RESP_IP_CONFLICT + /ref M2M_WIFI_RESP_SCAN_DONE + /ref M2M_WIFI_RESP_SCAN_RESULT + /ref M2M_WIFI_RESP_CURRENT_RSSI + /ref M2M_WIFI_RESP_CLIENT_INFO + /ref M2M_WIFI_RESP_PROVISION_INFO + /ref M2M_WIFI_RESP_DEFAULT_CONNECT + + In case Ethernet/Bypass mode is defined : + @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET + + In case monitoring mode is used: + @ref M2M_WIFI_RESP_WIFI_RX_PACKET + +@param [in] pvMsg + A pointer to a buffer containing the notification parameters (if any). It should be + casted to the correct data type corresponding to the notification type. + +@see + tstrM2mWifiStateChanged + tstrM2MWPSInfo + tstrM2mScanDone + tstrM2mWifiscanResult +*/ +typedef void (*tpfAppWifiCb)(uint8 u8MsgType, void *pvMsg); + +/*! +@typedef \ + tpfAppEthCb + +@brief + ETHERNET (bypass mode) notification callback function receiving Bypass mode events as defined in + the Wi-Fi responses enumeration @ref tenuM2mStaCmd. + +@param [in] u8MsgType + Type of notification. Possible types are: + - [M2M_WIFI_RESP_ETHERNET_RX_PACKET](@ref M2M_WIFI_RESP_ETHERNET_RX_PACKET) + +@param [in] pvMsg + A pointer to a buffer containing the notification parameters (if any). It should be + casted to the correct data type corresponding to the notification type. + For example, it could be a pointer to the buffer holding the received frame in case of @ref +M2M_WIFI_RESP_ETHERNET_RX_PACKET event. + +@param [in] pvControlBuf + A pointer to control buffer describing the accompanied message. + To be casted to @ref tstrM2mIpCtrlBuf in case of @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET event. + +@warning + Make sure that the application defines @ref ETH_MODE. + +@see + m2m_wifi_init + +*/ +typedef void (*tpfAppEthCb)(uint8 u8MsgType, void *pvMsg, void *pvCtrlBuf); + +/*! +@typedef \ + tpfAppMonCb + +@brief + Wi-Fi monitoring mode callback function. This function delivers all received wi-Fi packets through the Wi-Fi +interface. Applications requiring to operate in the monitoring should call the asynchronous function +m2m_wifi_enable_monitoring_mode and expect to receive the Wi-Fi packets through this callback function, when the event +is received. To disable the monitoring mode a call to @ref m2m_wifi_disable_monitoring_mode should be made. +@param [in] pstrWifiRxPacket + Pointer to a structure holding the Wi-Fi packet header parameters. + +@param [in] pu8Payload + Pointer to the buffer holding the Wi-Fi packet payload information required by the application starting +from the defined OFFSET by the application (when calling m2m_wifi_enable_monitoring_mode). Could hold a value of NULL, +if the application does not need any data from the payload. + +@param [in] u16PayloadSize + The size of the payload in bytes. + +@see + m2m_wifi_enable_monitoring_mode,m2m_wifi_init + +@warning + u16PayloadSize should not exceed the buffer size given through m2m_wifi_enable_monitoring_mode. + +*/ +typedef void (*tpfAppMonCb)(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize); + +/** +@struct \ + tstrEthInitParam + +@brief + Structure to hold Ethernet interface parameters. + Structure is to be defined and have its attributes set,based on the application's functionality before + a call is made to initialize the Wi-Fi operations by calling the @ref m2m_wifi_init function. + This structure is part of the Wi-Fi configuration structure @ref tstrWifiInitParam. + Applications shouldn't need to define this structure, if the bypass mode is not defined. + +@see + tpfAppEthCb + tpfAppWifiCb + m2m_wifi_init + +@warning + Make sure that application defines @ref ETH_MODE before using @ref tstrEthInitParam. + +*/ +typedef struct { + tpfAppWifiCb pfAppWifiCb; + /*!< + Callback for wifi notifications. + */ + tpfAppEthCb pfAppEthCb; + /*!< + Callback for Ethernet interface. + */ + uint8 *au8ethRcvBuf; + /*!< + Pointer to Receive Buffer of Ethernet Packet + */ + uint16 u16ethRcvBufSize; + /*!< + Size of Receive Buffer for Ethernet Packet + */ + uint8 u8EthernetEnable; + /*!< + Enable Ethernet mode flag + */ + uint8 __PAD8__; + /*!< + Padding + */ +} tstrEthInitParam; +/*! +@struct \ + tstrM2mIpCtrlBuf + +@brief + Structure holding the incoming buffer's data size information, indicating the data size of the buffer and the +remaining buffer's data size . The data of the buffer which holds the packet sent to the host when in the bypass mode, +is placed in the @ref tstrEthInitParam structure in the + @ref au8ethRcvBuf attribute. This following information is retrieved in the host when an event @ref +M2M_WIFI_RESP_ETHERNET_RX_PACKET is received in the Wi-Fi callback function @ref tpfAppWifiCb. + + The application is expected to use this structure's information to determine if there is still incoming data to be +received from the firmware. + + @see + tpfAppEthCb + tstrEthInitParam + + @warning + Make sure that ETHERNET/bypass mode is defined before using @ref tstrM2mIpCtrlBuf + + */ +typedef struct { + uint16 u16DataSize; + /*!< + Size of the received data in bytes. + */ + uint16 u16RemainigDataSize; + /*!< + Size of the remaining data bytes to be delivered to host. + */ +} tstrM2mIpCtrlBuf; + +/** +@struct \ + tstrWifiInitParam + +@brief + Structure, holding the Wi-fi configuration attributes such as the wi-fi callback , monitoring mode callback and +Ethernet parameter initialization structure. Such configuration parameters are required to be set before calling the +wi-fi initialization function @ref m2m_wifi_init. + @ref pfAppWifiCb attribute must be set to handle the wi-fi callback operations. + @ref pfAppMonCb attribute, is optional based on whether the application requires the monitoring mode configuration, +and can there not be set before the initialization. + @ref strEthInitParam structure, is another optional configuration based on whether the bypass mode is set. + + @see + tpfAppEthCb + tpfAppMonCb + tstrEthInitParam + +*/ +typedef struct { + tpfAppWifiCb pfAppWifiCb; + /*!< + Callback for Wi-Fi notifications. + */ + tpfAppMonCb pfAppMonCb; + /*!< + Callback for monitoring interface. + */ + tstrEthInitParam strEthInitParam; + /*!< + Structure to hold Ethernet interface parameters. + */ + +} tstrWifiInitParam; +//@} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup WLANAPI Function + * @ingroup m2m_wifi + */ +#ifdef __cplusplus +extern "C" { +#endif +/** @defgroup WiFiDownloadFn m2m_wifi_download_mode + * @ingroup WLANAPI + * Synchronous download mode entry function that prepares the WINC board to enter the download mode, ready for the + *firmware or certificate download. The WINC board is prepared for download, through initializations for the WINC driver + *including bus initializations and interrupt enabling, it also halts the chip, to allow for the firmware downloads. + * Firmware can be downloaded through a number of interfaces, UART, I2C and SPI. + */ +/**@{*/ +/*! +@fn \ + NMI_API void m2m_wifi_download_mode(void); +@brief Prepares the WINC broard before downloading any data (Firmware, Certificates .. etc) + + This function should called before starting to download any data to the WINC board. The WINC board is prepared +for download, through initializations for the WINC driver including bus initializations and interrupt enabling, it also +halts the chip, to allow for the firmware downloads Firmware can be downloaded through a number of interfaces, UART, I2C +and SPI. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_download_mode(void); + +/**@}*/ +/** @defgroup WifiInitFn m2m_wifi_init +* @ingroup WLANAPI +* Synchronous initialization function for the WINC driver. This function initializes the driver by, registering the +call back function for M2M_WIFI layer(also the call back function for bypass mode/monitoring mode if defined), +* initializing the host interface layer and the bus interfaces. +* Wi-Fi callback registering is essential to allow the handling of the events received, in response to the asynchronous +Wi-Fi operations. + +Following are the possible Wi-Fi events that are expected to be received through the call back function(provided by the +application) to the M2M_WIFI layer are : + + @ref M2M_WIFI_RESP_CON_STATE_CHANGED \n + @ref M2M_WIFI_RESP_CONN_INFO \n + @ref M2M_WIFI_REQ_DHCP_CONF \n + @ref M2M_WIFI_REQ_WPS \n + @ref M2M_WIFI_RESP_IP_CONFLICT \n + @ref M2M_WIFI_RESP_SCAN_DONE \n + @ref M2M_WIFI_RESP_SCAN_RESULT \n + @ref M2M_WIFI_RESP_CURRENT_RSSI \n + @ref M2M_WIFI_RESP_CLIENT_INFO \n + @ref M2M_WIFI_RESP_PROVISION_INFO \n + @ref M2M_WIFI_RESP_DEFAULT_CONNECT \n + Example: \n + In case Bypass mode is defined : \n + @ref M2M_WIFI_RESP_ETHERNET_RX_PACKET + + In case Monitoring mode is used: \n + @ref M2M_WIFI_RESP_WIFI_RX_PACKET + + Any application using the WINC driver must call this function at the start of its main function. +*/ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_init(tstrWifiInitParam * pWifiInitParam); + +@param [in] pWifiInitParam + This is a pointer to the @ref tstrWifiInitParam structure which holds the pointer to the application WIFI layer call +back function, monitoring mode call back and @ref tstrEthInitParam structure containing bypass mode parameters. + +@brief Initialize the WINC host driver. + This function initializes the driver by, registering the call back function for M2M_WIFI layer(also the call back +function for bypass mode/monitoring mode if defined), initializing the host interface layer and the bus interfaces. + +@pre + Prior to this function call, The application should initialize the BSP using "nm_bsp_init". + Also,application users must provide a call back function responsible for receiving all the WI-FI events that are +received on the M2M_WIFI layer. + +@warning + Failure to successfully complete function indicates that the driver couldn't be initialized and a fatal error will +prevent the application from proceeding. + +@see + nm_bsp_init + m2m_wifi_deinit + tenuM2mStaCmd + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_init(tstrWifiInitParam *pWifiInitParam); +/**@}*/ +/** @defgroup WifiDeinitFn m2m_wifi_deinit + * @ingroup WLANAPI + * Synchronous de-initialization function to the WINC1500 driver. De-initializes the host interface and frees any + * resources used by the M2M_WIFI layer. This function must be called in the application closing phase to ensure that + * all resources have been correctly released. No arguments are expected to be passed in. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_deinit(void * arg); + +@param [in] arg + Generic argument. Not used in the current implementation. +@brief Deinitilize the WINC driver and host enterface. + This function must be called at the De-initilization stage of the application. Generally This function should be +the last function before switching off the chip and it should be followed only by "nm_bsp_deinit" function call. Every +function call of "nm_wifi_init" should be matched with a call to nm_wifi_deinit. +@see + nm_bsp_deinit + nm_wifi_init + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_deinit(void *arg); + +/*! +@fn \ + NMI_API void m2m_wifi_yield(void); + +@brief + Yield from processing more synchronous M2M events + +@details + This function causes the synchronous M2M event handler function to yield from processing further + events and return control to the caller. + +@param [in] arg + Opaque argument, not used in current implementation. + +@return + The function returns @ref M2M_SUCCESS for successful interrupt handling and a negative value + otherwise. + +@pre + Prior to receiving Wi-Fi interrupts, the WINC driver should have been successfully initialized + by calling the @ref m2m_wifi_init function. + +@warning + Failure to successfully complete this function indicates bus errors and hence a fatal error that will prevent the +application from proceeding. +*/ + +NMI_API void m2m_wifi_yield(void); + +/**@}*/ +/** @defgroup WifiHandleEventsFn m2m_wifi_handle_events +* @ingroup WLANAPI +* Synchronous M2M event handler function, responsible for handling interrupts received from the WINC firmware. +* Application developers should call this function periodically in-order to receive the events that are to be +handled by the +* callback functions implemented by the application. + + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_handle_events(void * arg); + +@pre + Prior to receiving events, the WINC driver should have been successfully initialized by calling the @ref +m2m_wifi_init function. + +@brief Handle the varios events received from the WINC board. + Whenever an event happen in the WINC board (e.g. Connection, Disconnection , DHCP .. etc), WINC will interrupt +the host to let it know that a new event has occured. The host driver will attempt to handle these events whenever the +host driver decides to do that by calling the "m2m_wifi_handle_events" function. It's mandatory to call this function +periodically and independantly of any other condition. It's ideal to include this function in the main and the most +frequent loop of the host application. +@warning + Failure to successfully complete this function indicates bus errors and hence a fatal error that will prevent the +application from proceeding. + +@return + The function returns @ref M2M_SUCCESS for successful interrupt handling and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_handle_events(void *arg); + +/**@}*/ +/** @defgroup WifiSendCRLFn m2m_wifi_send_crl +* @ingroup WLANAPI +* Asynchronous API that notifies the WINC with the Certificate Revocation List to be used for TLS. + + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_send_crl(tstrTlsCrlInfo* pCRL); + +@brief + Asynchronous API that notifies the WINC with the Certificate Revocation List. + +@param [in] pCRL + Pointer to the structure containing certificate revocation list details. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ + +sint8 m2m_wifi_send_crl(tstrTlsCrlInfo *pCRL); + +/**@}*/ +/** @defgroup WifiDefaultConnectFn m2m_wifi_default_connect + * @ingroup WLANAPI + * Asynchronous Wi-Fi connection function. An application calling this function will cause the firmware to + correspondingly connect to the last successfully connected AP from the cached connections. + * A failure to connect will result in a response of @ref M2M_WIFI_RESP_DEFAULT_CONNECT indicating the connection + error as defined in the structure @ref tstrM2MDefaultConnResp. + * Possible errors are: + * The connection list is empty @ref M2M_DEFAULT_CONN_EMPTY_LIST or a mismatch for the saved AP name @ref + M2M_DEFAULT_CONN_SCAN_MISMATCH. + * only difference between this function and @ref m2m_wifi_connect, is the connection parameters. + * Connection using this function is expected to connect using cached connection parameters. + + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_default_connect(void); + +@pre + Prior to connecting, the WINC driver should have been successfully initialized by calling the @ref m2m_wifi_init +function. + +@brief Connect to the last successfully connected AP from the cached connections. + +@warning + This function must be called in station mode only. + It's important to note that successful completion of a call to m2m_wifi_default_connect() does not guarantee success of +the WIFI connection, and a negative return value indicates only locally-detected errors. + +@see + m2m_wifi_connect + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_default_connect(void); +/**@}*/ +/** @defgroup WifiConnectFn m2m_wifi_connect + * @ingroup WLANAPI + * Asynchronous wi-fi connection function to a specific AP. Prior to a successful connection, the application must + * define the SSID of the AP, the security type, the authentication information parameters and the channel number to + * which the connection will be established. The connection status is known when a response of @ref + * M2M_WIFI_RESP_CON_STATE_CHANGED is received based on the states defined in @ref tenuM2mConnState, successful + * connection is defined by @ref M2M_WIFI_CONNECTED + * + * The only difference between this function and @ref m2m_wifi_default_connect, is the connection parameters. + * Connection using this function is expected to be made to a specific AP and to a specified channel. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch); + +@param [in] pcSsid + A buffer holding the SSID corresponding to the requested AP. + +@param [in] u8SsidLen + Length of the given SSID (not including the NULL termination). + A length less than ZERO or greater than the maximum defined SSID @ref M2M_MAX_SSID_LEN will result in a +negative error + @ref M2M_ERR_FAIL. + +@param [in] u8SecType + Wi-Fi security type security for the network. It can be one of the following types: + -@ref M2M_WIFI_SEC_OPEN + -@ref M2M_WIFI_SEC_WEP + -@ref M2M_WIFI_SEC_WPA_PSK + -@ref M2M_WIFI_SEC_802_1X + A value outside these possible values will result in a negative return error @ref M2M_ERR_FAIL. + +@param [in] pvAuthInfo + Authentication parameters required for completing the connection. It is type is based on the Security +type. If the authentication parameters are NULL or are greater than the maximum length of the authentication parameters +length as defined by + @ref M2M_MAX_PSK_LEN a negative error will return @ref M2M_ERR_FAIL(-12) indicating connection failure. + +@param [in] u16Ch + Wi-Fi channel number as defined in @ref tenuM2mScanCh enumeration. + Channel number greater than @ref M2M_WIFI_CH_14 returns a negative error @ref M2M_ERR_FAIL(-12). + Except if the value is M2M_WIFI_CH_ALL(255), since this indicates that the firmware should scan all +channels to find the SSID requested to connect to. Failure to find the connection match will return a negative error +@ref M2M_DEFAULT_CONN_SCAN_MISMATCH. +@pre + Prior to a successful connection request, the Wi-Fi driver must have been successfully initialized through the +call of the @ref @m2m_wifi_init function +@see + tuniM2MWifiAuth + tstr1xAuthCredentials + tstrM2mWifiWepParams + +@warning + -This function must be called in station mode only. + -Successful completion of this function does not guarantee success of the WIFI connection, and + a negative return value indicates only locally-detected errors. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch); +/**@}*/ +/** @defgroup WifiConnectFn m2m_wifi_connect_sc + * @ingroup WLANAPI + * Asynchronous wi-fi connection function to a specific AP. Prior to a successful connection, the application + * developers must know the SSID of the AP, the security type, the authentication information parameters and the channel + * number to which the connection will be established.this API allows the user to choose whether to The connection + * status is known when a response of @ref M2M_WIFI_RESP_CON_STATE_CHANGED is received based on the states defined in + * @ref tenuM2mConnState, successful connection is defined by @ref M2M_WIFI_CONNECTED The only difference between this + * function and @ref m2m_wifi_connect, is the option to save the acess point info ( SSID, password...etc) or not. + * Connection using this function is expected to be made to a specific AP and to a specified channel. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 +u16Ch,uint8 u8SaveCred); + +@param [in] pcSsid + A buffer holding the SSID corresponding to the requested AP. + +@param [in] u8SsidLen + Length of the given SSID (not including the NULL termination). + A length less than ZERO or greater than the maximum defined SSID @ref M2M_MAX_SSID_LEN will result in a +negative error + @ref M2M_ERR_FAIL. + +@param [in] u8SecType + Wi-Fi security type security for the network. It can be one of the following types: + -@ref M2M_WIFI_SEC_OPEN + -@ref M2M_WIFI_SEC_WEP + -@ref M2M_WIFI_SEC_WPA_PSK + -@ref M2M_WIFI_SEC_802_1X + A value outside these possible values will result in a negative return error @ref M2M_ERR_FAIL. + +@param [in] pvAuthInfo + Authentication parameters required for completing the connection. It is type is based on the Security +type. If the authentication parameters are NULL or are greater than the maximum length of the authentication parameters +length as defined by + @ref M2M_MAX_PSK_LEN a negative error will return @ref M2M_ERR_FAIL(-12) indicating connection failure. + +@param [in] u16Ch + Wi-Fi channel number as defined in @ref tenuM2mScanCh enumeration. + Channel number greater than @ref M2M_WIFI_CH_14 returns a negative error @ref M2M_ERR_FAIL(-12). + Except if the value is M2M_WIFI_CH_ALL(255), since this indicates that the firmware should scan all +channels to find the SSID requested to connect to. Failure to find the connection match will return a negative error +@ref M2M_DEFAULT_CONN_SCAN_MISMATCH. + +@param [in] u8NoSaveCred + Option to store the acess point SSID and password into the WINC flash memory or not. + +@pre + Prior to a successful connection request, the wi-fi driver must have been successfully initialized through the +call of the @ref @m2m_wifi_init function +@see + tuniM2MWifiAuth + tstr1xAuthCredentials + tstrM2mWifiWepParams + +@warning + -This function must be called in station mode only. + -Successful completion of this function does not guarantee success of the WIFI connection, and + a negative return value indicates only locally-detected errors. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, + uint8 u8NoSaveCred); +/**@}*/ +/** @defgroup WifiDisconnectFn m2m_wifi_disconnect + * @ingroup WLANAPI + * Synchronous wi-fi disconnection function, requesting a Wi-Fi disconnection from the currently connected AP. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_disconnect(void); + +@pre + Disconnection request must be made to a successfully connected AP. If the WINC is not in the connected state, a call +to this function will hold insignificant. + +@brief Request a Wi-Fi disconnect from the currently connected AP. + After the Disconnect is complete the driver should recieve a response of @ref M2M_WIFI_RESP_CON_STATE_CHANGED +based on the states defined in @ref tenuM2mConnState, successful disconnection is defined by @ref M2M_WIFI_DISCONNECTED +. +@warning + This function must be called in station mode only. + +@see + m2m_wifi_connect + m2m_wifi_default_connect + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_disconnect(void); + +/**@}*/ +/** @defgroup StartProvisionModeFn m2m_wifi_start_provision_mode + * @ingroup WLANAPI + * Asynchronous Wi-Fi provisioning function, which starts the WINC HTTP PROVISIONING mode. + The function triggers the WINC to activate the Wi-Fi AP (HOTSPOT) mode with the passed configuration parameters and + then starts the HTTP Provision WEB Server. The provisioning status is returned in an event @ref + M2M_WIFI_RESP_PROVISION_INFO + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 +bEnableHttpRedirect); + +@param [in] pstrAPConfig + AP configuration parameters as defined in @ref tstrM2MAPConfig configuration structure. + A NULL value passed in, will result in a negative error @ref M2M_ERR_FAIL. + +@param [in] pcHttpServerDomainName + Domain name of the HTTP Provision WEB server which others will use to load the provisioning Home page. + The domain name can have one of the following 3 forms: + 1- "wincprov.com" + 2- "http://wincprov.com" + 3- "https://wincprov.com" + The forms 1 and 2 are equivalent, they both will start a plain http server, while form 3 + will start a secure HTTP provisioning Session (HTTP over SSL connection). + +@param [in] bEnableHttpRedirect + A flag to enable/disable the HTTP redirect feature. If Secure provisioning is enabled (i.e. the server + domain name uses "https" prefix) this flag is ignored (no meaning for redirect in HTTPS). + Possible values are: + - ZERO DO NOT Use HTTP Redirect. In this case the associated device could open the +provisioning page ONLY when the HTTP Provision URL of the WINC HTTP Server is correctly written on the browser. + - Non-Zero value Use HTTP Redirect. In this case, all http traffic (http://URL) from the associated + device (Phone, PC, ...etc) will be redirected to the WINC HTTP Provisioning Home +page. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. Registering +the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_PROVISION_INFO + m2m_wifi_stop_provision_mode + tstrM2MAPConfig + +@warning + DO Not use ".local" in the pcHttpServerDomainName. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +\section Example + The example demonstrates a code snippet for how provisioning is triggered and the response event received accordingly. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo*)pvMsg; + if(pstrProvInfo->u8Status == M2M_SUCCESS) + { + m2m_wifi_connect((char*)pstrProvInfo->au8SSID, (uint8)strlen(pstrProvInfo->au8SSID), +pstrProvInfo->u8SecType, pstrProvInfo->au8Password, M2M_WIFI_CH_ALL); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8 bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, + uint8 bEnableHttpRedirect); +/**@}*/ +/** @defgroup StopProvisioningModeFn m2m_wifi_stop_provision_mode + * @ingroup WLANAPI + * Synchronous provision termination function which stops the provision mode if it is active. + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_stop_provision_mode(void); + +@pre + An active provisioning session must be active before it is terminated through this function. +@see + m2m_wifi_start_provision_mode + +@return + The function returns ZERO for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_stop_provision_mode(void); +/**@}*/ +/** @defgroup GetConnectionInfoFn m2m_wifi_get_connection_info + * @ingroup WLANAPI + * Asynchronous connection status retrieval function, retrieves the status information of the currently connected AP. + * The result is passed to the Wi-Fi notification callback through the event @ref M2M_WIFI_RESP_CONN_INFO. Connection + * information is retrieved from the structure @ref tstrM2MConnInfo. + */ +/**@{*/ +/*! +@fn \ + sint8 m2m_wifi_get_connection_info(void); + +@brief + Retrieve the current Connection information. The result is passed to the Wi-Fi notification callback + with [M2M_WIFI_RESP_CONN_INFO](@ref M2M_WIFI_RESP_CONN_INFO). +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. Registering +the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + + Connection Information retrieved: + + -Connection Security + -Connection RSSI + -Remote MAC address + -Remote IP address + + and in case of WINC station mode the SSID of the AP is also retrieved. +@warning + -In case of WINC AP mode or P2P mode, ignore the SSID field (NULL string). +@sa + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], +pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_get_connection_info(void); +/**@}*/ +/** @defgroup WifiSetMacAddFn m2m_wifi_set_mac_address + * @ingroup WLANAPI + * Synchronous MAC address assigning to the NMC1500. It is used for non-production SW. Assign MAC address to the WINC + * device. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +@brief Assign a MAC address to the WINC board. + This function override the already assigned MAC address of the WINC board with a user provided one. This is for +experimental use only and should never be used in the production SW. + +@param [in] au8MacAddress + MAC Address to be set to the WINC. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +/**@}*/ +/** @defgroup WifiWpsFn m2m_wifi_wps + * @ingroup WLANAPI + * Asynchronous WPS triggering function. + * This function is called for the WINC to enter the WPS (Wi-Fi Protected Setup) mode. The result is passed to the + *Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char * pcPinNumber); + +@param [in] u8TriggerType + WPS Trigger method. Could be: + - [WPS_PIN_TRIGGER](@ref WPS_PIN_TRIGGER) Push button method + - [WPS_PBC_TRIGGER](@ref WPS_PBC_TRIGGER) Pin method + +@param [in] pcPinNumber + PIN number for WPS PIN method. It is not used if the trigger type is WPS_PBC_TRIGGER. It must follow the +rules stated by the WPS standard. + +@warning + This function is not allowed in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at startup. +Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event [M2M_WIFI_REQ_WPS](@ref M2M_WIFI_REQ_WPS) must be handled in the callback to receive the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be performed. + - The [m2m_wifi_handle_events](@ref m2m_wifi_handle_events) MUST be called periodically to receive the responses in +the callback. +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shows an example of how Wi-Fi WPS is triggered . +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch + 1); + + // establish Wi-Fi connection + m2m_wifi_connect((char*)pstrWPS->au8SSID, (uint8)m2m_strlen(pstrWPS->au8SSID), + pstrWPS->u8AuthType, pstrWPS->au8PSK, pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType, const char *pcPinNumber); +/**@}*/ +/** @defgroup WifiWpsDisableFn m2m_wifi_wps_disable + * @ingroup WLANAPI + * Disable the WINC1500 WPS operation. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps_disable(void); + +@pre WINC should be already in WPS mode using @ref m2m_wifi_wps + +@brief Stops the WPS ongoing session. + +@see + m2m_wifi_wps + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_wps_disable(void); + +/**@}*/ +/** @defgroup WifiP2PFn m2m_wifi_p2p + * @ingroup WLANAPI + * Asynchronous Wi-Fi direct (P2P) enabling mode function. + The WINC supports P2P in device listening mode ONLY (intent is ZERO). + The WINC P2P implementation does not support P2P GO (Group Owner) mode. + Active P2P devices (e.g. phones) could find the WINC in the search list. When a device is connected to WINC, a Wi-Fi + notification event + @ref M2M_WIFI_RESP_CON_STATE_CHANGED is triggered. After a short while, the DHCP IP Address is obtained + and an event @ref M2M_WIFI_REQ_DHCP_CONF is triggered. Refer to the code examples for a more illustrative example. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +@param [in] u8Channel + P2P Listen RF channel. According to the P2P standard It must hold only one of the following values 1, 6 +or 11. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF + must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + This function is not allowed in AP or STA modes. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet shown an example of how the p2p mode operates. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? +"CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("P2P IP Address +\"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); +/**@}*/ +/** @defgroup WifiP2PDisconnectFn m2m_wifi_p2p_disconnect + * @ingroup WLANAPI + * Disable the WINC1500 device Wi-Fi direct mode (P2P). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p_disconnect(void); +@pre + The p2p mode must have be enabled and active before a disconnect can be called. + +@see + m2m_wifi_p2p +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_p2p_disconnect(void); +/**@}*/ +/** @defgroup WifiEnableApFn m2m_wifi_enable_ap + * @ingroup WLANAPI + * Asynchronous Wi-FI hot-spot enabling function. + * The WINC supports AP mode operation with the following limitations: + - Only 1 STA could be associated at a time. + - Open and WEP are the only supported security types + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +@param [in] pstrM2MAPConfig + A structure holding the AP configurations. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main +function and the handling of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("Associated STA has IP Address +\"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig *pstrM2MAPConfig); +/**@}*/ +/** @defgroup WifiDisableApFn m2m_wifi_disable_ap + * @ingroup WLANAPI + * Synchronous Wi-Fi hot-spot disabling function. Must be called only when the AP is enabled through the @ref + * m2m_wifi_enable_ap function. Otherwise the call to this function will not be useful. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_disable_ap(void); +@see + m2m_wifi_enable_ap +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_disable_ap(void); +/**@}*/ +/** @defgroup SetStaticIPFn m2m_wifi_set_static_ip + * @ingroup WLANAPI + * Synchronous static IP Address configuration function. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@param [in] pstrStaticIPConf + Pointer to a structure holding the static IP Configurations (IP, + Gateway, subnet mask and DNS address). + +@pre The application must disable auto DHCP using @ref m2m_wifi_enable_dhcp before assigning a static IP address. + +@brief Assign a static IP address to the WINC board. + This function assigns a static IP address in case the AP doesn't have a DHCP server or in case the application +wants to assign a predefined known IP address. The user must take in mind that assigning a static IP address might +result in an IP address conflict. In case of an IP address conflict observed by the WINC board the user will get a +response of @ref M2M_WIFI_RESP_IP_CONFLICT in the wifi callback. The application is then responsible to either solve the +conflict or assign another IP address. +@warning + Normally this function normally should not be used. DHCP configuration is requested automatically after successful +Wi-Fi connection is established. + +@see + tstrM2MIPConfig + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf); + +/**@}*/ +/** @defgroup RequestDHCPClientFn m2m_wifi_request_dhcp_client + * @ingroup WLANAPI + * Starts the DHCP client operation(DHCP requested by the firmware automatically in STA/AP/P2P mode). + * + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +@warning + This function is legacy and exists only for compatability with older applications. DHCP configuration is requested +automatically after successful Wi-Fi connection is established. + +@return + The function returns @ref M2M_SUCCESS always. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_client(void); +/**@}*/ +/** @defgroup RequestDHCPServerFn m2m_wifi_request_dhcp_server + * @ingroup WLANAPI + * Dhcp requested by the firmware automatically in STA/AP/P2P mode). + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +@warning + This function is legacy and exists only for compatability with older applications. DHCP server is started +automatically when enabling the AP mode. + +@return + The function returns @ref M2M_SUCCESS always. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_server(uint8 *addr); +/**@}*/ +/** @defgroup WifiDHCPEnableFn m2m_wifi_enable_dhcp + * @ingroup WLANAPI + * Synchronous Wi-Fi DHCP enable function. This function Enable/Disable DHCP protocol. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + +@brief + Enable/Disable the DHCP client after connection. + +@param [in] u8DhcpEn + Possible values: + 1: Enable DHCP client after connection. + 0: Disable DHCP client after connection. +@warnings + -DHCP client is enabled by default + -This Function should be called before using m2m_wifi_set_static_ip() + +@sa + m2m_wifi_set_static_ip() + +@return + The function SHALL return @ref M2M_SUCCESS for successful operation and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn); +/**@}*/ +/** @defgroup WifiSetScanOptionFn m2m_wifi_set_scan_options + * @ingroup WLANAPI + * Synchronous Wi-Fi scan settings function. This function sets the time configuration parameters for the scan + * operation. + */ + +/*! +@fn \ + sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) + +@param [in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption); +/**@}*/ +/** @defgroup WifiSetScanRegionFn m2m_wifi_set_scan_region + * @ingroup WLANAPI + * Synchronous wi-fi scan region setting function. + * This function sets the scan region, which will affect the range of possible scan channels. + * For 2.5GHz supported in the current release, the requested scan region can't exceed the maximum number of channels + *(14). + *@{*/ +/*! +@fn \ + sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) + +@param [in] ScanRegion; + ASIA + NORTH_AMERICA +@see + tenuM2mScanCh + m2m_wifi_request_scan + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_set_scan_region(uint16 ScanRegion); +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan + * @ingroup WLANAPI + * Asynchronous Wi-FI scan request on the given channel. The scan status is delivered in the wifi event callback and + *then the application is supposed to read the scan results sequentially. The number of APs found (N) is returned in + *event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found APs. The application reads the list of APs by calling + *the function @ref m2m_wifi_req_scan_result N times. + * + *@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan_passive +* @ingroup WLANAPI +* Same as m2m_wifi_request_scan but perform passive scanning while the other one perform active scanning. + +* +*@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. + +@param [in] scan_time + The time in ms that passive scan is listening to beacons on each channel per one slot, enter 0 for deafult +setting. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time); + +/**@}*/ +/** @defgroup WifiRequestScanFn m2m_wifi_request_scan_ssid_list + * @ingroup WLANAPI + * Asynchronous wi-fi scan request on the given channel and the hidden scan list. The scan status is delivered in the + *wi-fi event callback and then the application is to read the scan results sequentially. The number of APs found (N) + *is returned in event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found APs. The application could read the + *list of APs by calling the function @ref m2m_wifi_req_scan_result N times. + * + *@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan_ssid_list(uint8 ch,uint8 * u8SsidList); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh. + With a value of M2M_WIFI_CH_ALL(255)), means to scan all channels. +@param [in] u8SsidList + u8SsidList is a buffer containing a list of hidden SSIDs to + include during the scan. The first byte in the buffer, u8SsidList[0], + is the number of SSIDs encoded in the string. The number of hidden SSIDs + cannot exceed MAX_HIDDEN_SITES. All SSIDs are concatenated in the following + bytes and each SSID is prefixed with a one-byte header containing its length. + The total number of bytes in u8SsidList buffer, including length byte, cannot + exceed 133 bytes (MAX_HIDDEN_SITES SSIDs x 32 bytes each, which is max SSID length). + For instance, encoding the two hidden SSIDs "DEMO_AP" and "TEST" + results in the following buffer content: +@code + uint8 u8SsidList[14]; + u8SsidList[0] = 2; // Number of SSIDs is 2 + u8SsidList[1] = 7; // Length of the string "DEMO_AP" without NULL termination + memcpy(&u8SsidList[2], "DEMO_AP", 7); // Bytes index 2-9 containing the string DEMO_AP + u8SsidList[9] = 4; // Length of the string "TEST" without NULL termination + memcpy(&u8SsidList[10], "TEST", 4); // Bytes index 10-13 containing the string TEST +@endcode + +@warning + This function is not allowed in P2P. It works only for STA/AP mode (connected or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + static void request_scan_hidden_demo_ap(void); + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + request_scan_hidden_demo_ap(); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + static void request_scan_hidden_demo_ap(void) + { + uint8 list[9]; + char ssid[] = "DEMO_AP"; + uint8 len = (uint8)(sizeof(ssid)-1); + + list[0] = 1; + list[1] = len; + memcpy(&list[2], ssid, len); // copy 7 bytes + // Scan all channels + m2m_wifi_request_scan_ssid_list(M2M_WIFI_CH_ALL, list); + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + request_scan_hidden_demo_ap(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan_ssid_list(uint8 ch, uint8 *u8Ssidlist); + +/**@}*/ +/** @defgroup WifiGetNumAPFoundFn m2m_wifi_get_num_ap_found + * @ingroup WLANAPI + * Synchronous function to retrieve the number of AP's found in the last scan request, The function reads the number of + * APs from global variable which was updated in the Wi-Fi callback function through the M2M_WIFI_RESP_SCAN_DONE event. + * Function used only in STA mode only. + */ +/**@{*/ +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +@see m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT +@pre m2m_wifi_request_scan need to be called first + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. +Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_RESP_SCAN_DONE must be handled in the callback to receive the requested scan +information. +@warning This function must be called only in the wi-fi callback function when the events @ref M2M_WIFI_RESP_SCAN_DONE +or @ref M2M_WIFI_RESP_SCAN_RESULT are received. Calling this function in any other place will result in +undefined/outdated numbers. +@return Return the number of AP's found in the last Scan Request. + +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API uint8 m2m_wifi_get_num_ap_found(void); +/**@}*/ +/** @defgroup WifiReqScanResult m2m_wifi_req_scan_result + * @ingroup WLANAPI + * Synchronous call to read the AP information from the SCAN Result list with the given index. + * This function is expected to be called when the response events M2M_WIFI_RESP_SCAN_RESULT or + * M2M_WIFI_RESP_SCAN_DONE are received in the wi-fi callback function. + * The response information received can be obtained through the casting to the @ref tstrM2mWifiscanResult structure + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found + +@see tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre @ref m2m_wifi_request_scan needs to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. +Registering the callback is done through passing it to the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the requested scan +information. +@warning Function used in STA mode only. the scan results are updated only if the scan request is called. + Calling this function only without a scan request will lead to firmware errors. + Refrain from introducing a large delay between the scan request and the scan result request, to prevent + errors occurring. + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and +the handling of the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +/**@}*/ +/** @defgroup WifiReqCurrentRssiFn m2m_wifi_req_curr_rssi + * @ingroup WLANAPI + * Asynchronous request for the current RSSI of the connected AP. + * The response received in through the @ref M2M_WIFI_RESP_CURRENT_RSSI event. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@pre - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered before +initialization. Registering the callback is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init) through +the @ref tstrWifiInitParam initialization structure. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback to receive the requested Rssi +information. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +\section Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of +the event received in the callback. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + sint8 *rssi = (sint8*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_req_curr_rssi(void); +/**@}*/ +/** @defgroup WifiGetOtpMacAddFn m2m_wifi_get_otp_mac_address + * @ingroup WLANAPI + * Request the MAC address stored on the One Time Programmable(OTP) memory of the device. + * The function is blocking until the response is received. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + Output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@pre m2m_wifi_init required to be called before any WIFI/socket function +@see m2m_wifi_get_mac_address + +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid); +/**@}*/ +/** @defgroup WifiGetMacAddFn m2m_wifi_get_mac_address + * @ingroup WLANAPI + * Function to retrieve the current MAC address. The function is blocking until the response is received. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@pre m2m_wifi_init required to be called before any WIFI/socket function +@see m2m_wifi_get_otp_mac_address +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr); +/**@}*/ +/** @defgroup SetSleepModeFn m2m_wifi_set_sleep_mode + * @ingroup WLANAPI + * This is one of the two synchronous power-save setting functions that + * allow the host MCU application to tweak the system power consumption. Such tweaking can be done through one of two + * ways: 1) Changing the power save mode, to one of the allowed power save modes @ref tenuPowerSaveModes. This is done + * by setting the first parameter 2) Configuring DTIM monitoring: Configuring beacon monitoring parameters by enabling + * or disabling the reception of broadcast/multicast data. this is done by setting the second parameter. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@param [in] PsTyp + Desired power saving mode. Supported types are enumerated in @ref tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC1500 will be awake each DTIM beacon for receiving broadcast traffic. + If it is 0, the WINC1500: disable broadcast traffic. Through this flag the WINC1500 will not wakeup at the +DTIM beacon, but it will wakeup depends only on the the configured Listen Interval. + +@warning The function called once after initialization. + +@see tenuPowerSaveModes + m2m_wifi_get_sleep_mode + m2m_wifi_set_lsn_int + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +/**@}*/ +/** @defgroup WifiRequestSleepFn m2m_wifi_request_sleep + * @ingroup WLANAPI + * Synchronous power-save sleep request function, which requests from the WINC1500 device to sleep in the currenlty + * configured power save mode as defined by the @ref m2m_wifi_set_sleep_mode, for a specific time as defined by the + * passed in parameter. This function should be used in the @ref M2M_PS_MANUAL power save mode only. A wake up + * request is automatically performed by the WINC1500 device when any host driver API function, e.g. Wi-Fi or socket + * operation is called. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); +@param [in] u32SlpReqTime + Request sleep time in ms + The best recommended sleep duration is left to be determined by the application. Taking into account that if +the application sends notifications very rarely, sleeping for a long time can be a power-efficient decision. In contrast +applications that are senstive for long periods of absence can experience performance degradation in the connection if +long sleeping times are used. +@warning The function should be called in @ref M2M_PS_MANUAL power save mode only. As enumerated in @ref +tenuPowerSaveModes It's also important to note that during the sleeping time while in the M2M_PS_MANUAL mode, AP beacon +monitoring is bypassed and the wifi-connection may drop if the sleep period is enlongated. +@see tenuPowerSaveModes + m2m_wifi_set_sleep_mode + +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); +/**@}*/ +/** @defgroup GetSleepModeFn m2m_wifi_get_sleep_mode + * @ingroup WLANAPI + * Synchronous power save mode retrieval function. + */ +/**@{*/ +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@see tenuPowerSaveModes + m2m_wifi_set_sleep_mode +@return The current operating power saving mode based on the enumerated sleep modes @ref tenuPowerSaveModes. +*/ +NMI_API uint8 m2m_wifi_get_sleep_mode(void); +/**@}*/ +/** @defgroup WifiReqClientCtrlFn m2m_wifi_req_client_ctrl + * @ingroup WLANAPI + * Asynchronous command sending function to the PS Client (An WINC1500 board running the ps_firmware) + * if the PS client send any command it will be received through the @ref M2M_WIFI_RESP_CLIENT_INFO event + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +@brief +@param [in] cmd + Control command sent from PS Server to PS Client (command values defined by the application) +@pre @ref m2m_wifi_req_server_init should be called first +@warning This mode is not supported in the current release. +@see m2m_wifi_req_server_init + M2M_WIFI_RESP_CLIENT_INFO +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +/**@}*/ +/** @defgroup WifiReqServerInit m2m_wifi_req_server_init + * @ingroup WLANAPI + * Synchronous function to initialize the PS Server. + * The WINC1500 supports non secure communication with another WINC1500, + * (SERVER/CLIENT) through one byte command (probe request and probe response) without any connection setup. + * The server mode can't be used with any other modes (STA/P2P/AP) + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +@param [in] ch + Server listening channel +@see m2m_wifi_req_client_ctrl +@warning This mode is not supported in the current release. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +/**@}*/ +/** @defgroup WifiSetDeviceNameFn m2m_wifi_set_device_name + * @ingroup WLANAPI + * Sets the WINC device name. The name string is used as a device name in both (P2P) WiFi-Direct mode as well as DHCP + * hostname (option 12). For P2P devices to communicate a device name must be present. If it is not set through this + * function a default name is assigned. The default name is WINC-XX-YY, where XX and YY are the last 2 octets of the + * OTP MAC address. If OTP (eFuse) is programmed, then the default name is WINC-00-00. + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@param [in] pu8DeviceName + A Buffer holding the device name. Device name is a null terminated C string. +@param [in] u8DeviceNameLength + The length of the device name. Should not exceed the maximum device name's length @ref M2M_DEVICE_NAME_MAX +(including null character). +@warning The function called once after initialization. + Used for the Wi-Fi Direct (P2P) as well as DHCP client hostname option (12). +@warning Device name shall contain only characters allowed in valid internet host name as defined in RFC 952 and +1123. +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +/**@}*/ +/** @defgroup WifiSetLsnIntFn m2m_wifi_set_lsn_int + * @ingroup WLANAPI + * This is one of the two synchronous power-save setting functions that + * allow the host MCU application to tweak the system power consumption. Such tweaking can be done by modifying the + * the Wi-Fi listen interval. The listen interval is how many beacon periods the station can sleep before it wakes up + *to receive data buffer in AP. It is represented in units of AP beacon periods(100ms). + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@pre Function @m2m_wifi_set_sleep_mode shall be called first, to set the power saving mode required. +@warning The function should be called once after initialization. +@see tstrM2mLsnInt + m2m_wifi_set_sleep_mode +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*/ +NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); +/**@}*/ +/** @defgroup WifiEnableMonitorModeFn m2m_wifi_enable_monitoring_mode + * @ingroup WLANAPI + * Asynchronous Wi-Fi monitoring mode (Promiscuous mode) enabling function. This function enables the monitoring + * mode, thus allowing two operations to be performed: 1) Transmission of manually configured frames, through using the + * @ref m2m_wifi_send_wlan_pkt function. 2) Reception of frames based on a defined filtering criteria When the + * monitoring mode is enabled, reception of all frames that satisfy the filter criteria passed in as a parameter is + * allowed, on the current wireless channel \n. All packets that meet the filtering criteria are passed to the + * application layer, to be handled by the assigned monitoring callback function \n. The monitoring callback function + * must be implemented before starting the monitoring mode, in-order to handle the packets received \n. Registering + * of the implemented callback function is through the callback pointer @ref tpfAppMonCb in the @ref + * tstrWifiInitParam structure\n. passed to @ref m2m_wifi_init function at initialization. + * + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8 *, uint16 , +uint16); + * @param [in] pstrMtrCtrl + * Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the filtering parameters. + * @param [in] pu8PayloadBuffer + * Pointer to a buffer allocated by the application. The buffer SHALL hold the Data field of + * the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + * be discarded by the monitoring driver. + * @param [in] u16BufferSize + * The total size of the pu8PayloadBuffer in bytes. + * @param [in] u16DataOffset + * Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + * in reading specific information from the received packet. It must assign the offset to the starting + * position of it relative to the DATA payload start.\n + * \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ \e +packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + * @warning When This mode is enabled, you can not be connected in any mode (Station, Access Point, or P2P).\n + * @see tstrM2MWifiMonitorModeCtrl + tstrM2MWifiRxPacketInfo + tstrWifiInitParam + tenuM2mScanCh + m2m_wifi_disable_monitoring_mode + m2m_wifi_send_wlan_pkt + m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +*\section Example +* The example demonstrates the main function where-by the monitoring enable function is called after the initialization +of the driver and the packets are +* handled in the callback function. +* @code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + //Declare receive buffer + uint8 gmgmt[1600]; + + //Callback functions + void wifi_cb(uint8 u8WiFiEvent, void * pvMsg) + { + ; + } + void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize) + { + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } + } + + int main() + { + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; + } + * @endcode + */ +NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset); +/**@}*/ +/** @defgroup WifiDisableMonitorModeFn m2m_wifi_disable_monitoring_mode + * @ingroup WLANAPI + * Synchronous function to disable Wi-Fi monitoring mode (Promiscuous mode). Expected to be called, if the enable + * monitoring mode is set, but if it was called without enabling no negative impact will reside. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + * @see m2m_wifi_enable_monitoring_mode + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); +/**@}*/ +/** @defgroup SendWlanPktFn m2m_wifi_send_wlan_pkt + * @ingroup WLANAPI + * Synchronous function to transmit a WIFI RAW packet while the implementation of this packet is left to the + * application developer. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *, uint16, uint16); + + * @param [in] pu8WlanPacket + * Pointer to a buffer holding the whole WIFI frame. + * @param [in] u16WlanHeaderLength + * The size of the WIFI packet header ONLY. + * @param [in] u16WlanPktSize + * The size of the whole bytes in packet. + * @see m2m_wifi_enable_monitoring_mode + m2m_wifi_disable_monitoring_mode + * @pre Enable Monitoring mode first using @ref m2m_wifi_enable_monitoring_mode + * @warning This function available in monitoring mode ONLY.\n + * @note Packets are user's responsibility. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize); +/**@}*/ +/** @defgroup WifiSendEthernetPktFn m2m_wifi_send_ethernet_pkt + * @ingroup WLANAPI + * Synchronous function to transmit an Ethernet packet. Transmit a packet directly in ETHERNET/bypass mode where the + * TCP/IP stack is disabled and the implementation of this packet is left to the application developer. The Ethernet + * packet composition is left to the application developer. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) + * @param [in] pu8Packet + * Pointer to a buffer holding the whole Ethernet frame. + * @param [in] u16PacketSize + * The size of the whole bytes in packet. + * @warning This function available in ETHERNET/Bypass mode ONLY. Make sure that application defines @ref + ETH_MODE.\n + * @note Packets are the user's responsibility. + * @sa m2m_wifi_enable_mac_mcast,m2m_wifi_set_receive_buffer + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8 *pu8Packet, uint16 u16PacketSize); +/**@}*/ +/** @defgroup WifiEnableSntpFn m2m_wifi_enable_sntp + * @ingroup WLANAPI + * Synchronous function to enable/disable the native Simple Network Time Protocol(SNTP) client in the WINC1500 + * firmware.\n The SNTP is enabled by default at start-up.The SNTP client at firmware is used to synchronize the system + * clock to the UTC time from the well known time servers (e.g. "time-c.nist.gov"). The SNTP client uses a default + * update cycle of 1 day. The UTC is important for checking the expiration date of X509 certificates used while + * establishing TLS (Transport Layer Security) connections. It is highly recommended to use it if there is no other + * means to get the UTC time. If there is a RTC on the host MCU, the SNTP could be disabled and the host should set + * the system time to the firmware using the @ref m2m_wifi_set_system_time function. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_sntp(uint8); + * @param [in] bEnable + * Enabling/Disabling flag + * '0' :disable SNTP + * '1' :enable SNTP + * @see m2m_wifi_set_sytem_time + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_enable_sntp(uint8 bEnable); +/**@}*/ +/** @defgroup WifiSetSystemTime m2m_wifi_set_sytem_time + * @ingroup WLANAPI + * Synchronous function for setting the system time in time/date format (@ref uint32).\n + * The @ref tstrSystemTime structure can be used as a reference to the time values that should be set and pass its + * value as @ref uint32 + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_sytem_time(uint32); + * @param [in] u32UTCSeconds + * Seconds elapsed since January 1, 1900 (NTP Timestamp). + * @see m2m_wifi_enable_sntp + * tstrSystemTime + * @note If there is an RTC on the host MCU, the SNTP could be disabled and the host should set the system time + *to the firmware using the API @ref m2m_wifi_set_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds); +/**@}*/ +/** @defgroup WifiGetSystemTime m2m_wifi_get_sytem_time + * @ingroup WLANAPI + * Asynchronous function used to retrieve the system time through the use of the response @ref + * M2M_WIFI_RESP_GET_SYS_TIME. Response time retrieved is parsed into the members defined in the structure @ref + * tstrSystemTime. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note Get the system time from the SNTP client + * using the API @ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_get_sytem_time(void); +/**@}*/ +/** @defgroup WifiSetCustInfoElementFn m2m_wifi_set_cust_InfoElement + * @ingroup WLANAPI + * Synchronous function to Add/Remove user-defined Information Element to the WIFIBeacon and Probe Response frames + * while chip mode is Access Point Mode.\n According to the information element layout shown bellow, if it is required + * to set new data for the information elements, pass in the buffer with the information according to the sizes and + * ordering defined bellow. However, if it's required to delete these IEs, fill the buffer with zeros. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8*); + * @param [in] pau8M2mCustInfoElement + * Pointer to Buffer containing the IE to be sent. It is the application developer's + responsibility to ensure on the correctness of the information element's ordering passed in. + * @warning - Size of All elements combined must not exceed 255 byte.\n + * - Used in Access Point Mode \n + * @note IEs Format will be follow the following layout:\n + * @verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- + ---------------------- | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | + Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- + --------|-----------|------------------| | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | + Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- + ---------------------- + * @endverbatim + * @see m2m_wifi_enable_sntp + * tstrSystemTime + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + \section Example + The example demonstrates how the information elements are set using this function. + *@code + * + char elementData[21]; + static char state = 0; // To Add, Append, and Delete + if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; + } else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; + } else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; + } + m2m_wifi_set_cust_InfoElement(elementData); + * @endcode + */ +NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8 *pau8M2mCustInfoElement); +/**@}*/ +/** @defgroup WifiSetPowerProfile m2m_wifi_set_power_profile + * @ingroup WLANAPI + * Change the power profile mode + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief +@param [in] u8PwrMode + Change the WINC1500 power profile to different mode based on the enumeration + @ref tenuM2mPwrMode +@pre Must be called after the initializations and before any connection request and can't be changed in run time. +@sa tenuM2mPwrMode + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +/**@}*/ +/** @defgroup WifiSetTxPower m2m_wifi_set_tx_power + * @ingroup WLANAPI + * Set the TX power tenuM2mTxPwrLevel + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@param [in] u8TxPwrLevel + change the TX power based on the enumeration tenuM2mTxPwrLevel +@pre Must be called after the initialization and before any connection request and can't be changed in runtime. +@sa tenuM2mTxPwrLevel + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +/**@}*/ +/** @defgroup WifiEnableFirmware m2m_wifi_enable_firmware_logs + * @ingroup WLANAPI + * Enable or Disable logs in run time (Disabling Firmware logs will + * enhance the firmware start-up time and performance) + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@param [in] u8Enable + Set 1 to enable the logs, 0 for disable +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) + m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +/**@}*/ +/** @defgroup WifiSetBatteryVoltage m2m_wifi_set_battery_voltage + * @ingroup WLANAPI + * Set the battery voltage to update the firmware calculations + */ +/**@{*/ +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint8 u8BattVolt) +@brief Set the battery voltage to update the firmware calculations +@param [in] dbBattVolt + Battery Volt in double +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +/**@}*/ +/** @defgroup WifiSetGains m2m_wifi_set_gains + * @ingroup WLANAPI + * Set the chip gains mainly (PPA for 11b/11gn) + */ +/**@{*/ +/*! +@fn sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams* pstrM2mGain); +@brief Set the chip PPA gain for 11b/11gn +@param [in] pstrM2mGain + tstrM2mWifiGainsParams contain gain parmaters as implemnted in rf document +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams *pstrM2mGain); +/**@}*/ +/** @defgroup WifiGetFirmwareVersion m2m_wifi_get_firmware_version + * @ingroup WLANAPI + * Get Firmware version info as defined in the structure @ref tstrM2mRev. + */ +/**@{*/ +/*! +@fn m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) +@param [out] M2mRev + Pointer to the structure @ref tstrM2mRev that contains the firmware version parameters +@pre Must be called after intialization through the following function @ref m2m_wifi_init +@sa m2m_wifi_init +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); +/**@}*/ +#ifdef ETH_MODE +/** @defgroup WifiEnableMacMcastFn m2m_wifi_enable_mac_mcast + * @ingroup WLANAPI + * Synchronous function for filtering received MAC addresses from certain MAC address groups. + * This function allows the addtion/removal of certain MAC addresses, used in the multicast filter. + */ +/**@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *, uint8); + * @brief + * @param [in] pu8MulticastMacAddress + * Pointer to MAC address + * @param [in] u8AddRemove + * A flag to add or remove the MAC ADDRESS, based on the following values: + * - 0 : remove MAC address + * - 1 : add MAC address + * @warning This function is available in ETHERNET/bypass mode ONLY. Make sure that the application defines @ref + * ETH_MODE.\n + * @note Maximum number of MAC addresses that could be added is 8. + * @sa m2m_wifi_set_receive_buffer, m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *pu8MulticastMacAddress, uint8 u8AddRemove); +/**@}*/ +/** @defgroup SetReceiveBufferFn m2m_wifi_set_receive_buffer + * @ingroup WLANAPI + * Synchronous function for setting or modifying the receiver buffer's length. + * In the ETHERNET/bypass mode the application should define a callback of type @ref tpfAppEthCb, through which the + *application handles the received ethernet frames. It is through this callback function that the user can dynamically + *modify the length of the currently used receiver buffer. + *@{*/ +/*! + * @fn NMI_API sint8 m2m_wifi_set_receive_buffer(void *, uint16); + + * @param [in] pvBuffer + * Pointer to Buffer to receive data. + * NULL pointer causes a negative error @ref M2M_ERR_FAIL. + * + * @param [in] u16BufferLen + * Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + * defined as @ref SOCKET_BUFFER_MAX_LENGTH + * + * @warning This function is available in the Ethernet/bypass mode ONLY. Make sure that the application defines + @ref ETH_MODE.\n + * @sa m2m_wifi_enable_mac_mcast,m2m_wifi_send_ethernet_pkt + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_set_receive_buffer(void *pvBuffer, uint16 u16BufferLen); +/**@}*/ +#endif /* ETH_MODE */ +/** @defgroup GetPrngBytes m2m_wifi_prng_get_random_bytes + * @ingroup WLANAPI + * Asynchronous function for retrieving from the firmware a pseudo-random set of bytes as specifed in the size passed + *in as a parameter. The registered wifi-cb function retrieves the random bytes through the response @ref + *M2M_WIFI_RESP_GET_PRNG + *@{*/ +/*! + * @fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PRNGBuff,uint16 u16PRNGSize) + * @param [out] pu8PrngBuff + * Pointer to a buffer to receive data. + * @param [in] u16PrngSize + * Request size in bytes + *@warning Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + * causes a negative error @ref M2M_ERR_FAIL. + *@see tstrPrng + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_prng_get_random_bytes(uint8 *pu8PrngBuff, uint16 u16PrngSize); +/**@}*/ + +/** @defgroup WifiConfAutRate m2m_wifi_conf_auto_rate + * @ingroup WLANAPI + * Configures WLAN automatic TX rate adaptation algorithm. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate * pstrConfAutoRate) + +@brief + Allow the host MCU app to configure auto TX rate selection algorithm. The application can use this + API to tweak the algorithm performance. Moreover, it allows the application to force a specific WLAN + PHY rate for transmitted data packets to favor range vs. throughput needs. + +@param [in] pstrConfAutoRate + The Auto rate configuration parameters as listed in tstrConfAutoRate. +@sa + tstrConfAutoRate +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate *pstrConfAutoRate); +/**@}*/ + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ate_mode.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ate_mode.c new file mode 100644 index 0000000..6c5e19b --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ate_mode.c @@ -0,0 +1,787 @@ +/** + * + * \file + * + * \brief NMC1500 Peripherials Application Interface. + * + * Copyright (c) 2014 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_ate_mode.h" +#include "driver/source/nmasic.h" +#include "driver/source/nmdrv.h" +#include "m2m_hif.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define rInterrupt_CORTUS_0 (0x10a8) +#define rInterrupt_CORTUS_1 (0x10ac) +#define rInterrupt_CORTUS_2 (0x10b0) + +#define rBurstTx_NMI_TX_RATE (0x161d00) +#define rBurstTx_NMI_NUM_TX_FRAMES (0x161d04) +#define rBurstTx_NMI_TX_FRAME_LEN (0x161d08) +#define rBurstTx_NMI_TX_CW_PARAM (0x161d0c) +#define rBurstTx_NMI_TX_GAIN (0x161d10) +#define rBurstTx_NMI_TX_DPD_CTRL (0x161d14) +#define rBurstTx_NMI_USE_PMU (0x161d18) +#define rBurstTx_NMI_TEST_CH (0x161d1c) +#define rBurstTx_NMI_TX_PHY_CONT (0x161d20) +#define rBurstTx_NMI_TX_CW_MODE (0x161d24) +#define rBurstTx_NMI_TEST_XO_OFF (0x161d28) +#define rBurstTx_NMI_USE_EFUSE_XO_OFF (0x161d2c) + +#define rBurstTx_NMI_MAC_FILTER_ENABLE_DA (0x161d30) +#define rBurstTx_NMI_MAC_ADDR_LO_PEER (0x161d34) +#define rBurstTx_NMI_MAC_ADDR_LO_SELF (0x161d38) +#define rBurstTx_NMI_MAC_ADDR_HI_PEER (0x161d3c) +#define rBurstTx_NMI_MAC_ADDR_HI_SELF (0x161d40) +#define rBurstTx_NMI_RX_PKT_CNT_SUCCESS (0x161d44) +#define rBurstTx_NMI_RX_PKT_CNT_FAIL (0x161d48) +#define rBurstTx_NMI_SET_SELF_MAC_ADDR (0x161d4c) +#define rBurstTx_NMI_MAC_ADDR_LO_SA (0x161d50) +#define rBurstTx_NMI_MAC_ADDR_HI_SA (0x161d54) +#define rBurstTx_NMI_MAC_FILTER_ENABLE_SA (0x161d58) + +#define rBurstRx_NMI_RX_ALL_PKTS_CONT (0x9898) +#define rBurstRx_NMI_RX_ERR_PKTS_CONT (0x988c) + +#define TX_DGAIN_MAX_NUM_REGS (4) +#define TX_DGAIN_REG_BASE_ADDRESS (0x1240) +#define TX_GAIN_CODE_MAX_NUM_REGS (3) +#define TX_GAIN_CODE_BASE_ADDRESS (0x1250) +#define TX_PA_MAX_NUM_REGS (3) +#define TX_PA_BASE_ADDRESS (0x1e58) +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +VARIABLES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +volatile static uint8 gu8AteIsRunning = 0; /*!< ATE firmware status, 1 means ATE is running otherwise stopped */ +volatile static uint8 gu8RxState = 0; /*!< RX status, 1 means Rx is running otherwise stopped */ +volatile static uint8 gu8TxState = 0; /*!< TX status, 1 means Tx is running otherwise stopped */ +volatile static uint32 gaAteFwTxRates[M2M_ATE_MAX_NUM_OF_RATES] = { + 0x01, 0x02, 0x05, 0x0B, /*B-Rats*/ + 0x06, 0x09, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x36, /*G-Rats*/ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 /*N-Rats*/ +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static void m2m_ate_set_rx_status(uint8 u8Value) +{ + gu8RxState = u8Value; +} + +static void m2m_ate_set_tx_status(uint8 u8Value) +{ + gu8TxState = u8Value; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(void) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_ATE_HIGH; + + s8Ret = nm_drv_init(&u8WifiMode); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_init(tstrM2mAteInit *pstrInit); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init_param(tstrM2mAteInit *pstrInit) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_drv_init((void *)&pstrInit->u8RxPwrMode); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void) +{ + return nm_drv_deinit(NULL); +} + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8 u8State) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32_t u32Val = 0; + + if ((M2M_ATE_FW_STATE_STOP == u8State) && (M2M_ATE_FW_STATE_STOP != gu8AteIsRunning)) { + u32Val = nm_read_reg(rNMI_GLB_RESET); + u32Val &= ~(1 << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + gu8AteIsRunning = M2M_ATE_FW_STATE_STOP; + } else if ((M2M_ATE_FW_STATE_RUN == u8State) && (M2M_ATE_FW_STATE_RUN != gu8AteIsRunning)) { + /* 0x1118[0]=0 at power-on-reset: pad-based control. */ + /* Switch cortus reset register to register control. 0x1118[0]=1. */ + u32Val = nm_read_reg(rNMI_BOOT_RESET_MUX); + u32Val |= (1 << 0); + s8Ret = nm_write_reg(rNMI_BOOT_RESET_MUX, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + /** + Write the firmware download complete magic value 0x10ADD09E at + location 0xFFFF000C (Cortus map) or C000C (AHB map). + This will let the boot-rom code execute from RAM. + **/ + s8Ret = nm_write_reg(0xc0000, 0x71); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + + u32Val = nm_read_reg(rNMI_GLB_RESET); + if ((u32Val & (1ul << 10)) == (1ul << 10)) { + u32Val &= ~(1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + } + + u32Val |= (1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if (M2M_SUCCESS != s8Ret) { + goto __EXIT; + } + gu8AteIsRunning = M2M_ATE_FW_STATE_RUN; + } else { + s8Ret = M2M_ATE_ERR_UNHANDLED_CASE; + } + +__EXIT: + if ((M2M_SUCCESS == s8Ret) && (M2M_ATE_FW_STATE_RUN == gu8AteIsRunning)) { + nm_bsp_sleep(500); /*wait for ATE firmware start up*/ + } + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void) +{ + return gu8AteIsRunning; +} + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8 u8Index) +{ + if (M2M_ATE_MAX_NUM_OF_RATES <= u8Index) { + return 0; + } + return gaAteFwTxRates[u8Index]; +} + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void) +{ + return gu8TxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx *strM2mAteTx) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8LoopCntr = 0; + uint32_t val32; + + if (NULL == strM2mAteTx) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (0 != m2m_ate_get_rx_status()) { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if ((strM2mAteTx->channel_num < M2M_ATE_CHANNEL_1) || (strM2mAteTx->channel_num > M2M_ATE_CHANNEL_14) + || (strM2mAteTx->tx_gain_sel < M2M_ATE_TX_GAIN_DYNAMIC) || (strM2mAteTx->tx_gain_sel > M2M_ATE_TX_GAIN_TELEC) + || (strM2mAteTx->frame_len > M2M_ATE_MAX_FRAME_LENGTH) || (strM2mAteTx->frame_len < M2M_ATE_MIN_FRAME_LENGTH)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if ((strM2mAteTx->duty_cycle < M2M_ATE_TX_DUTY_MAX_VALUE /*1*/) + || (strM2mAteTx->duty_cycle > M2M_ATE_TX_DUTY_MIN_VALUE /*10*/) + || (strM2mAteTx->dpd_ctrl < M2M_ATE_TX_DPD_DYNAMIC) || (strM2mAteTx->dpd_ctrl > M2M_ATE_TX_DPD_ENABLED) + || (strM2mAteTx->use_pmu > M2M_ATE_PMU_ENABLE) || (strM2mAteTx->phy_burst_tx < M2M_ATE_TX_SRC_MAC) + || (strM2mAteTx->phy_burst_tx > M2M_ATE_TX_SRC_PHY) || (strM2mAteTx->cw_tx < M2M_ATE_TX_MODE_NORM) + || (strM2mAteTx->cw_tx > M2M_ATE_TX_MODE_CW)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + for (u8LoopCntr = 0; u8LoopCntr < M2M_ATE_MAX_NUM_OF_RATES; u8LoopCntr++) { + if (gaAteFwTxRates[u8LoopCntr] == strM2mAteTx->data_rate) { + break; + } + } + + if (M2M_ATE_MAX_NUM_OF_RATES == u8LoopCntr) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteTx->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_PHY_CONT, strM2mAteTx->phy_burst_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_NUM_TX_FRAMES, strM2mAteTx->num_frames); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_GAIN, strM2mAteTx->tx_gain_sel); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteTx->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_FRAME_LEN, strM2mAteTx->frame_len); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_PARAM, strM2mAteTx->duty_cycle); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_DPD_CTRL, strM2mAteTx->dpd_ctrl); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_RATE, strM2mAteTx->data_rate); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_MODE, strM2mAteTx->cw_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteTx->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteTx->use_efuse_xo_offset); + + val32 = strM2mAteTx->peer_mac_addr[5] << 0; + val32 |= strM2mAteTx->peer_mac_addr[4] << 8; + val32 |= strM2mAteTx->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_PEER, val32); + + val32 = strM2mAteTx->peer_mac_addr[2] << 0; + val32 |= strM2mAteTx->peer_mac_addr[1] << 8; + val32 |= strM2mAteTx->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_PEER, val32); + + if (M2M_SUCCESS == s8Ret) { + s8Ret += nm_write_reg(rInterrupt_CORTUS_0, 1); /*Interrupt Cortus*/ + m2m_ate_set_tx_status(1); + nm_bsp_sleep(200); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_write_reg(rInterrupt_CORTUS_1, 1); + if (M2M_SUCCESS == s8Ret) { + m2m_ate_set_tx_status(0); + } + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void) +{ + return gu8RxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx *strM2mAteRxStr) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32 val32; + if (NULL == strM2mAteRxStr) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (0 != m2m_ate_get_rx_status()) { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if ((strM2mAteRxStr->channel_num < M2M_ATE_CHANNEL_1) || (strM2mAteRxStr->channel_num > M2M_ATE_CHANNEL_14) + || (strM2mAteRxStr->use_pmu > M2M_ATE_PMU_ENABLE)) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteRxStr->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteRxStr->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteRxStr->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteRxStr->use_efuse_xo_offset); + + if (strM2mAteRxStr->override_self_mac_addr) { + val32 = strM2mAteRxStr->self_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SELF, val32); + + val32 = strM2mAteRxStr->self_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SELF, val32); + } + + if (strM2mAteRxStr->mac_filter_en_sa) { + val32 = strM2mAteRxStr->peer_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->peer_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SA, val32); + + val32 = strM2mAteRxStr->peer_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->peer_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SA, val32); + } + + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA, strM2mAteRxStr->mac_filter_en_da); + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA, strM2mAteRxStr->mac_filter_en_sa); + nm_write_reg(rBurstTx_NMI_SET_SELF_MAC_ADDR, strM2mAteRxStr->override_self_mac_addr); + + if (M2M_SUCCESS == s8Ret) { + s8Ret += nm_write_reg(rInterrupt_CORTUS_2, 1); /*Interrupt Cortus*/ + m2m_ate_set_rx_status(1); + nm_bsp_sleep(10); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void) +{ + m2m_ate_set_rx_status(0); + nm_bsp_sleep(200); /*Recommended*/ + return M2M_SUCCESS; +} + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx +first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *strM2mAteRxStatus) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (NULL == strM2mAteRxStatus) { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if (0 != m2m_ate_get_tx_status()) { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA) || nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA)) { + strM2mAteRxStatus->num_rx_pkts + = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS) + nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + strM2mAteRxStatus->num_good_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + } else { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstRx_NMI_RX_ALL_PKTS_CONT) + nm_read_reg(0x989c); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstRx_NMI_RX_ERR_PKTS_CONT); + strM2mAteRxStatus->num_good_pkts = strM2mAteRxStatus->num_rx_pkts - strM2mAteRxStatus->num_err_pkts; + } + +__EXIT: + return s8Ret; +} +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB) +{ + uint32_t dGain, val32; + dGain = (uint32_t)(pow(10, dGaindB / 20.0) * 1024.0); + + val32 = nm_read_reg(0x160cd0); + val32 &= ~(0x1ffful << 0); + val32 |= (((uint32_t)dGain) << 0); + nm_write_reg(0x160cd0, val32); + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * dGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * dGaindB + The retrieved digital gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double *dGaindB) +{ + uint32 dGain, val32; + + if (!dGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x160cd0); + + dGain = (val32 >> 0) & 0x1ffful; + *dGaindB = 20.0 * log10((double)dGain / 1024.0); + + return M2M_SUCCESS; +} +/*! +@fn \ + void m2m_ate_set_pa_gain(uint8 gain_db) + +@brief + This function is used to set the PA gain (18/15/12/9/6/3/0 only) + +@param [in] uint8 gain_db + PA gain level allowed (18/15/12/9/6/3/0 only) + +*/ +void m2m_ate_set_pa_gain(uint8 gain_db) +{ + uint32 PA_1e9c; + uint8 aGain[] = {/* "0 dB" */ 0x00, + /* "3 dB" */ 0x01, + /* "6 dB" */ 0x03, + /* "9 dB" */ 0x07, + /* "12 dB" */ 0x0f, + /* "15 dB" */ 0x1f, + /* "18 dB" */ 0x3f}; + /* The variable PA gain is valid only for High power mode */ + PA_1e9c = nm_read_reg(0x1e9c); + /* TX bank 0. */ + PA_1e9c &= ~(0x3ful << 8); + PA_1e9c |= (((uint32)aGain[gain_db / 3] & 0x3f) << 8); + nm_write_reg(0x1e9c, PA_1e9c); +} +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(double *paGaindB) + +@brief + This function is used to get the PA gain + +@param [out] double *paGaindB + The retrieved PA gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(double *paGaindB) +{ + uint32 val32, paGain; + uint32 m_cmbPAGainStep; + + if (!paGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1e9c); + + paGain = (val32 >> 8) & 0x3f; + + switch (paGain) { + case 0x1: + m_cmbPAGainStep = 5; + break; + case 0x3: + m_cmbPAGainStep = 4; + break; + case 0x7: + m_cmbPAGainStep = 3; + break; + case 0xf: + m_cmbPAGainStep = 2; + break; + case 0x1f: + m_cmbPAGainStep = 1; + break; + case 0x3f: + m_cmbPAGainStep = 0; + break; + default: + m_cmbPAGainStep = 0; + break; + } + + *paGaindB = 18 - m_cmbPAGainStep * 3; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(double * ppaGaindB) + +@brief + This function is used to get the PPA gain + +@param [out] uint32 * ppaGaindB + The retrieved PPA gain value obtained from HW registers in dB. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(double *ppaGaindB) +{ + uint32 val32, ppaGain, m_cmbPPAGainStep; + + if (!ppaGaindB) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1ea0); + + ppaGain = (val32 >> 5) & 0x7; + + switch (ppaGain) { + case 0x1: + m_cmbPPAGainStep = 2; + break; + case 0x3: + m_cmbPPAGainStep = 1; + break; + case 0x7: + m_cmbPPAGainStep = 0; + break; + default: + m_cmbPPAGainStep = 3; + break; + } + + *ppaGaindB = 9 - m_cmbPPAGainStep * 3; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * totGaindB) + +@brief + This function is used to calculate the total gain + +@param [out] double * totGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, PA and PPA gain +values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double *totGaindB) +{ + double dGaindB, paGaindB, ppaGaindB; + + if (!totGaindB) + return M2M_ERR_INVALID_ARG; + + m2m_ate_get_pa_gain(&paGaindB); + m2m_ate_get_ppa_gain(&ppaGaindB); + m2m_ate_get_dig_gain(&dGaindB); + + *totGaindB = dGaindB + paGaindB + ppaGaindB; + + return M2M_SUCCESS; +} + +#endif //_M2M_ATE_FW_ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_crypto.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_crypto.c new file mode 100644 index 0000000..ed24236 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_crypto.c @@ -0,0 +1,949 @@ +/** + * + * \file m2m_crypto.c + * + * \brief WINC Crypto module. + * + * Copyright (c) 2014 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_crypto.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +#ifdef CONF_CRYPTO_HW + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*======*======*======*======*======*=======* + * WINC SHA256 HW Engine Register Definition * + *======*======*======*======*======*========*/ + +#define SHA_BLOCK_SIZE (64) + +#define SHARED_MEM_BASE (0xd0000) + +#define SHA256_MEM_BASE (0x180000UL) +#define SHA256_ENGINE_ADDR (0x180000ul) + +/* SHA256 Registers */ +#define SHA256_CTRL (SHA256_MEM_BASE + 0x00) +#define SHA256_CTRL_START_CALC_MASK (NBIT0) +#define SHA256_CTRL_START_CALC_SHIFT (0) +#define SHA256_CTRL_PREPROCESS_MASK (NBIT1) +#define SHA256_CTRL_PREPROCESS_SHIFT (1) +#define SHA256_CTRL_HASH_HASH_MASK (NBIT2) +#define SHA256_CTRL_HASH_HASH_SHIFT (2) +#define SHA256_CTRL_INIT_SHA256_STATE_MASK (NBIT3) +#define SHA256_CTRL_INIT_SHA256_STATE_SHIFT (3) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_MASK (NBIT4) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_SHIFT (4) +#define SHA256_CTRL_FORCE_SHA256_QUIT_MASK (NBIT5) +#define SHA256_CTRL_FORCE_SHA256_QUIT_SHIFT (5) + +#define SHA256_REGS_SHA256_CTRL_AHB_BYTE_REV_EN (NBIT6) +#define SHA256_REGS_SHA256_CTRL_RESERVED (NBIT7) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO (NBIT8 + NBIT9 + NBIT10) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_MASK (NBIT2 + NBIT1 + NBIT0) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_SHIFT (8) +#define SHA256_REGS_SHA256_CTRL_RESERVED_11 (NBIT11) +#define SHA256_REGS_SHA256_CTRL_SHA1_CALC (NBIT12) +#define SHA256_REGS_SHA256_CTRL_PBKDF2_SHA1_CALC (NBIT13) + +#define SHA256_START_RD_ADDR (SHA256_MEM_BASE + 0x04UL) +#define SHA256_DATA_LENGTH (SHA256_MEM_BASE + 0x08UL) +#define SHA256_START_WR_ADDR (SHA256_MEM_BASE + 0x0cUL) +#define SHA256_COND_CHK_CTRL (SHA256_MEM_BASE + 0x10) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_MASK (NBIT1 | NBIT0) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_SHIFT (0) +#define SHA256_COND_CHK_CTRL_STEP_VAL_MASK (NBIT6 | NBIT5 | NBIT4 | NBIT3 | NBIT2) +#define SHA256_COND_CHK_CTRL_STEP_VAL_SHIFT (2) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_MASK (NBIT7) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_SHIFT (7) + +#define SHA256_MOD_DATA_RANGE (SHA256_MEM_BASE + 0x14) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_MASK (NBIT24 - 1) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_SHIFT (0) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_MASK (NBIT24 | NBIT25 | NBIT26) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_SHIFT (24) + +#define SHA256_COND_CHK_STS_1 (SHA256_MEM_BASE + 0x18) +#define SHA256_COND_CHK_STS_2 (SHA256_MEM_BASE + 0x1c) +#define SHA256_DONE_INTR_ENABLE (SHA256_MEM_BASE + 0x20) +#define SHA256_DONE_INTR_STS (SHA256_MEM_BASE + 0x24) +#define SHA256_TARGET_HASH_H1 (SHA256_MEM_BASE + 0x28) +#define SHA256_TARGET_HASH_H2 (SHA256_MEM_BASE + 0x2c) +#define SHA256_TARGET_HASH_H3 (SHA256_MEM_BASE + 0x30) +#define SHA256_TARGET_HASH_H4 (SHA256_MEM_BASE + 0x34) +#define SHA256_TARGET_HASH_H5 (SHA256_MEM_BASE + 0x38) +#define SHA256_TARGET_HASH_H6 (SHA256_MEM_BASE + 0x3c) +#define SHA256_TARGET_HASH_H7 (SHA256_MEM_BASE + 0x40) +#define SHA256_TARGET_HASH_H8 (SHA256_MEM_BASE + 0x44) + +/*======*======*======*======*======*=======* + * WINC BIGINT HW Engine Register Definition * + *======*======*======*======*======*========*/ + +#define BIGINT_ENGINE_ADDR (0x180080ul) +#define BIGINT_VERSION (BIGINT_ENGINE_ADDR + 0x00) + +#define BIGINT_MISC_CTRL (BIGINT_ENGINE_ADDR + 0x04) +#define BIGINT_MISC_CTRL_CTL_START (NBIT0) +#define BIGINT_MISC_CTRL_CTL_RESET (NBIT1) +#define BIGINT_MISC_CTRL_CTL_MSW_FIRST (NBIT2) +#define BIGINT_MISC_CTRL_CTL_SWAP_BYTE_ORDER (NBIT3) +#define BIGINT_MISC_CTRL_CTL_FORCE_BARRETT (NBIT4) +#define BIGINT_MISC_CTRL_CTL_M_PRIME_VALID (NBIT5) + +#define BIGINT_M_PRIME (BIGINT_ENGINE_ADDR + 0x08) + +#define BIGINT_STATUS (BIGINT_ENGINE_ADDR + 0x0C) +#define BIGINT_STATUS_STS_DONE (NBIT0) + +#define BIGINT_CLK_COUNT (BIGINT_ENGINE_ADDR + 0x10) +#define BIGINT_ADDR_X (BIGINT_ENGINE_ADDR + 0x14) +#define BIGINT_ADDR_E (BIGINT_ENGINE_ADDR + 0x18) +#define BIGINT_ADDR_M (BIGINT_ENGINE_ADDR + 0x1C) +#define BIGINT_ADDR_R (BIGINT_ENGINE_ADDR + 0x20) +#define BIGINT_LENGTH (BIGINT_ENGINE_ADDR + 0x24) + +#define BIGINT_IRQ_STS (BIGINT_ENGINE_ADDR + 0x28) +#define BIGINT_IRQ_STS_DONE (NBIT0) +#define BIGINT_IRQ_STS_CHOOSE_MONT (NBIT1) +#define BIGINT_IRQ_STS_M_READ (NBIT2) +#define BIGINT_IRQ_STS_X_READ (NBIT3) +#define BIGINT_IRQ_STS_START (NBIT4) +#define BIGINT_IRQ_STS_PRECOMP_FINISH (NBIT5) + +#define BIGINT_IRQ_MASK (BIGINT_ENGINE_ADDR + 0x2C) +#define BIGINT_IRQ_MASK_CTL_IRQ_MASK_START (NBIT4) + +#define ENABLE_FLIPPING 1 + +#define GET_UINT32(BUF, OFFSET) \ + (((uint32)((BUF)[OFFSET])) | ((uint32)(((BUF)[OFFSET + 1]) << 8)) | ((uint32)(((BUF)[OFFSET + 2]) << 16)) \ + | ((uint32)(((BUF)[OFFSET + 3]) << 24))) + +#define PUTU32(VAL32, BUF, OFFSET) \ + do { \ + (BUF)[OFFSET] = BYTE_3((VAL32)); \ + (BUF)[OFFSET + 1] = BYTE_2((VAL32)); \ + (BUF)[OFFSET + 2] = BYTE_1((VAL32)); \ + (BUF)[OFFSET + 3] = BYTE_0((VAL32)); \ + } while (0) + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrHashContext + +@brief +*/ +typedef struct { + uint32 au32HashState[M2M_SHA256_DIGEST_LEN / 4]; + uint8 au8CurrentBlock[64]; + uint32 u32TotalLength; + uint8 u8InitHashFlag; +} tstrSHA256HashCtxt; + +/*======*======*======*======*======*=======* + * SHA256 IMPLEMENTATION * + *======*======*======*======*======*========*/ + +sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt) +{ + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + m2m_memset((uint8 *)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt)); + pstrSHA256->u8InitHashFlag = 1; + } + return 0; +} + +sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint32 u32ResidualBytes; + uint32 u32NBlocks; + uint32 u32Offset; + uint32 u32CurrentBlock = 0; + uint8 u8IsDone = 0; + + /* Get the remaining bytes from the previous update (if the length is not block aligned). */ + u32ResidualBytes = pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE; + + /* Update the total data length. */ + pstrSHA256->u32TotalLength += u16DataLength; + + if (u32ResidualBytes != 0) { + if ((u32ResidualBytes + u16DataLength) >= SHA_BLOCK_SIZE) { + u32Offset = SHA_BLOCK_SIZE - u32ResidualBytes; + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u32Offset); + pu8Data += u32Offset; + u16DataLength -= u32Offset; + + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + u32CurrentBlock = 1; + } else { + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u16DataLength); + u16DataLength = 0; + } + } + + /* Get the number of HASH BLOCKs and the residual bytes. */ + u32NBlocks = u16DataLength / SHA_BLOCK_SIZE; + u32ResidualBytes = u16DataLength % SHA_BLOCK_SIZE; + + if (u32NBlocks != 0) { + nm_write_block(u32Addr, pu8Data, (uint16)(u32NBlocks * SHA_BLOCK_SIZE)); + pu8Data += (u32NBlocks * SHA_BLOCK_SIZE); + } + + u32NBlocks += u32CurrentBlock; + if (u32NBlocks != 0) { + uint32 u32RegVal = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if (pstrSHA256->u8InitHashFlag) { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + u32ReadAddr = u32WriteAddr + (u32NBlocks * SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u32NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + + u32RegVal &= ~(0x7 << 8); + u32RegVal |= (2 << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while (!u8IsDone) { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + } + if (u32ResidualBytes != 0) { + m2m_memcpy(pstrSHA256->au8CurrentBlock, pu8Data, u32ResidualBytes); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt *)pstrSha256Ctxt; + if (pstrSHA256 != NULL) { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint16 u16Offset; + uint16 u16PaddingLength; + uint16 u16NBlocks = 1; + uint32 u32RegVal = 0; + uint32 u32Idx, u32ByteIdx; + uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4]; + uint8 u8IsDone = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if (pstrSHA256->u8InitHashFlag) { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + /* Calculate the offset of the last data byte in the current block. */ + u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE); + + /* Add the padding byte 0x80. */ + pstrSHA256->au8CurrentBlock[u16Offset++] = 0x80; + + /* Calculate the required padding to complete + one Hash Block Size. + */ + u16PaddingLength = SHA_BLOCK_SIZE - u16Offset; + m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength); + + /* If the padding count is not enough to hold 64-bit representation of + the total input message length, one padding block is required. + */ + if (u16PaddingLength < 8) { + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE); + u16NBlocks++; + } + + /* pack the length at the end of the padding block */ + PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4)); + + u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE); + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK; + u32RegVal &= ~(0x7UL << 8); + u32RegVal |= (0x2UL << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while (!u8IsDone) { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + nm_read_block(u32ReadAddr, (uint8 *)au32Digest, 32); + + /* Convert the output words to an array of bytes. + */ + u32ByteIdx = 0; + for (u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx++) { + pu8Sha256Digest[u32ByteIdx++] = BYTE_3(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_2(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_1(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx++] = BYTE_0(au32Digest[u32Idx]); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +/*======*======*======*======*======*=======* + * RSA IMPLEMENTATION * + *======*======*======*======*======*========*/ + +static void FlipBuffer(uint8 *pu8InBuffer, uint8 *pu8OutBuffer, uint16 u16BufferSize) +{ + uint16 u16Idx; + for (u16Idx = 0; u16Idx < u16BufferSize; u16Idx++) { +#if ENABLE_FLIPPING == 1 + pu8OutBuffer[u16Idx] = pu8InBuffer[u16BufferSize - u16Idx - 1]; +#else + pu8OutBuffer[u16Idx] = pu8InBuffer[u16Idx]; +#endif + } +} + +void BigInt_ModExp(uint8 *pu8X, uint16 u16XSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8M, uint16 u16MSize, + uint8 *pu8R, uint16 u16RSize) +{ + uint32 u32Reg; + uint8 au8Tmp[780] = {0}; + uint32 u32XAddr = SHARED_MEM_BASE; + uint32 u32MAddr; + uint32 u32EAddr; + uint32 u32RAddr; + uint8 u8EMswBits = 32; + uint32 u32Mprime = 0x7F; + uint16 u16XSizeWords, u16ESizeWords; + uint32 u32Exponent; + + u16XSizeWords = (u16XSize + 3) / 4; + u16ESizeWords = (u16ESize + 3) / 4; + + u32MAddr = u32XAddr + (u16XSizeWords * 4); + u32EAddr = u32MAddr + (u16XSizeWords * 4); + u32RAddr = u32EAddr + (u16ESizeWords * 4); + + /* Reset the core. + */ + u32Reg = 0; + u32Reg |= BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + + nm_write_block(u32RAddr, au8Tmp, u16RSize); + + /* Write Input Operands to Chip Memory. + */ + /*------- X -------*/ + FlipBuffer(pu8X, au8Tmp, u16XSize); + nm_write_block(u32XAddr, au8Tmp, u16XSizeWords * 4); + + /*------- E -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8E, au8Tmp, u16ESize); + nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4); + u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4); + while ((u32Exponent & NBIT31) == 0) { + u32Exponent <<= 1; + u8EMswBits--; + } + + /*------- M -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8M, au8Tmp, u16XSize); + nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4); + + /* Program the addresses of the input operands. + */ + nm_write_reg(BIGINT_ADDR_X, u32XAddr); + nm_write_reg(BIGINT_ADDR_E, u32EAddr); + nm_write_reg(BIGINT_ADDR_M, u32MAddr); + nm_write_reg(BIGINT_ADDR_R, u32RAddr); + + /* Mprime. + */ + nm_write_reg(BIGINT_M_PRIME, u32Mprime); + + /* Length. + */ + u32Reg = (u16XSizeWords & 0xFF); + u32Reg += ((u16ESizeWords & 0xFF) << 8); + u32Reg += (u8EMswBits << 16); + nm_write_reg(BIGINT_LENGTH, u32Reg); + + /* CTRL Register. + */ + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg ^= BIGINT_MISC_CTRL_CTL_START; + u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT; + // u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID; +#if ENABLE_FLIPPING == 0 + u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST; +#endif + nm_write_reg(BIGINT_MISC_CTRL, u32Reg); + + /* Wait for computation to complete. */ + while (1) { + u32Reg = nm_read_reg(BIGINT_IRQ_STS); + if (u32Reg & BIGINT_IRQ_STS_DONE) { + break; + } + } + nm_write_reg(BIGINT_IRQ_STS, 0); + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + nm_read_block(u32RAddr, au8Tmp, u16RSize); + FlipBuffer(au8Tmp, pu8R, u16RSize); +} + +#define MD5_DIGEST_SIZE (16) +#define SHA1_DIGEST_SIZE (20) + +static const uint8 au8TEncodingMD5[] + = {0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the MD5 hash algorithm. + */ + +static const uint8 au8TEncodingSHA1[] + = {0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the SHA-1 hash algorithm. + */ + +static const uint8 au8TEncodingSHA2[] + = {0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04}; +/*!< Fixed part of the Encoding T for the SHA-2 hash algorithm. + */ + +sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if ((pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if (u16HashLength == MD5_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } else if (u16HashLength == SHA1_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } else { + pu8T = (uint8 *)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if (u16NSize >= (u16TLength + 11)) { + uint32 u32PSLength, u32Idx = 0; + + /* + RSA verification + */ + BigInt_ModExp(pu8RsaSignature, u16NSize, pu8E, u16ESize, pu8N, u16NSize, au8EM, u16NSize); + + u32PSLength = u16NSize - u16TLength - 3; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + if ((au8EM[0] == 0x00) && (au8EM[1] == 0x01)) { + for (u32Idx = 2; au8EM[u32Idx] == 0xFF; u32Idx++) + ; + if (u32Idx == (u32PSLength + 2)) { + if (au8EM[u32Idx++] == 0x00) { + if (!m2m_memcmp(&au8EM[u32Idx], pu8T, u16TEncodingLength)) { + u32Idx += u16TEncodingLength; + if (au8EM[u32Idx++] == u16HashLength) + s8Ret = m2m_memcmp(&au8EM[u32Idx], pu8SignedMsgHash, u16HashLength); + } + } + } + } + } + } + return s8Ret; +} + +sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if ((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if (u16HashLength == MD5_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } else if (u16HashLength == SHA1_DIGEST_SIZE) { + pu8T = (uint8 *)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } else { + pu8T = (uint8 *)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if (u16NSize >= (u16TLength + 11)) { + uint16 u16PSLength = 0; + uint16 u16Offset = 0; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + au8EM[u16Offset++] = 0; + au8EM[u16Offset++] = 1; + u16PSLength = u16NSize - u16TLength - 3; + m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength); + u16Offset += u16PSLength; + au8EM[u16Offset++] = 0; + m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength); + u16Offset += u16TEncodingLength; + au8EM[u16Offset++] = u16HashLength; + m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength); + + /* + RSA Signature Generation + */ + BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize); + s8Ret = M2M_RSA_SIGN_OK; + } + } + return s8Ret; +} + +#endif /* CONF_CRYPTO */ + +#ifdef CONF_CRYPTO_SOFT + +typedef struct { + tpfAppCryproCb pfAppCryptoCb; + uint8 * pu8Digest; + uint8 * pu8Rsa; + uint8 u8CryptoBusy; +} tstrCryptoCtxt; + +typedef struct { + uint8 au8N[M2M_MAX_RSA_LEN]; + uint8 au8E[M2M_MAX_RSA_LEN]; + uint8 au8Hash[M2M_SHA256_DIGEST_LEN]; + uint16 u16Nsz; + uint16 u16Esz; + uint16 u16Hsz; + uint8 _pad16_[2]; +} tstrRsaPayload; + +static tstrCryptoCtxt gstrCryptoCtxt; + +/** + * @fn m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @author + * @date + * @version 1.0 + */ +static void m2m_crypto_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + gstrCryptoCtxt.u8CryptoBusy = 0; + if (u8OpCode == M2M_CRYPTO_RESP_SHA256_INIT) { + tstrM2mSha256Ctxt strCtxt; + if (hif_receive(u32Addr, (uint8 *)&strCtxt, sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, &strCtxt); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_SHA256_UPDATE) { + tstrM2mSha256Ctxt strCtxt; + if (hif_receive(u32Addr, (uint8 *)&strCtxt, sizeof(tstrM2mSha256Ctxt), 0) == M2M_SUCCESS) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, &strCtxt); + } + } + + } else if (u8OpCode == M2M_CRYPTO_RESP_SHA256_FINSIH) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt), (uint8 *)&strResp, sizeof(tstrCyptoResp), 0) + == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp), + (uint8 *)gstrCryptoCtxt.pu8Digest, + M2M_SHA256_DIGEST_LEN, + 1) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, gstrCryptoCtxt.pu8Digest); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_GEN) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8 *)&strResp, sizeof(tstrCyptoResp), 0) == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrRsaPayload) + sizeof(tstrCyptoResp), + (uint8 *)gstrCryptoCtxt.pu8Rsa, + M2M_MAX_RSA_LEN, + 0) + == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, gstrCryptoCtxt.pu8Rsa); + } + } + } else if (u8OpCode == M2M_CRYPTO_RESP_RSA_SIGN_VERIFY) { + tstrCyptoResp strResp; + if (hif_receive(u32Addr + sizeof(tstrRsaPayload), (uint8 *)&strResp, sizeof(tstrCyptoResp), 1) == M2M_SUCCESS) { + if (gstrCryptoCtxt.pfAppCryptoCb) + gstrCryptoCtxt.pfAppCryptoCb(u8OpCode, &strResp, NULL); + } + } else { + M2M_ERR("u8Code %d ??\n", u8OpCode); + } +} +/*! +@fn \ + sint8 m2m_crypto_init(); + +@brief crypto initialization + +@param[in] pfAppCryproCb + +*/ +sint8 m2m_crypto_init(tpfAppCryproCb pfAppCryproCb) +{ + sint8 ret = M2M_ERR_FAIL; + m2m_memset((uint8 *)&gstrCryptoCtxt, 0, sizeof(tstrCryptoCtxt)); + if (pfAppCryproCb != NULL) { + gstrCryptoCtxt.pfAppCryptoCb = pfAppCryproCb; + ret = hif_register_cb(M2M_REQ_GROUP_CRYPTO, m2m_crypto_cb); + } + return ret; +} +/*! +@fn \ + sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + +@brief SHA256 hash initialization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. +*/ +sint8 m2m_crypto_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt) +{ + sint8 ret = M2M_ERR_FAIL; + if ((psha256Ctxt != NULL) && (!gstrCryptoCtxt.u8CryptoBusy)) { + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_INIT | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + +@brief SHA256 hash update + +@param [in] psha256Ctxt + Pointer to the sha256 context. + +@param [in] pu8Data + Buffer holding the data submitted to the hash. + +@param [in] u16DataLength + Size of the data bufefr in bytes. +*/ +sint8 m2m_crypto_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Data != NULL) + && (u16DataLength < M2M_SHA256_MAX_DATA)) { + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_UPDATE | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + pu8Data, + u16DataLength, + sizeof(tstrM2mSha256Ctxt) + sizeof(tstrCyptoResp)); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + +@brief SHA256 hash finalization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. + +@param [in] pu8Sha256Digest + Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less +than M2M_SHA256_DIGEST_LEN. +*/ +sint8 m2m_crypto_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (psha256Ctxt != NULL) && (pu8Sha256Digest != NULL)) { + gstrCryptoCtxt.pu8Digest = pu8Sha256Digest; + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_SHA256_FINSIH | M2M_REQ_DATA_PKT, + (uint8 *)psha256Ctxt, + sizeof(tstrM2mSha256Ctxt), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Verification + + The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed +message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is +identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8E + RSA public exponent. + +@param[in] u16ESize + Size of the RSA public exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Signature value to be verified. +*/ + +sint8 m2m_crypto_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) + && (pu8SignedMsgHash != NULL) && (u16NSize != 0) && (u16ESize != 0) && (u16HashLength != 0) + && (pu8RsaSignature != NULL)) + + { + tstrRsaPayload strRsa = {0}; + + m2m_memcpy(strRsa.au8N, pu8N, u16NSize); + m2m_memcpy(strRsa.au8E, pu8E, u16ESize); + m2m_memcpy(strRsa.au8Hash, pu8SignedMsgHash, u16HashLength); + + strRsa.u16Esz = u16ESize; + strRsa.u16Hsz = u16HashLength; + strRsa.u16Nsz = u16NSize; + + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_RSA_SIGN_VERIFY | M2M_REQ_DATA_PKT, + (uint8 *)&strRsa, + sizeof(tstrRsaPayload), + NULL, + 0, + 0); + } + return ret; +} + +/*! +@fn \ + sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Generation + + The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed +message shall be compressed to the corresponding hash algorithm before calling this function. The hash type is +identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8d + RSA private exponent. + +@param[in] u16dSize + Size of the RSA private exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Pointer to a user buffer allocated by teh caller shall hold the generated signature. +*/ +sint8 m2m_crypto_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 ret = M2M_ERR_FAIL; + if ((!gstrCryptoCtxt.u8CryptoBusy) && (pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) + && (pu8SignedMsgHash != NULL) && (u16NSize != 0) && (u16dSize != 0) && (u16HashLength != 0) + && (pu8RsaSignature != NULL)) + + { + tstrRsaPayload strRsa = {0}; + + m2m_memcpy(strRsa.au8N, pu8N, u16NSize); + m2m_memcpy(strRsa.au8E, pu8d, u16dSize); + m2m_memcpy(strRsa.au8Hash, pu8SignedMsgHash, u16HashLength); + + strRsa.u16Esz = u16dSize; + strRsa.u16Hsz = u16HashLength; + strRsa.u16Nsz = u16NSize; + + gstrCryptoCtxt.pu8Rsa = pu8RsaSignature; + ret = hif_send(M2M_REQ_GROUP_CRYPTO, + M2M_CRYPTO_REQ_RSA_SIGN_GEN | M2M_REQ_DATA_PKT, + (uint8 *)&strRsa, + sizeof(tstrRsaPayload), + NULL, + 0, + 0); + } + return ret; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.c new file mode 100644 index 0000000..e46f4c8 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.c @@ -0,0 +1,679 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "m2m_hif.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_periph.h" + +#if (defined NM_EDGE_INTERRUPT) && (defined NM_LEVEL_INTERRUPT) +#error "only one type of interrupt NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#if !((defined NM_EDGE_INTERRUPT) || (defined NM_LEVEL_INTERRUPT)) +#error "define interrupt type NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#ifndef CORTUS_APP +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WIFI_HOST_RCV_CTRL_4 (0x150400) +#define WIFI_HOST_RCV_CTRL_5 (0x1088) + +typedef struct { + uint8 u8ChipMode; + uint8 u8ChipSleep; + uint8 u8HifRXDone; + uint8 u8Interrupt; + uint8 u8Yield; + uint32 u32RxAddr; + uint32 u32RxSize; + tpfHifCallBack pfWifiCb; + tpfHifCallBack pfIpCb; + tpfHifCallBack pfOtaCb; + tpfHifCallBack pfSigmaCb; + tpfHifCallBack pfHifCb; + tpfHifCallBack pfCryptoCb; + tpfHifCallBack pfSslCb; +} tstrHifContext; + +volatile tstrHifContext gstrHifCxt; + +#ifdef ETH_MODE +extern void os_hook_isr(void); +#endif + +static void isr(void) +{ + gstrHifCxt.u8Interrupt++; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(0); +#endif +#ifdef ETH_MODE + os_hook_isr(); +#endif +} +static sint8 hif_set_rx_done(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; + + gstrHifCxt.u8HifRXDone = 0; +#ifdef NM_EDGE_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + /* Set RX Done */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if (ret != M2M_SUCCESS) + goto ERR1; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif +ERR1: + return ret; +} +/** + * @fn static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ +} +/** + * @fn NMI_API sint8 hif_chip_wake(void); + * @brief To Wakeup the chip. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + if (gstrHifCxt.u8HifRXDone) { + /*chip already wake for the rx not done no need to send wake request*/ + return ret; + } + if (gstrHifCxt.u8ChipSleep == 0) { + if (gstrHifCxt.u8ChipMode != M2M_NO_PS) { + ret = chip_wake(); + if (ret != M2M_SUCCESS) + goto ERR1; + } else { + } + } + gstrHifCxt.u8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8 u8Pstype) +{ + gstrHifCxt.u8ChipMode = u8Pstype; +} +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8 hif_get_sleep_mode(void) +{ + return gstrHifCxt.u8ChipMode; +} + +/** + * @fn NMI_API sint8 hif_chip_sleep_sc(void); + * @brief To clear the chip sleep but keep the chip sleep + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_sleep_sc(void) +{ + if (gstrHifCxt.u8ChipSleep >= 1) { + gstrHifCxt.u8ChipSleep--; + } + return M2M_SUCCESS; +} +/** + * @fn NMI_API sint8 hif_chip_sleep(void); + * @brief To make the chip sleep. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_chip_sleep(void) +{ + sint8 ret = M2M_SUCCESS; + + if (gstrHifCxt.u8ChipSleep >= 1) { + gstrHifCxt.u8ChipSleep--; + } + + if (gstrHifCxt.u8ChipSleep == 0) { + if (gstrHifCxt.u8ChipMode != M2M_NO_PS) { + ret = chip_sleep(); + if (ret != M2M_SUCCESS) + goto ERR1; + + } else { + } + } +ERR1: + return ret; +} +/** + * @fn NMI_API sint8 hif_init(void * arg); + * @brief To initialize HIF layer. + * @param [in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_init(void *arg) +{ + m2m_memset((uint8 *)&gstrHifCxt, 0, sizeof(tstrHifContext)); + nm_bsp_register_isr(isr); + hif_register_cb(M2M_REQ_GROUP_HIF, m2m_hif_cb); + return M2M_SUCCESS; +} +/** + * @fn NMI_API sint8 hif_deinit(void * arg); + * @brief To De-initialize HIF layer. + * @param [in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +sint8 hif_deinit(void *arg) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + m2m_memset((uint8 *)&gstrHifCxt, 0, sizeof(tstrHifContext)); + return ret; +} +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_send(uint8 u8Gid, uint8 u8Opcode, uint8 *pu8CtrlBuf, uint16 u16CtrlBufSize, uint8 *pu8DataBuf, + uint16 u16DataSize, uint16 u16DataOffset) +{ + sint8 ret = M2M_ERR_SEND; + volatile tstrHifHdr strHif; + + strHif.u8Opcode = u8Opcode & (~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + if (pu8DataBuf != NULL) { + strHif.u16Length += u16DataOffset + u16DataSize; + } else { + strHif.u16Length += u16CtrlBufSize; + } + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + volatile uint32 reg, dma_addr = 0; + volatile uint16 cnt = 0; +//#define OPTIMIZE_BUS +/*please define in firmware also*/ +#ifndef OPTIMIZE_BUS + reg = 0UL; + reg |= (uint32)u8Gid; + reg |= ((uint32)u8Opcode << 8); + reg |= ((uint32)strHif.u16Length << 16); + ret = nm_write_reg(NMI_STATE_REG, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg = 0UL; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +#else + reg = 0UL; + reg |= NBIT1; + reg |= ((u8Opcode & NBIT7) ? (NBIT2) : (0)); /*Data = 1 or config*/ + reg |= (u8Gid == M2M_REQ_GROUP_IP) ? (NBIT3) : (0); /*IP = 1 or non IP*/ + reg |= ((uint32)strHif.u16Length << 4); /*length of pkt max = 4096*/ + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +#endif + dma_addr = 0; + + for (cnt = 0; cnt < 1000; cnt++) { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2, (uint32 *)®); + if (ret != M2M_SUCCESS) + break; + /* + * If it takes too long to get a response, the slow down to + * avoid back-to-back register read operations. + */ + if (cnt >= 500) { + if (cnt < 501) { + M2M_INFO("Slowing down...\n"); + } + nm_bsp_sleep(1); + } + if (!(reg & NBIT1)) { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4, (uint32 *)&dma_addr); + if (ret != M2M_SUCCESS) { + /*in case of read error clear the DMA address and return error*/ + dma_addr = 0; + goto ERR1; + } + /*in case of success break */ + break; + } + } + + if (dma_addr != 0) { + volatile uint32 u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8 *)&strHif, M2M_HIF_HDR_OFFSET); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if (pu8CtrlBuf != NULL) { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if (pu8DataBuf != NULL) { + u32CurrAddr += (u16DataOffset - u16CtrlBufSize); + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if (M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + } else { + ret = hif_chip_sleep(); + M2M_DBG("Failed to alloc rx size %d\r", ret); + ret = M2M_ERR_MEM_ALLOC; + goto ERR2; + } + + } else { + M2M_ERR("(HIF)Fail to wakup the chip\n"); + goto ERR2; + } + /*actual sleep ret = M2M_SUCCESS*/ + ret = hif_chip_sleep(); + return ret; +ERR1: + /*reset the count but no actual sleep as it already bus error*/ + hif_chip_sleep_sc(); +ERR2: + /*logical error*/ + return ret; +} +/** + * @fn hif_isr + * @brief Host interface interrupt service routine + * @author M. Abdelmawla + * @date 15 July 2012 + * @return 1 in case of interrupt received else 0 will be returned + * @version 1.0 + */ +static sint8 hif_isr(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg; + volatile tstrHifHdr strHif; + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if (M2M_SUCCESS == ret) { + if (reg & 0x1) /* New interrupt has been received */ + { + uint16 size; + + nm_bsp_interrupt_ctrl(0); + /*Clearing RX interrupt*/ + reg &= ~NBIT0; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + gstrHifCxt.u8HifRXDone = 1; + size = (uint16)((reg >> 2) & 0xfff); + if (size > 0) { + uint32 address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if (M2M_SUCCESS != ret) { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + gstrHifCxt.u32RxAddr = address; + gstrHifCxt.u32RxSize = size; + ret = nm_read_block(address, (uint8 *)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if (M2M_SUCCESS != ret) { + M2M_ERR("(hif) address bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + if (strHif.u16Length != size) { + if ((size - strHif.u16Length) > 4) { + M2M_ERR("(hif) Corrupted packet Size = %u \n", + size, + strHif.u16Length, + strHif.u8Gid, + strHif.u8Opcode); + nm_bsp_interrupt_ctrl(1); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + + if (M2M_REQ_GROUP_WIFI == strHif.u8Gid) { + if (gstrHifCxt.pfWifiCb) + gstrHifCxt.pfWifiCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("WIFI callback is not registered\n"); + + } else if (M2M_REQ_GROUP_IP == strHif.u8Gid) { + if (gstrHifCxt.pfIpCb) + gstrHifCxt.pfIpCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Scoket callback is not registered\n"); + + } else if (M2M_REQ_GROUP_OTA == strHif.u8Gid) { + if (gstrHifCxt.pfOtaCb) + gstrHifCxt.pfOtaCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Ota callback is not registered\n"); + + } else if (M2M_REQ_GROUP_CRYPTO == strHif.u8Gid) { + if (gstrHifCxt.pfCryptoCb) + gstrHifCxt.pfCryptoCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + + else + M2M_ERR("Crypto callback is not registered\n"); + } else if (M2M_REQ_GROUP_SIGMA == strHif.u8Gid) { + if (gstrHifCxt.pfSigmaCb) + gstrHifCxt.pfSigmaCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Sigma callback is not registered\n"); + } else if (M2M_REQ_GROUP_SSL == strHif.u8Gid) { + if (gstrHifCxt.pfSslCb) + gstrHifCxt.pfSslCb( + strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } else { + M2M_ERR("(hif) invalid group ID\n"); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + if (gstrHifCxt.u8HifRXDone) { + M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode); + ret = hif_set_rx_done(); + if (ret != M2M_SUCCESS) + goto ERR1; + } + } else { + M2M_ERR("(hif) Wrong Size\n"); + ret = M2M_ERR_RCV; + goto ERR1; + } + } else { +#ifndef WIN32 + M2M_ERR("(hif) False interrupt %lx", reg); + ret = M2M_ERR_FAIL; + goto ERR1; +#else +#endif + } + } else { + M2M_ERR("(hif) Fail to Read interrupt reg\n"); + goto ERR1; + } + +ERR1: + return ret; +} + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +void hif_yield(void) +{ + gstrHifCxt.u8Yield = 1; +} + +/** + * @fn hif_handle_isr(void) + * @brief Handle interrupt received from NMC1500 firmware. + * @return The function SHALL return 0 for success and a negative value otherwise. + */ + +sint8 hif_handle_isr(void) +{ + sint8 ret = M2M_SUCCESS; + + gstrHifCxt.u8Yield = 0; + while (gstrHifCxt.u8Interrupt && !gstrHifCxt.u8Yield) { + /*must be at that place because of the race of interrupt increment and that decrement*/ + /*when the interrupt enabled*/ + gstrHifCxt.u8Interrupt--; + while (1) { + ret = hif_isr(); + if (ret == M2M_SUCCESS) { + /*we will try forever untill we get that interrupt*/ + /*Fail return errors here due to bus errors (reading expected values)*/ + break; + } else { + M2M_ERR("(HIF) Fail to handle interrupt %d try Again..\n", ret); + } + } + } + + return ret; +} +/* + * @fn hif_receive + * @brief Host interface interrupt serviece routine + * @param [in] u32Addr + * Receive start address + * @param [out] pu8Buf + * Pointer to receive buffer. Allocated by the caller + * @param [in] u16Sz + * Receive buffer size + * @param [in] isDone + * If you don't need any more packets send True otherwise send false + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone) +{ + sint8 ret = M2M_SUCCESS; + if ((u32Addr == 0) || (pu8Buf == NULL) || (u16Sz == 0)) { + if (isDone) { + /* set RX done */ + ret = hif_set_rx_done(); + } else { + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\n"); + } + goto ERR1; + } + + if (u16Sz > gstrHifCxt.u32RxSize) { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the recived buffer size <%u><%lu>\n", u16Sz, gstrHifCxt.u32RxSize); + goto ERR1; + } + if ((u32Addr < gstrHifCxt.u32RxAddr) || ((u32Addr + u16Sz) > (gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize))) { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the recived buffer address and length\n"); + goto ERR1; + } + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if (ret != M2M_SUCCESS) + goto ERR1; + + /* check if this is the last packet */ + if ((((gstrHifCxt.u32RxAddr + gstrHifCxt.u32RxSize) - (u32Addr + u16Sz)) <= 0) || isDone) { + /* set RX done */ + ret = hif_set_rx_done(); + } + +ERR1: + return ret; +} + +/** + * @fn hif_register_cb + * @brief To set Callback function for every compantent Component + * @param [in] u8Grp + * Group to which the Callback function should be set. + * @param [in] fn + * function to be set + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +sint8 hif_register_cb(uint8 u8Grp, tpfHifCallBack fn) +{ + sint8 ret = M2M_SUCCESS; + switch (u8Grp) { + case M2M_REQ_GROUP_IP: + gstrHifCxt.pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + gstrHifCxt.pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + gstrHifCxt.pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + gstrHifCxt.pfHifCb = fn; + break; + case M2M_REQ_GROUP_CRYPTO: + gstrHifCxt.pfCryptoCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + gstrHifCxt.pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + gstrHifCxt.pfSslCb = fn; + break; + default: + M2M_ERR("GRp ? %d\n", u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.h b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.h new file mode 100644 index 0000000..b8d7d19 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_hif.h @@ -0,0 +1,255 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +/*!< Include depends on UNO Board is used or not*/ +#ifdef ENABLE_UNO_BOARD +#include "m2m_uno_hif.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. + */ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + +/** + * @struct tstrHifHdr + * @brief Structure to hold HIF header + */ +typedef struct { + uint8 u8Gid; /*!< Group ID */ + uint8 u8Opcode; /*!< OP code */ + uint16 u16Length; /*!< Payload length */ +} tstrHifHdr; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_init(void *arg); +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_deinit(void *arg); +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_send(uint8 u8Gid, uint8 u8Opcode, uint8 *pu8CtrlBuf, uint16 u16CtrlBufSize, uint8 *pu8DataBuf, + uint16 u16DataSize, uint16 u16DataOffset); +/* +* @fn hif_receive +* @brief Host interface interrupt serviece routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_register_cb(uint8 u8Grp, tpfHifCallBack fn); +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep(void); +/** +* @fn NMI_API sint8 hif_chip_sleep_sc(void); +* @brief + To clear the chip count only but keep the chip awake +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep_sc(void); +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_chip_wake(void); +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API void hif_set_sleep_mode(uint8 u8Pstype); +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +NMI_API uint8 hif_get_sleep_mode(void); + +#ifdef CORTUS_APP +/** +* @fn hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize) +* @brief + Response handler for HIF layer. + +* @param [in] pu8Buffer + Pointer to the buffer. + +* @param [in] u16BufferSize + Buffer size. + +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize); +#endif + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +NMI_API void hif_yield(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from NMC1500 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ota.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ota.c new file mode 100644 index 0000000..b383c7a --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ota.c @@ -0,0 +1,395 @@ +/** + * + * \file + * + * \brief NMC1500 IoT OTA Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/include/m2m_ota.h" +#include "driver/source/m2m_hif.h" +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; +static tpfOtaNotifCb gpfOtaNotifCb = NULL; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** + * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_ota_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + if (u8OpCode == M2M_OTA_RESP_NOTIF_UPDATE_INFO) { + tstrOtaUpdateInfo strOtaUpdateInfo; + m2m_memset((uint8 *)&strOtaUpdateInfo, 0, sizeof(tstrOtaUpdateInfo)); + ret = hif_receive(u32Addr, (uint8 *)&strOtaUpdateInfo, sizeof(tstrOtaUpdateInfo), 0); + if (ret == M2M_SUCCESS) { + if (gpfOtaNotifCb) + gpfOtaNotifCb(&strOtaUpdateInfo); + } + } else if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + m2m_memset((uint8 *)&strOtaUpdateStatusResp, 0, sizeof(tstrOtaUpdateStatusResp)); + ret = hif_receive(u32Addr, (uint8 *)&strOtaUpdateStatusResp, sizeof(tstrOtaUpdateStatusResp), 0); + if (ret == M2M_SUCCESS) { + if (gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType, strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } else { + M2M_ERR("Invaild OTA resp %d ?\n", u8OpCode); + } +} +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb); + +@brief + Initialize the OTA layer. + +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb) +{ + sint8 ret = M2M_SUCCESS; + + if (pfOtaUpdateCb) { + gpfOtaUpdateCb = pfOtaUpdateCb; + } else { + M2M_ERR("Invaild Ota update cb\n"); + } + if (pfOtaNotifCb) { + gpfOtaNotifCb = pfOtaNotifCb; + } else { + M2M_ERR("Invaild Ota notify cb\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA, m2m_ota_cb); + + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + +@brief + Set the OTA url + +@param [in] u8Url + The url server address + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 *u8Url) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16UrlSize = m2m_strlen(u8Url) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_SET_URL, u8Url, u16UrlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + +@brief + check for ota update + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); + +@brief + Schedule OTA update + +@param [in] u32Period + Period in days + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + +@brief + Request OTA start update using the downloaded url + +@param [in] u8DownloadUrl + The download firmware url, you get it from device info + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 *u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_FW_UPDATE, u8DownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update_crt(uint8 * u8DownloadUrl); + +@brief + Request OTA start for the Cortus app image. + +@param [in] u8DownloadUrl + The cortus application image url. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update_crt(uint8 *u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_CRT_UPDATE, u8DownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@brief + Request OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK_FW, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback_crt(void); + +@brief + Request Cortus application OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback_crt(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK_CRT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@brief + Request OTA Abort + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ABORT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@brief + Switch to the upgraded Firmware + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_FIRMWARE, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_crt(void); + +@brief + Switch to the upgraded cortus application. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_crt(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_CRT_IMG, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev * pstrRev); + +@brief + Get the OTA Firmware version. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#if 0 +#define M2M_OTA_FILE "../../../m2m_ota.dat" +NMI_API sint8 m2m_ota_test(void) +{ + uint32 page = 0; + uint8 buffer[1500]; + uint32 u32Sz = 0; + sint8 ret = M2M_SUCCESS; + FILE *fp =NULL; + fp = fopen(M2M_OTA_FILE,"rb"); + if(fp) + { + fseek(fp, 0L, SEEK_END); + u32Sz = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + while(u32Sz > 0) + { + { + page = (rand()%1400); + + if((page<100)||(page>1400)) page = 1400; + } + + if(u32Sz>page) + { + u32Sz-=page; + } + else + { + page = u32Sz; + u32Sz = 0; + } + printf("page %d\n", (int)page); + fread(buffer,page,1,fp); + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_TEST|M2M_REQ_DATA_PKT,NULL,0,(uint8*)&buffer,page,0); + if(ret != M2M_SUCCESS) + { + M2M_ERR("\n"); + } + nm_bsp_sleep(1); + } + + } + else + { + M2M_ERR("nO err\n"); + } + return ret; +} +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_periph.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_periph.c new file mode 100644 index 0000000..8ea870b --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_periph.c @@ -0,0 +1,169 @@ +/** + * + * \file + * + * \brief NMC1500 Peripherials Application Interface. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_periph.h" +#include "driver/source/nmasic.h" +#include "m2m_hif.h" + +#ifdef CONF_PERIPH + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static sint8 get_gpio_idx(uint8 u8GpioNum) +{ + if (u8GpioNum >= M2M_PERIPH_GPIO_MAX) + return -1; + if (u8GpioNum == M2M_PERIPH_GPIO15) { + return 15; + } else if (u8GpioNum == M2M_PERIPH_GPIO16) { + return 16; + } else if (u8GpioNum == M2M_PERIPH_GPIO18) { + return 18; + } else if (u8GpioNum == M2M_PERIPH_GPIO3) { + return 3; + } else if (u8GpioNum == M2M_PERIPH_GPIO4) { + return 4; + } else if (u8GpioNum == M2M_PERIPH_GPIO5) { + return 5; + } else if (u8GpioNum == M2M_PERIPH_GPIO6) { + return 6; + } else { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static sint8 gpio_ioctl(uint8 op, uint8 u8GpioNum, uint8 u8InVal, uint8 *pu8OutVal) +{ + sint8 ret, gpio; + + ret = hif_chip_wake(); + if (ret != M2M_SUCCESS) + goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if (gpio < 0) + goto _EXIT1; + + if (op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8)gpio, u8InVal); + } else if (op == GPIO_OP_SET) { + ret = set_gpio_val((uint8)gpio, u8InVal); + } else if (op == GPIO_OP_GET) { + ret = get_gpio_val((uint8)gpio, pu8OutVal); + } + if (ret != M2M_SUCCESS) + goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +sint8 m2m_periph_init(tstrPerphInitParam *param) +{ + return M2M_SUCCESS; +} + +sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 *pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam *param) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint8 flags) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 *pu8Buf, uint16 u16BufLen, uint16 *pu16ReadLen, uint8 flags) +{ + /* TBD */ + return M2M_SUCCESS; +} + +sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable) +{ + return pullup_ctrl(pinmask, enable); +} +#endif /* CONF_PERIPH */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ssl.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ssl.c new file mode 100644 index 0000000..ef2738f --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_ssl.c @@ -0,0 +1,310 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_ssl.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32 gu32HIFAddr = 0; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @fn \ m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + @brief SSL callback function + @param [in] u8OpCode + HIF Opcode type. + @param [in] u16DataSize + HIF data length. + @param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 s8tmp = M2M_SUCCESS; + switch (u8OpCode) { + case M2M_SSL_REQ_ECC: { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8 *)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if (s8tmp == M2M_SUCCESS) { + if (gpfAppSSLCb) { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } break; + case M2M_SSL_RESP_SET_CS_LIST: { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8 *)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if (s8tmp == M2M_SUCCESS) { + if (gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } break; + } + if (s8tmp != M2M_SUCCESS) { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + +/*! + @fn \ m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8 *pu8RspDataBuff, uint16 u16RspDataSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, + (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), + (uint8 *)strECCResp, + sizeof(tstrEccReqInfo), + pu8RspDataBuff, + u16RspDataSz, + sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_send_certs_to_winc(uint8* sector_buffer, uint32 sector_size) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8 *pu8Buffer, uint32 u32BufferSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_IND_CERTS_ECC | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_cert(uint32 u32ReadAddr, uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, + tstrECPoint* pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16 *pu16CurveType, uint8 *pu8Hash, uint8 *pu8Sig, tstrECPoint *pu8Key) +{ + uint8 bSetRxDone = 1; + uint16 u16HashSz, u16SigSz, u16KeySz; + sint8 s8Ret = M2M_SUCCESS; + + if (gu32HIFAddr == 0) + return M2M_ERR_FAIL; + + if (hif_receive(gu32HIFAddr, (uint8 *)pu16CurveType, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16KeySz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16HashSz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + if (hif_receive(gu32HIFAddr, (uint8 *)&u16SigSz, 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += 2; + + (*pu16CurveType) = _htons((*pu16CurveType)); + pu8Key->u16Size = _htons(u16KeySz); + u16HashSz = _htons(u16HashSz); + u16SigSz = _htons(u16SigSz); + + if (hif_receive(gu32HIFAddr, pu8Key->X, pu8Key->u16Size * 2, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += (pu8Key->u16Size * 2); + + if (hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += u16HashSz; + + if (hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) + goto __ERR; + gu32HIFAddr += u16SigSz; + + bSetRxDone = 0; + +__ERR: + if (bSetRxDone) { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_hash(uint32 u32ReadAddr, uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8 *pu8Hash, uint16 u16HashSz) +{ + uint8 bSetRxDone = 1; + sint8 s8Ret = M2M_SUCCESS; + + if (gu32HIFAddr == 0) + return M2M_ERR_FAIL; + + if (hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) + goto __ERR; + + bSetRxDone = 0; + +__ERR: + if (bSetRxDone) { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_stop_processing_certs(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_stop_processing_certs(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! + @fn \ m2m_ssl_ecc_process_done(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn \ + m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the +form of a bitmap containing the required ciphers to be on. There is no need to call this function if the application +will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC +ciphersuites. The caller can override the default with any desired combination, except for combinations involving both +RSA and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. If u32SslCsBMP does not +contain any ciphersuites supported by firmware, then the current active list will not be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP) +{ + sint8 s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send( + M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8 *)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + sint8 s8Ret = M2M_SUCCESS; + + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL, m2m_ssl_cb); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/m2m_wifi.c b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_wifi.c new file mode 100644 index 0000000..6c98e5d --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/m2m_wifi.c @@ -0,0 +1,1435 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2015 - 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" + +/** + * \defgroup winc1500_group WINC1500 (Wi-Fi) + * + * \{ + */ + +static volatile uint8 gu8ChNum; +static volatile uint8 gu8scanInProgress = 0; +static tpfAppWifiCb gpfAppWifiCb = NULL; + +#ifdef ETH_MODE +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8 * gau8ethRcvBuf = NULL; +static uint16 gu16ethRcvBufSize; +#endif + +//#define CONF_MGMT +#ifdef CONF_MGMT +static tpfAppMonCb gpfAppMonCb = NULL; +static struct _tstrMgmtCtrl { + uint8 *pu8Buf; + uint16 u16Offset; + uint16 u16Sz; +} gstrMgmtCtrl = {NULL, 0, 0}; +#endif +/** + * @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) + * @brief WiFi call back function + * @param [in] u8OpCode + * HIF Opcode type. + * @param [in] u16DataSize + * HIF data length. + * @param [in] u32Addr + * HIF address. + * @param [in] grp + * HIF group type. + * @author + * @date + * @version 1.0 + */ +static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + uint8 rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8 *)&strState, sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8 *)&strSysTime, sizeof(tstrSystemTime), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } else if (u8OpCode == M2M_WIFI_RESP_CONN_INFO) { + tstrM2MConnInfo strConnInfo; + if (hif_receive(u32Addr, (uint8 *)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) { +#if 0 + if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) + { + tstrM2mWifiStateChanged strState; + m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); + if (app_wifi_recover_cb) + app_wifi_recover_cb(strState.u8CurrState); + } +#endif + } else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig); + } + } else if (u8OpCode == M2M_WIFI_REQ_WPS) { + tstrM2MWPSInfo strWps; + m2m_memset((uint8 *)&strWps, 0, sizeof(tstrM2MWPSInfo)); + if (hif_receive(u32Addr, (uint8 *)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) { + uint32 u32ConflictedIP; + if (hif_receive(u32Addr, (uint8 *)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \" \n", + BYTE_0(u32ConflictedIP), + BYTE_1(u32ConflictedIP), + BYTE_2(u32ConflictedIP), + BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + } + } else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) { + tstrM2mScanDone strState; + gu8scanInProgress = 0; + if (hif_receive(u32Addr, (uint8 *)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) { + tstrM2mWifiscanResult strScanResult; + if (hif_receive(u32Addr, (uint8 *)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } else if (u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) { + tstrM2MProvisionInfo strProvInfo; + if (hif_receive(u32Addr, (uint8 *)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } else if (u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) { + tstrM2MDefaultConnResp strResp; + if (hif_receive(u32Addr, (uint8 *)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + + else if (u8OpCode == M2M_WIFI_RESP_GET_PRNG) { + tstrPrng strPrng; + if (hif_receive(u32Addr, (uint8 *)&strPrng, sizeof(tstrPrng), 0) == M2M_SUCCESS) { + if (hif_receive(u32Addr + sizeof(tstrPrng), strPrng.pu8RngBuff, strPrng.u16PrngSize, 1) == M2M_SUCCESS) { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG, &strPrng); + } + } + } +#ifdef ETH_MODE + else if (u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) { + uint8 u8SetRxDone; + tstrM2mIpRsvdPkt strM2mRsvd; + if (hif_receive(u32Addr, (uint8 *)(&strM2mRsvd), sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) { + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16 u16Offset = strM2mRsvd.u16PktOffset; + strM2mIpCtrlBuf.u16RemainigDataSize = strM2mRsvd.u16PktSz; + if ((gpfAppEthCb) && (gau8ethRcvBuf) && (gu16ethRcvBufSize > 0)) { + do { + u8SetRxDone = 1; + if (strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) { + u8SetRxDone = 0; + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize; + } else { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; + } + + if (hif_receive(u32Addr + u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, u8SetRxDone) + == M2M_SUCCESS) { + strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } else { + break; + } + } while (strM2mIpCtrlBuf.u16RemainigDataSize > 0); + } + } + } +#endif /* ETH_MODE */ +#ifdef CONF_MGMT + else if (u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) { + + tstrM2MWifiRxPacketInfo strRxPacketInfo; + if (u16DataSize >= sizeof(tstrM2MWifiRxPacketInfo)) { + if (hif_receive(u32Addr, (uint8 *)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) { + u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); + if (u16DataSize > 0 && gstrMgmtCtrl.pu8Buf != NULL) { + if (u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) { + u16DataSize = gstrMgmtCtrl.u16Sz; + } + u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; + if (hif_receive(u32Addr, gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) + return; + } + if (gpfAppMonCb) + gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf, u16DataSize); + } + } else { + M2M_ERR("Incorrect mon data size %u\n", u16DataSize); + } + } +#endif + else { + M2M_ERR("REQ Not defined %d\n", u8OpCode); + } +} + +sint8 m2m_wifi_download_mode() +{ + sint8 ret = M2M_SUCCESS; + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(); + if (ret != M2M_SUCCESS) + goto _EXIT0; + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static sint8 m2m_validate_ap_parameters(CONST tstrM2MAPConfig *pstrM2MAPConfig) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (pstrM2MAPConfig == NULL) { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if ((m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) <= 0) + || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) >= M2M_MAX_SSID_LEN)) { + M2M_ERR("INVALID SSID\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if (pstrM2MAPConfig->u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPConfig->u8ListenChannel < M2M_WIFI_CH_1) { + M2M_ERR("INVALID CH\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if (!(pstrM2MAPConfig->au8DHCPServerIP[0] || pstrM2MAPConfig->au8DHCPServerIP[1])) { + if (!(pstrM2MAPConfig->au8DHCPServerIP[2])) { + M2M_ERR("INVALID DHCP SERVER IP\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_OPEN) { + goto ERR1; + } else if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WEP) { + /* Check for WEP Key index */ + if ((pstrM2MAPConfig->u8KeyIndx <= 0) || (pstrM2MAPConfig->u8KeyIndx > WEP_KEY_MAX_INDEX)) { + M2M_ERR("INVALID KEY INDEX\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if ((pstrM2MAPConfig->u8KeySz != WEP_40_KEY_STRING_SIZE) + && (pstrM2MAPConfig->u8KeySz != WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("INVALID KEY STRING SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + + if ((m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) <= 0) + || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) > WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("INVALID KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } else if (pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WPA_PSK) { + /* Check for WPA Key size */ + if (((pstrM2MAPConfig->u8KeySz + 1) < M2M_MIN_PSK_LEN) || ((pstrM2MAPConfig->u8KeySz + 1) > M2M_MAX_PSK_LEN)) { + M2M_ERR("INVALID WPA KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } else { + M2M_ERR("INVALID AUTHENTICATION MODE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} +static sint8 m2m_validate_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (ptstrM2MScanOption == NULL) { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid No of slots */ + if (ptstrM2MScanOption->u8NumOfSlot == 0) { + M2M_ERR("INVALID No of scan slots! %d\n", ptstrM2MScanOption->u8NumOfSlot); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid time of slots */ + if (ptstrM2MScanOption->u8SlotTime < 10 || ptstrM2MScanOption->u8SlotTime > 250) { + M2M_ERR("INVALID scan slot time! %d\n", ptstrM2MScanOption->u8SlotTime); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid No of probe requests per slot */ + if ((ptstrM2MScanOption->u8ProbesPerSlot == 0) + || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) { + M2M_ERR("INVALID No of probe requests per scan slot %d\n", ptstrM2MScanOption->u8ProbesPerSlot); + s8Ret = M2M_ERR_FAIL; + goto ERR; + } + /* Check for valid RSSI threshold */ + if ((ptstrM2MScanOption->s8RssiThresh < -99) || (ptstrM2MScanOption->s8RssiThresh >= 0)) { + M2M_ERR("INVALID RSSI threshold %d \n", ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + +ERR: + return s8Ret; +} + +sint8 m2m_wifi_send_crl(tstrTlsCrlInfo *pCRL) +{ + sint8 s8Ret = M2M_ERR_FAIL; + s8Ret = hif_send( + M2M_REQ_GROUP_SSL, M2M_SSL_IND_CRL | M2M_REQ_DATA_PKT, NULL, 0, (uint8 *)pCRL, sizeof(tstrTlsCrlInfo), 0); + return s8Ret; +} + +sint8 m2m_wifi_init(tstrWifiInitParam *param) +{ + tstrM2mRev strtmp; + sint8 ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_NORMAL; + + if (param == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = param->pfAppWifiCb; + +#ifdef ETH_MODE + gpfAppEthCb = param->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = param->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = param->strEthInitParam.u16ethRcvBufSize; + if (param->strEthInitParam.u8EthernetEnable) + u8WifiMode = M2M_WIFI_MODE_ETHERNET; +#endif /* ETH_MODE */ + +#ifdef CONF_MGMT + gpfAppMonCb = param->pfAppMonCb; +#endif + gu8scanInProgress = 0; + /* Apply device specific initialization. */ + ret = nm_drv_init(&u8WifiMode); + if (ret != M2M_SUCCESS) + goto _EXIT0; + /* Initialize host interface module */ + ret = hif_init(NULL); + if (ret != M2M_SUCCESS) + goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI, m2m_wifi_cb); + + ret = nm_get_firmware_full_info(&strtmp); + + M2M_INFO("Firmware ver : %u.%u.%u Svnrev %u\n", + strtmp.u8FirmwareMajor, + strtmp.u8FirmwareMinor, + strtmp.u8FirmwarePatch, + strtmp.u16FirmwareSvnNum); + M2M_INFO("Firmware Build %s Time %s\n", strtmp.BuildDate, strtmp.BuildTime); + M2M_INFO("Firmware Min driver ver : %u.%u.%u\n", strtmp.u8DriverMajor, strtmp.u8DriverMinor, strtmp.u8DriverPatch); + M2M_INFO("Driver ver: %u.%u.%u\n", + M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + M2M_INFO("Driver built at %s\t%s\n", __DATE__, __TIME__); + if (M2M_ERR_FW_VER_MISMATCH == ret) { + M2M_ERR("Mismatch Firmawre Version\n"); + } + + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); +_EXIT0: + return ret; +} + +sint8 m2m_wifi_deinit(void *arg) +{ + + hif_deinit(NULL); + + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} + +void m2m_wifi_yield(void) +{ + hif_yield(); +} + +sint8 m2m_wifi_handle_events(void *arg) +{ + return hif_handle_isr(); +} + +sint8 m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch, 0); +} +sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, + uint8 u8NoSaveCred) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mWifiConnect strConnect; + tstrM2MWifiSecInfo *pstrAuthInfo; + + if (u8SecType != M2M_WIFI_SEC_OPEN) { + if (pvAuthInfo == NULL) { + M2M_ERR("Key is not valid\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + if ((u8SecType == M2M_WIFI_SEC_WPA_PSK) && (m2m_strlen(pvAuthInfo) == (M2M_MAX_PSK_LEN - 1))) { + uint8 i = 0; + uint8 *pu8Psk = (uint8 *)pvAuthInfo; + while (i < (M2M_MAX_PSK_LEN - 1)) { + if (pu8Psk[i] < '0' || (pu8Psk[i] > '9' && pu8Psk[i] < 'A') || (pu8Psk[i] > 'F' && pu8Psk[i] < 'a') + || pu8Psk[i] > 'f') { + M2M_ERR("Invalid Key\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + i++; + } + } + } + if ((u8SsidLen <= 0) || (u8SsidLen >= M2M_MAX_SSID_LEN)) { + M2M_ERR("SSID LEN INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + if (u16Ch < M2M_WIFI_CH_1 || u16Ch > M2M_WIFI_CH_14) { + if (u16Ch != M2M_WIFI_CH_ALL) { + M2M_ERR("CH INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + } + + m2m_memcpy(strConnect.au8SSID, (uint8 *)pcSsid, u8SsidLen); + strConnect.au8SSID[u8SsidLen] = 0; + strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); + /* Credentials will be Not be saved if u8NoSaveCred is set */ + strConnect.u8NoSaveCred = u8NoSaveCred ? 1 : 0; + pstrAuthInfo = &strConnect.strSec; + pstrAuthInfo->u8SecType = u8SecType; + + if (u8SecType == M2M_WIFI_SEC_WEP) { + tstrM2mWifiWepParams *pstrWepParams = (tstrM2mWifiWepParams *)pvAuthInfo; + tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; + pstrWep->u8KeyIndx = pstrWepParams->u8KeyIndx - 1; + + if (pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) { + M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); + ret = M2M_ERR_FAIL; + goto ERR1; + } + pstrWep->u8KeySz = pstrWepParams->u8KeySz - 1; + if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE) && (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) { + M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy((uint8 *)pstrWep->au8WepKey, (uint8 *)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); + pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; + + } + + else if (u8SecType == M2M_WIFI_SEC_WPA_PSK) { + uint16 u16KeyLen = m2m_strlen((uint8 *)pvAuthInfo); + if ((u16KeyLen <= 0) || (u16KeyLen >= M2M_MAX_PSK_LEN)) { + M2M_ERR("Incorrect PSK key length\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8 *)pvAuthInfo, u16KeyLen + 1); + } else if (u8SecType == M2M_WIFI_SEC_802_1X) { + m2m_memcpy((uint8 *)&pstrAuthInfo->uniAuth.strCred1x, (uint8 *)pvAuthInfo, sizeof(tstr1xAuthCredentials)); + } else if (u8SecType == M2M_WIFI_SEC_OPEN) { + + } else { + M2M_ERR("undefined sec type\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8 *)&strConnect, sizeof(tstrM2mWifiConnect), NULL, 0, 0); + +ERR1: + return ret; +} + +sint8 m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0, 0); +} +sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + m2m_memcpy((uint8 *)strTmp.au8Mac, (uint8 *)au8MacAddress, 6); + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, (uint8 *)&strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0, 0); +} + +sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32(pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32(pstrStaticIPConf->u32SubnetMask); + return hif_send( + M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, (uint8 *)pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0, 0); +} + +sint8 m2m_wifi_request_dhcp_client(void) +{ + /*legacy API should be removed */ + return 0; +} +sint8 m2m_wifi_request_dhcp_server(uint8 *addr) +{ + /*legacy API should be removed */ + return 0; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); +@brief Set the Wi-Fi listen interval for power save operation. It is represented in units + of AP Beacon periods. +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tstrM2mLsnInt , m2m_wifi_set_sleep_mode +@pre m2m_wifi_set_sleep_mode shall be called first +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn) +{ + + uint8 u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt) +{ + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8 *)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +sint8 m2m_wifi_set_cust_InfoElement(uint8 *pau8M2mCustInfoElement) +{ + + sint8 ret = M2M_ERR_FAIL; + if (pau8M2mCustInfoElement != NULL) { + if ((pau8M2mCustInfoElement[0] + 1) < M2M_CUST_IE_LEN_MAX) { + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_CUST_INFO_ELEMENT | M2M_REQ_DATA_PKT, + (uint8 *)pau8M2mCustInfoElement, + pau8M2mCustInfoElement[0] + 1, + NULL, + 0, + 0); + } + } + return ret; +} + +sint8 m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if (m2m_validate_scan_options(ptstrM2MScanOption) == M2M_SUCCESS) { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_SCAN_OPTION, + (uint8 *)ptstrM2MScanOption, + sizeof(tstrM2MScanOption), + NULL, + 0, + 0); + } + return s8Ret; +} +sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_SCAN_REGION, + (uint8 *)&strScanRegion, + sizeof(tstrM2MScanRegion), + NULL, + 0, + 0); + return s8Ret; +} +sint8 m2m_wifi_request_scan(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (!gu8scanInProgress) { + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8 *)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } else { + s8Ret = M2M_ERR_INVALID_ARG; + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_passive(uint8 ch, uint16 scan_time) +{ + sint8 s8Ret = M2M_SUCCESS; + + if (!gu8scanInProgress) { + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + strtmp.u16PassiveScanTime = scan_time; + + s8Ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8 *)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } else { + s8Ret = M2M_ERR_INVALID_ARG; + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_ssid_list(uint8 ch, uint8 *u8Ssidlist) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if (!gu8scanInProgress) { + if ((((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) && (u8Ssidlist != NULL)) { + tstrM2MScan strtmp; + uint16 u16Lsize = 0; + uint8 u8Apnum = u8Ssidlist[u16Lsize]; + if (u8Apnum <= MAX_HIDDEN_SITES) { + u16Lsize++; + while (u8Apnum) { + if (u8Ssidlist[u16Lsize] >= M2M_MAX_SSID_LEN) { + goto EXIT; + } else { + u16Lsize += u8Ssidlist[u16Lsize] + 1; + u8Apnum--; + } + } + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SCAN_SSID_LIST | M2M_REQ_DATA_PKT, + (uint8 *)&strtmp, + sizeof(tstrM2MScan), + u8Ssidlist, + u16Lsize, + sizeof(tstrM2MScan)); + if (s8Ret == M2M_SUCCESS) { + gu8scanInProgress = 1; + } + } + } + } else { + s8Ret = M2M_ERR_SCAN_IN_PROGRESS; + } +EXIT: + return s8Ret; +} +sint8 m2m_wifi_wps(uint8 u8TriggerType, const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + /* Stop Scan if it is ongoing. + */ + gu8scanInProgress = 0; + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + m2m_memcpy((uint8 *)strtmp.acPinNumber, (uint8 *)pcPinNumber, 8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8 *)&strtmp, sizeof(tstrM2MWPSConnect), NULL, 0, 0); +} +sint8 m2m_wifi_wps_disable(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +@brief Send a command to the PS Client (An WINC1500 board running the ps_firmware), + if the PS client send any commands it will be received in wifi_cb M2M_WIFI_RESP_CLIENT_INFO +@param [in] cmd + Control command sent from PS Server to PS Client (command values defined by the application) +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa m2m_wifi_req_server_init, M2M_WIFI_RESP_CLIENT_INFO +@pre m2m_wifi_req_server_init should be called first +@warning +*/ +sint8 m2m_wifi_req_client_ctrl(uint8 u8Cmd) +{ + + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2Mservercmd strCmd; + strCmd.u8cmd = u8Cmd; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CLIENT_CTRL, (uint8 *)&strCmd, sizeof(tstrM2Mservercmd), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +@brief Initialize the PS Server, The WINC1500 support Non secure communication with another WINC1500, + (SERVER/CLIENT) through one byte command (probe request and probe response) without any connection setup +@param [in] ch + Server listening channel +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise +@sa m2m_wifi_req_client_ctrl +@warning The server mode can't be used with any other modes (STA/P2P/AP) +*/ +sint8 m2m_wifi_req_server_init(uint8 ch) +{ + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2mServerInit strServer; + strServer.u8Channel = ch; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SERVER_INIT, (uint8 *)&strServer, sizeof(tstrM2mServerInit), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +sint8 m2m_wifi_p2p(uint8 u8Channel) +{ + sint8 ret = M2M_SUCCESS; + if ((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8 *)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0, 0); + } else { + M2M_ERR("Listen channel should only be M2M_WIFI_CH_1/6/11 \n"); + ret = M2M_ERR_FAIL; + } + return ret; +} +sint8 m2m_wifi_p2p_disconnect(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig *pstrM2MAPConfig) +{ + sint8 ret = M2M_ERR_FAIL; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPConfig)) { + ret = hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig), NULL, 0, 0); + } + return ret; +} + +sint8 m2m_wifi_set_gains(tstrM2mWifiGainsParams *pstrM2mGain) +{ + sint8 ret = M2M_ERR_FAIL; + if (pstrM2mGain != NULL) { + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_GAINS, + (uint8 *)pstrM2mGain, + sizeof(tstrM2mWifiGainsParams), + NULL, + 0, + 0); + } + return ret; +} +sint8 m2m_wifi_disable_ap(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_req_curr_rssi(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_send_ethernet_pkt(uint8 *pu8Packet, uint16 u16PacketSize) +{ + sint8 s8Ret = -1; + if ((pu8Packet != NULL) && (u16PacketSize > 0)) { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8 *)&strTxPkt, + sizeof(tstrM2MWifiTxPacketInfo), + pu8Packet, + u16PacketSize, + M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + if (ret == M2M_SUCCESS) { + ret = hif_chip_sleep(); + } + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nmi_get_mac_address(pu8MacAddr); + if (ret == M2M_SUCCESS) { + ret = hif_chip_sleep(); + } + } + + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return M2M_SUCCESE for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +sint8 m2m_wifi_req_scan_result(uint8 index) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SCAN_RESULT, + (uint8 *)&strReqScanRlt, + sizeof(tstrM2mReqScanResult), + NULL, + 0, + 0); + return ret; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8 m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8 m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@brief Set the power saving mode for the WINC1500. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC1500 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC1500 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8 *)&strPs, sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\n", PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(void) +@brief Request from WINC1500 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning the Function should be called in M2M_PS_MANUAL power save only +*/ +sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime) +{ + sint8 ret = M2M_SUCCESS; + uint8 psType; + psType = hif_get_sleep_mode(); + if (psType == M2M_PS_MANUAL) { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8 *)&strPs, sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@brief Set the WINC1500 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if (u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + // pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength++; + m2m_memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8 *)&strDeviceName, + sizeof(tstrM2MDeviceNameConfig), + NULL, + 0, + 0); +} +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#ifdef CONF_MGMT +sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset) +{ + sint8 s8Ret = -1; + if ((pstrMtrCtrl->u8ChannelID >= M2M_WIFI_CH_1) && (pstrMtrCtrl->u8ChannelID <= M2M_WIFI_CH_14)) { + gstrMgmtCtrl.pu8Buf = pu8PayloadBuffer; + gstrMgmtCtrl.u16Sz = u16BufferSize; + gstrMgmtCtrl.u16Offset = u16DataOffset; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_ENABLE_MONITORING, + (uint8 *)pstrMtrCtrl, + sizeof(tstrM2MWifiMonitorModeCtrl), + NULL, + 0, + 0); + } + return s8Ret; +} + +sint8 m2m_wifi_disable_monitoring_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_MONITORING, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize) +{ + sint8 s8Ret = -1; + if (pu8WlanPacket != NULL) { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16WlanPktSize; + strTxPkt.u16HeaderLength = u16WlanHeaderLength; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SEND_WIFI_PACKET | M2M_REQ_DATA_PKT, + (uint8 *)&strTxPkt, + sizeof(tstrM2MWifiTxPacketInfo), + pu8WlanPacket, + u16WlanPktSize, + sizeof(tstrM2MWifiTxPacketInfo)); + } + return s8Ret; +} +#endif + +sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, + uint8 bEnableHttpRedirect) +{ + sint8 s8Ret = M2M_ERR_FAIL; + + if ((pstrAPConfig != NULL)) { + tstrM2MProvisionModeConfig strProvConfig; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPConfig)) { + m2m_memcpy((uint8 *)&strProvConfig.strApConfig, (uint8 *)pstrAPConfig, sizeof(tstrM2MAPConfig)); + if ((m2m_strlen((uint8 *)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) { + M2M_ERR("INVALID DOMAIN NAME\n"); + goto ERR1; + } + m2m_memcpy((uint8 *)strProvConfig.acHttpServerDomainName, (uint8 *)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + /* Stop Scan if it is ongoing. + */ + gu8scanInProgress = 0; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8 *)&strProvConfig, + sizeof(tstrM2MProvisionModeConfig), + NULL, + 0, + 0); + } else { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +sint8 m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds) +{ + /* + The firmware accepts timestamps relative to 1900 like NTP Timestamp. + */ + return hif_send( + M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8 *)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_get_sytem_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_enable_sntp(uint8 bEnable) +{ + uint8 u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief Change the power profile mode +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_POWER_PROFILE, + (uint8 *)&strM2mPwrMode, + sizeof(tstrM2mPwrMode), + NULL, + 0, + 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_TX_POWER, + (uint8 *)&strM2mTxPwrLevel, + sizeof(tstrM2mTxPwrLevel), + NULL, + 0, + 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_ENABLE_LOGS, + (uint8 *)&strM2mEnableLogs, + sizeof(tstrM2mEnableLogs), + NULL, + 0, + 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + (uint8 *)&strM2mBattVol, + sizeof(tstrM2mBatteryVoltage), + NULL, + 0, + 0); + return ret; +} +/*! +@fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +*/ +sint8 m2m_wifi_prng_get_random_bytes(uint8 *pu8PrngBuff, uint16 u16PrngSize) +{ + sint8 ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if ((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng))) && (pu8PrngBuff != NULL)) { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_GET_PRNG | M2M_REQ_DATA_PKT, + (uint8 *)&strRng, + sizeof(tstrPrng), + NULL, + 0, + 0); + } else { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\n", u16PrngSize); + } + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate * pstrConfAutoRate) + +@brief + Allow the host MCU app to configure auto TX rate selection algorithm. The application can use this + API to tweak the algorithm performance. Moreover, it allows the application to force a specific WLAN + PHY rate for transmitted data packets to favor range vs. throughput needs. + +@param [in] pstrConfAutoRate + The Auto rate configuration parameters as listed in tstrConfAutoRate. +@sa + tstrConfAutoRate +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_conf_auto_rate(tstrConfAutoRate *pstrConfAutoRate) +{ + sint8 s8ret = M2M_ERR_FAIL; + + s8ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_CONG_AUTO_RATE, + (uint8 *)pstrConfAutoRate, + sizeof(tstrConfAutoRate), + NULL, + 0, + 0); + + return s8ret; +} + +#ifdef ETH_MODE +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *pu8MulticastMacAddress, uint8 u8AddRemove) +{ + sint8 s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if (pu8MulticastMacAddress != NULL) { + strMulticastMac.u8AddRemove = u8AddRemove; + m2m_memcpy(strMulticastMac.au8macaddress, pu8MulticastMacAddress, M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n", + strMulticastMac.au8macaddress[0], + strMulticastMac.au8macaddress[1], + strMulticastMac.au8macaddress[2], + strMulticastMac.au8macaddress[3], + strMulticastMac.au8macaddress[4], + strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_SET_MAC_MCAST, + (uint8 *)&strMulticastMac, + sizeof(tstrM2MMulticastMac), + NULL, + 0, + 0); + } + + return s8ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +@brief + set the ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void *pvBuffer, uint16 u16BufferLen) +{ + sint8 s8ret = M2M_SUCCESS; + if (pvBuffer != NULL) { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize = u16BufferLen; + } else { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} +#endif /* ETH_MODE */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.c new file mode 100644 index 0000000..9c595b7 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.c @@ -0,0 +1,679 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 ASIC specific internal APIs. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X, Y) (X[0 + Y] + ((uint32)X[1 + Y] << 8) + ((uint32)X[2 + Y] << 16) + ((uint32)X[3 + Y] << 24)) + +/*SPI and I2C only*/ +#define CORT_HOST_COMM (0x10) +#define HOST_CORT_COMM (0x0b) +#define WAKE_CLK_REG (0x1) +#define CLOCKS_EN_REG (0xf) + +#define TIMEOUT (0xfffffffful) +#define WAKUP_TRAILS_TIMEOUT (4) + +sint8 chip_apply_conf(uint32 u32Conf) +{ + sint8 ret = M2M_SUCCESS; + uint32 val32 = u32Conf; + +#if (defined __ENABLE_PMU__) || (defined CONF_WINC_INT_PMU) + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif +#if defined CONF_WINC_XO_XTALGM2_DIS + val32 |= rHAVE_XO_XTALGM2_DIS_BIT; +#endif + + val32 |= rHAVE_RESERVED1_BIT; + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if (val32 != 0) { + uint32 reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if (ret == M2M_SUCCESS) { + if (reg == val32) + break; + } + } else { + break; + } + } while (1); + + return M2M_SUCCESS; +} +void chip_idle(void) +{ + uint32 reg = 0; + nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (reg & NBIT1) { + reg &= ~NBIT1; + nm_write_reg(WAKE_CLK_REG, reg); + } +} + +sint8 enable_interrupts(void) +{ + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg |= ((uint32)1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) + goto ERR1; + + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) + goto ERR1; + + reg |= ((uint32)1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) + goto ERR1; +ERR1: + return ret; +} + +sint8 cpu_start(void) +{ + uint32 reg = 0; + sint8 ret; + + /** + reset regs + */ + ret = nm_write_reg(BOOTROM_REG, 0); + ret += nm_write_reg(NMI_STATE_REG, 0); + ret += nm_write_reg(NMI_REV_REG, 0); + /** + Go... + **/ + ret += nm_read_reg_with_ret(0x1118, ®); + reg |= (1 << 0); + ret += nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_bsp_sleep(1); + return ret; +} + +uint32 nmi_get_chipid(void) +{ + static uint32 chipid = 0; + + if (chipid == 0) { + uint32 rfrevid; + + if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + // if((ret = nm_read_reg_with_ret(0x11fc, &revid)) != M2M_SUCCESS) { + // return 0; + //} + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if (chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if (chipid == 0x1002b0) { + if (rfrevid == 3) { /* 1002B0 */ + } else if (rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if (chipid == 0x1000F0) { + if ((nm_read_reg_with_ret(0x3B0000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + } else { + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if (chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if (flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if (flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } +#else + /*M2M is by default have SPI flash*/ + chipid &= ~(0x0f0000); + chipid |= 0x050000; +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32 nmi_get_rfrevid(void) +{ + uint32 rfrevid; + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + return 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if (REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32 pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32 val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} +sint8 chip_sleep(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; + + while (1) { + ret = nm_read_reg_with_ret(CORT_HOST_COMM, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if ((reg & NBIT0) == 0) + break; + } + + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if (reg & NBIT1) { + reg &= ~NBIT1; + ret = nm_write_reg(WAKE_CLK_REG, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + } + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if (ret != M2M_SUCCESS) + goto ERR1; + if (reg & NBIT0) { + reg &= ~NBIT0; + ret = nm_write_reg(HOST_CORT_COMM, reg); + if (ret != M2M_SUCCESS) + goto ERR1; + } + +ERR1: + return ret; +} +sint8 chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, clk_status_reg = 0, trials = 0; + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + + if (!(reg & NBIT0)) { + /*USE bit 0 to indicate host wakeup*/ + ret = nm_write_reg(HOST_CORT_COMM, reg | NBIT0); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + } + + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + /* Set bit 1 */ + if (!(reg & NBIT1)) { + ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1); + if (ret != M2M_SUCCESS) + goto _WAKE_EXIT; + } + + do { + ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + if (ret != M2M_SUCCESS) { + M2M_ERR("Bus error (5).%d %x\n", ret, clk_status_reg); + goto _WAKE_EXIT; + } + if (clk_status_reg & NBIT2) { + break; + } + nm_bsp_sleep(2); + trials++; + if (trials > WAKUP_TRAILS_TIMEOUT) { + M2M_ERR("Failed to wakup the chip\n"); + ret = M2M_ERR_TIME_OUT; + goto _WAKE_EXIT; + } + } while (1); + + /*workaround sometimes spi fail to read clock regs after reading/writing clockless registers*/ + nm_bus_reset(); + +_WAKE_EXIT: + return ret; +} +sint8 cpu_halt(void) +{ + sint8 ret; + uint32 reg = 0; + ret = nm_read_reg_with_ret(0x1118, ®); + reg |= (1 << 0); + ret += nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } + return ret; +} +sint8 chip_reset_and_cpu_halt(void) +{ + sint8 ret = M2M_SUCCESS; + + /*Wakeup needed only for I2C interface*/ + ret = chip_wake(); + if (ret != M2M_SUCCESS) + goto ERR1; + /*Reset and CPU halt need for no wait board only*/ + ret = chip_reset(); + if (ret != M2M_SUCCESS) + goto ERR1; + ret = cpu_halt(); + if (ret != M2M_SUCCESS) + goto ERR1; +ERR1: + return ret; +} +sint8 chip_reset(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_write_reg(NMI_GLB_RESET_0, 0); + nm_bsp_sleep(50); + return ret; +} + +sint8 wait_for_bootrom(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + uint32 u32GpReg1 = 0; + uint32 u32DriverVerInfo = M2M_MAKE_VERSION_INFO(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO, + M2M_MIN_REQ_DRV_VERSION_MAJOR_NO, + M2M_MIN_REQ_DRV_VERSION_MINOR_NO, + M2M_MIN_REQ_DRV_VERSION_PATCH_NO); + + reg = 0; + while (1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if (reg == 0) { + reg = 0; + while (reg != M2M_FINISH_BOOT_ROM) { + nm_bsp_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if (++cnt > TIMEOUT) { + M2M_DBG("failed to load firmware from flash.\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if (M2M_WIFI_MODE_ATE_HIGH == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + nm_write_reg(NMI_STATE_REG, NBIT20); + } else if (M2M_WIFI_MODE_ATE_LOW == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + nm_write_reg(NMI_STATE_REG, 0); + } else if (M2M_WIFI_MODE_ETHERNET == arg) { + u32GpReg1 = rHAVE_ETHERNET_MODE_BIT; + nm_write_reg(NMI_STATE_REG, u32DriverVerInfo); + } else { + /*bypass this step*/ + nm_write_reg(NMI_STATE_REG, u32DriverVerInfo); + } + + if (REV(nmi_get_chipid()) >= REV_3A0) { + chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT); + } else { + chip_apply_conf(u32GpReg1); + } + M2M_INFO("DriverVerInfo: 0x%08lx\n", u32DriverVerInfo); + + nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +sint8 wait_for_firmware_start(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + uint32 u32Timeout = TIMEOUT; + volatile uint32 regAddress = NMI_STATE_REG; + volatile uint32 checkValue = M2M_FINISH_INIT_STATE; + + if ((M2M_WIFI_MODE_ATE_HIGH == arg) || (M2M_WIFI_MODE_ATE_LOW == arg)) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) { + nm_bsp_sleep(2); /* TODO: Why bus error if this delay is not here. */ + M2M_DBG("%x %x %x\n", + (unsigned int)nm_read_reg(0x108c), + (unsigned int)nm_read_reg(0x108c), + (unsigned int)nm_read_reg(0x14A0)); + reg = nm_read_reg(regAddress); + if (++cnt >= u32Timeout) { + M2M_DBG("Time out for wait firmware Run\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if (M2M_FINISH_INIT_STATE == checkValue) { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +sint8 chip_deinit(void) +{ + uint32 reg = 0; + sint8 ret; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + goto ERR1; + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + goto ERR1; + } + +ERR1: + return ret; +} + +#ifdef CONF_PERIPH + +sint8 set_gpio_dir(uint8 gpio, uint8 dir) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + if (dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +sint8 set_gpio_val(uint8 gpio, uint8 val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + if (val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +sint8 get_gpio_val(uint8 gpio, uint8 *val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if (ret != M2M_SUCCESS) + goto _EXIT; + + *val = (uint8)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable) +{ + sint8 s8Ret; + uint32 val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\n"); + goto _EXIT; + } + if (enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} +#endif /* CONF_PERIPH */ + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, &u32RegValue); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if (!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\n"); + m2m_memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\n"); + u32RegValue >>= 16; + ret = nm_read_block(u32RegValue | 0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + if (pu8IsValid) + *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if (pu8IsValid) + *pu8IsValid = 0; + return ret; +} + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, &u32RegValue); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) + goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &= 0x0000ffff; + ret = nm_read_block(u32RegValue | 0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + + return ret; + +_EXIT_ERR: + return ret; +} diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.h new file mode 100644 index 0000000..2eba658 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmasic.h @@ -0,0 +1,218 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 ASIC specific internal APIs. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "common/include/nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GP_REG_2 (0xc0008) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define NMI_REV_REG_ATE (0x1048) /*Revision info register in case of ATE FW*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE \ + (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) ((((id)&0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) ((((id)&0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3000(id) ((((id)&0xfff00000) == 0x300000) ? 1 : 0) +#define REV(id) (((id)&0x00000fff)) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) +#define rHAVE_ETHERNET_MODE_BIT (NBIT7) +#define rHAVE_RESERVED1_BIT (NBIT8) +#define rHAVE_RESERVED2_BIT (NBIT9) +#define rHAVE_XO_XTALGM2_DIS_BIT (NBIT10) + +typedef struct { + uint32 u32Mac_efuse_mib; + uint32 u32Firmware_Ota_rev; +} tstrGpRegs; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @fn cpu_halt + * @brief + */ +sint8 cpu_halt(void); +/* + * @fn chip_sleep + * @brief + */ +sint8 chip_sleep(void); +/* + * @fn chip_wake + * @brief + */ +sint8 chip_wake(void); +/* + * @fn chip_idle + * @brief + */ +void chip_idle(void); +/* + * @fn enable_interrupts + * @brief + */ +sint8 enable_interrupts(void); +/* + * @fn cpu_start + * @brief + */ +sint8 cpu_start(void); +/* + * @fn nmi_get_chipid + * @brief + */ +uint32 nmi_get_chipid(void); +/* + * @fn nmi_get_rfrevid + * @brief + */ +uint32 nmi_get_rfrevid(void); +/* + * @fn restore_pmu_settings_after_global_reset + * @brief + */ +void restore_pmu_settings_after_global_reset(void); +/* + * @fn nmi_update_pll + * @brief + */ +void nmi_update_pll(void); +/* + * @fn nmi_set_sys_clk_src_to_xo + * @brief + */ +void nmi_set_sys_clk_src_to_xo(void); +/* + * @fn chip_reset + * @brief + */ +sint8 chip_reset(void); +/* + * @fn wait_for_bootrom + * @brief + */ +sint8 wait_for_bootrom(uint8); +/* + * @fn wait_for_firmware_start + * @brief + */ +sint8 wait_for_firmware_start(uint8); +/* + * @fn chip_deinit + * @brief + */ +sint8 chip_deinit(void); +/* + * @fn chip_reset_and_cpu_halt + * @brief + */ +sint8 chip_reset_and_cpu_halt(void); +/* + * @fn set_gpio_dir + * @brief + */ +sint8 set_gpio_dir(uint8 gpio, uint8 dir); +/* + * @fn set_gpio_val + * @brief + */ +sint8 set_gpio_val(uint8 gpio, uint8 val); +/* + * @fn get_gpio_val + * @brief + */ +sint8 get_gpio_val(uint8 gpio, uint8 *val); +/* + * @fn pullup_ctrl + * @brief + */ +sint8 pullup_ctrl(uint32 pinmask, uint8 enable); +/* + * @fn nmi_get_otp_mac_address + * @brief + */ +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 *pu8IsValid); +/* + * @fn nmi_get_mac_address + * @brief + */ +sint8 nmi_get_mac_address(uint8 *pu8MacAddr); +/* + * @fn chip_apply_conf + * @brief + */ +sint8 chip_apply_conf(uint32 u32conf); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMASIC_H_*/ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.c new file mode 100644 index 0000000..4f3ac93 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.c @@ -0,0 +1,288 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#ifndef CORTUS_APP + +#include "nmbus.h" +#include "nmi2c.h" +#include "nmspi.h" +#include "nmuart.h" + +#define MAX_TRX_CFG_SZ 8 + +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_bus_iface_init(void *pvInitVal) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal); + return ret; +} + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Samer Sarhan + * @date 07 April 2014 + * @version 1.0 + */ +sint8 nm_bus_iface_deinit(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +sint8 nm_bus_reset(void) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_reset(); +#elif defined(CONF_WINC_USE_I2C) +#else +#error "Plesae define bus usage" +#endif + + return ret; +} + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Viswanathan Murugesan + * @date 22 Oct 2014 + * @version 1.0 + */ +sint8 nm_bus_iface_reconfigure(void *ptr) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART + ret = nm_uart_reconfigure(ptr); +#endif + return ret; +} +/* + * @fn nm_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_read_reg(uint32 u32Addr) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg(u32Addr); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_reg(u32Addr); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_reg(u32Addr); +#else +#error "Plesae define bus usage" +#endif +} + +/* + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg_with_ret(u32Addr, pu32RetVal); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_reg_with_ret(u32Addr, pu32RetVal); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_reg_with_ret(u32Addr, pu32RetVal); +#else +#error "Plesae define bus usage" +#endif +} + +/* + * @fn nm_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_reg(u32Addr, u32Val); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_write_reg(u32Addr, u32Val); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_write_reg(u32Addr, u32Val); +#else +#error "Plesae define bus usage" +#endif +} + +static sint8 p_nm_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_read_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_read_block(u32Addr, puBuf, u16Sz); +#else +#error "Plesae define bus usage" +#endif +} +/* + * @fn nm_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for (;;) { + if (u32Sz <= u16MaxTrxSz) { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } else { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if (M2M_SUCCESS != s8Ret) + break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static sint8 p_nm_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_SPI) + return nm_spi_write_block(u32Addr, puBuf, u16Sz); +#elif defined(CONF_WINC_USE_I2C) + return nm_i2c_write_block(u32Addr, puBuf, u16Sz); +#else +#error "Plesae define bus usage" +#endif +} +/** + * @fn nm_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for (;;) { + if (u32Sz <= u16MaxTrxSz) { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } else { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if (M2M_SUCCESS != s8Ret) + break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.h new file mode 100644 index 0000000..09edf67 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmbus.h @@ -0,0 +1,141 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_init(void *); + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_deinit(void); + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +sint8 nm_bus_reset(void); + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_iface_reconfigure(void *ptr); + +/** + * @fn nm_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_read_reg(uint32 u32Addr); + +/** + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +/** + * @fn nm_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.c new file mode 100644 index 0000000..96b0148 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.c @@ -0,0 +1,379 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 M2M driver APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmdrv.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" +#include "spi_flash/include/spi_flash.h" + +#ifdef CONF_WINC_USE_SPI +#include "driver/source/nmspi.h" +#endif + +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_info(tstrM2mRev *M2mRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + // In case the Firmware running is ATE fw + if (M2M_ATE_FW_IS_UP_VALUE == reg) { + // Read FW info again from the register specified for ATE + ret = nm_read_reg_with_ret(NMI_REV_REG_ATE, ®); + } + M2mRev->u8DriverMajor = M2M_GET_DRV_MAJOR(reg); + M2mRev->u8DriverMinor = M2M_GET_DRV_MINOR(reg); + M2mRev->u8DriverPatch = M2M_GET_DRV_PATCH(reg); + M2mRev->u8FirmwareMajor = M2M_GET_FW_MAJOR(reg); + M2mRev->u8FirmwareMinor = M2M_GET_FW_MINOR(reg); + M2mRev->u8FirmwarePatch = M2M_GET_FW_PATCH(reg); + M2mRev->u32Chipid = nmi_get_chipid(); + M2mRev->u16FirmwareSvnNum = 0; + + curr_firm_ver = M2M_MAKE_VERSION(M2mRev->u8FirmwareMajor, M2mRev->u8FirmwareMinor, M2mRev->u8FirmwarePatch); + curr_drv_ver + = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, M2M_RELEASE_VERSION_MINOR_NO, M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION(M2mRev->u8DriverMajor, M2mRev->u8DriverMinor, M2mRev->u8DriverPatch); + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + } + return ret; +} +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_full_info(tstrM2mRev *pstrRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + if (pstrRev != NULL) { + m2m_memset((uint8 *)pstrRev, 0, sizeof(tstrM2mRev)); + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, ®); + if (ret == M2M_SUCCESS) { + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret == M2M_SUCCESS) { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)pstrRev, sizeof(tstrM2mRev)); + if (ret == M2M_SUCCESS) { + curr_firm_ver = M2M_MAKE_VERSION( + pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + curr_drv_ver = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION( + pstrRev->u8DriverMajor, pstrRev->u8DriverMinor, pstrRev->u8DriverPatch); + if ((curr_firm_ver == 0) || (min_req_drv_ver == 0) || (min_req_drv_ver == 0)) { + ret = M2M_ERR_FAIL; + goto EXIT; + } + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + goto EXIT; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + goto EXIT; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } +EXIT: + return ret; +} +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev *pstrRev) +{ + uint16 curr_drv_ver, min_req_drv_ver, curr_firm_ver; + uint32 reg = 0; + sint8 ret; + tstrGpRegs strgp = {0}; + + if (pstrRev != NULL) { + m2m_memset((uint8 *)pstrRev, 0, sizeof(tstrM2mRev)); + ret = nm_read_reg_with_ret(rNMI_GP_REG_2, ®); + if (ret == M2M_SUCCESS) { + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)&strgp, sizeof(tstrGpRegs)); + if (ret == M2M_SUCCESS) { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if (reg != 0) { + ret = nm_read_block(reg | 0x30000, (uint8 *)pstrRev, sizeof(tstrM2mRev)); + if (ret == M2M_SUCCESS) { + curr_firm_ver = M2M_MAKE_VERSION( + pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + curr_drv_ver = M2M_MAKE_VERSION(M2M_RELEASE_VERSION_MAJOR_NO, + M2M_RELEASE_VERSION_MINOR_NO, + M2M_RELEASE_VERSION_PATCH_NO); + min_req_drv_ver = M2M_MAKE_VERSION( + pstrRev->u8DriverMajor, pstrRev->u8DriverMinor, pstrRev->u8DriverPatch); + if ((curr_firm_ver == 0) || (min_req_drv_ver == 0) || (min_req_drv_ver == 0)) { + ret = M2M_ERR_FAIL; + goto EXIT; + } + if (curr_drv_ver < min_req_drv_ver) { + /*The current driver version should be larger or equal + than the min driver that the current firmware support */ + ret = M2M_ERR_FW_VER_MISMATCH; + } + if (curr_drv_ver > curr_firm_ver) { + /*The current driver should be equal or less than the firmware version*/ + ret = M2M_ERR_FW_VER_MISMATCH; + } + } + } else { + ret = M2M_ERR_INVALID; + } + } + } else { + ret = M2M_ERR_FAIL; + } + } + } else { + ret = M2M_ERR_INVALID_ARG; + } +EXIT: + return ret; +} + +/* + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver + * @return M2M_SUCCESS in case of success and Negative error code in case of failure + * @param [in] arg + * Generic argument + * @author Viswanathan Murugesan + * @date 10 Oct 2014 + * @version 1.0 + */ +sint8 nm_drv_init_download_mode() +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + + /** + TODO:reset the chip and halt the cpu in case of no wait efuse is set (add the no wait effuse check) + */ + if (!ISNMC3000(GET_CHIPID())) { + /*Execuate that function only for 1500A/B, no room in 3000, but it may be needed in 3400 no wait*/ + chip_reset_and_cpu_halt(); + } + +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300, 0); + +ERR1: + return ret; +} + +/* + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @return M2M_SUCCESS in case of success and Negative error code in case of failure + * @param [in] arg + * Generic argument + * @author M. Abdelmawla + * @date 15 July 2012 + * @version 1.0 + */ +sint8 nm_drv_init(void *arg) +{ + sint8 ret = M2M_SUCCESS; + uint8 u8Mode; + + if (NULL != arg) { + u8Mode = *((uint8 *)arg); + if ((u8Mode < M2M_WIFI_MODE_NORMAL) || (u8Mode >= M2M_WIFI_MODE_MAX)) { + u8Mode = M2M_WIFI_MODE_NORMAL; + } + } else { + u8Mode = M2M_WIFI_MODE_NORMAL; + } + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + +#ifdef NO_HW_CHIP_EN + ret = chip_wake(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\n"); + goto ERR2; + } + /** + Go... + **/ + ret = chip_reset(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } +#endif +// M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if ((M2M_WIFI_MODE_ATE_HIGH == u8Mode) || (M2M_WIFI_MODE_ATE_LOW == u8Mode)) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\n"); + goto ERR2; + } + return ret; +ERR2: + nm_bus_iface_deinit(); +ERR1: + return ret; +} + +/* + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @author M. Abdelmawla + * @date 17 July 2012 + * @version 1.0 + */ +sint8 nm_drv_deinit(void *arg) +{ + sint8 ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\n"); + goto ERR1; + } + + /* Disable SPI flash to save power when the chip is off */ + ret = spi_flash_enable(0); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: SPI flash disable fail\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\n"); + goto ERR1; + } +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); +#endif + +ERR1: + return ret; +} diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.h new file mode 100644 index 0000000..effd356 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmdrv.h @@ -0,0 +1,136 @@ +/** + * + * \file + * + * \brief This module contains NMC1500 M2M driver APIs declarations. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "common/include/nm_common.h" + +/** + * @struct tstrM2mRev + * @brief Structure holding firmware version parameters and build date/time + */ +typedef struct { + uint32 u32Chipid; /* HW revision which will be basically the chip ID */ + uint8 u8FirmwareMajor; /* Version Major Number which represents the official release base */ + uint8 u8FirmwareMinor; /* Version Minor Number which represents the engineering release base */ + uint8 u8FirmwarePatch; /* Version pathc Number which represents the pathces release base */ + uint8 u8DriverMajor; /* Version Major Number which represents the official release base */ + uint8 u8DriverMinor; /* Version Minor Number which represents the engineering release base */ + uint8 u8DriverPatch; /* Version Patch Number which represents the pathces release base */ + uint8 BuildDate[sizeof(__DATE__)]; + uint8 BuildTime[sizeof(__TIME__)]; + uint8 _PAD8_; + uint16 u16FirmwareSvnNum; + uint16 _PAD16_[2]; +} tstrM2mRev; + +/** + * @struct tstrM2mBinaryHeader + * @brief Structure holding compatibility version info for firmware binaries + */ +typedef struct { + tstrM2mRev binVerInfo; + uint32 flashOffset; + uint32 payloadSize; +} tstrM2mBinaryHeader; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_get_firmware_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_info(tstrM2mRev *M2mRev); +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param [out] M2mRev + * pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + * @version 1.0 + */ +sint8 nm_get_firmware_full_info(tstrM2mRev *pstrRev); +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev *pstrRev); +/* + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @return ZERO in case of success and Negative error code in case of failure + */ +sint8 nm_drv_init_download_mode(void); + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Generic argument TBD +* @return ZERO in case of success and Negative error code in case of failure + +*/ +sint8 nm_drv_init(void *arg); + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @author M. Abdelmawla + * @param [in] arg + * Generic argument TBD + * @return ZERO in case of success and Negative error code in case of failure + */ +sint8 nm_drv_deinit(void *arg); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMDRV_H_*/ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.c new file mode 100644 index 0000000..b4bd962 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.c @@ -0,0 +1,258 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 I2C protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_I2C + +#include "nmi2c.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +/* + * @fn nm_i2c_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + uint8 b[6]; + uint8 rsz; + tstrNmI2cDefault strI2c; + sint8 s8Ret = M2M_SUCCESS; + + if (u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x09; + b[1] = (uint8)(u32Addr); + rsz = 1; + strI2c.u16Sz = 2; + } else { + b[0] = 0x80; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)(u32Addr); + b[5] = 0x04; + rsz = 4; + strI2c.u16Sz = 6; + } + + strI2c.pu8Buf = b; + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + strI2c.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) { + // M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + if (rsz == 1) { + *pu32RetVal = b[0]; + } else { + *pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24); + } + return s8Ret; +} + +/* + * @fn nm_i2c_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_i2c_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_i2c_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* + * @fn nm_i2c_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmI2cDefault strI2c; + uint8 b[16]; + sint8 s8Ret = M2M_SUCCESS; + + if (u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x19; + b[1] = (uint8)(u32Addr); + b[2] = (uint8)(u32Val); + strI2c.u16Sz = 3; + } else { + b[0] = 0x90; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)u32Addr; + b[5] = 0x04; + b[6] = (uint8)u32Val; + b[7] = (uint8)(u32Val >> 8); + b[8] = (uint8)(u32Val >> 16); + b[9] = (uint8)(u32Val >> 24); + strI2c.u16Sz = 10; + } + + strI2c.pu8Buf = b; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +/* + * @fn nm_i2c_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmI2cDefault strI2c; + uint8 au8Buf[7]; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x02; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr >> 0); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf = au8Buf; + strI2c.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + strI2c.pu8Buf = pu8Buf; + strI2c.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + + return s8Ret; +} + +/* + * @fn nm_i2c_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + uint8 au8Buf[7]; + tstrNmI2cSpecial strI2c; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x12; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf1 = au8Buf; + strI2c.pu8Buf2 = pu8Buf; + strI2c.u16Sz1 = sizeof(au8Buf); + strI2c.u16Sz2 = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W_SPECIAL, &strI2c)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +#endif +/* EOF */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.h new file mode 100644 index 0000000..149e0b6 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmi2c.h @@ -0,0 +1,104 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 I2C protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NMI2C_H_ +#define _NMI2C_H_ + +#include "common/include/nm_common.h" + +/** + * @fn nm_i2c_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_i2c_read_reg(uint32 u32Addr); + +/** + * @fn nm_i2c_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_i2c_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_i2c_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_i2c_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#endif /* _NMI2C_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.c new file mode 100644 index 0000000..c880514 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.c @@ -0,0 +1,1357 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 SPI protocol bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_SPI + +#define USE_OLD_SPI_SW + +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "nmspi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE + 0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE + 0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE + 0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE + 0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE + 0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE + 0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE + 0x2c) +#define NMI_SPI_MISC_CTRL (NMI_SPI_REG_BASE + 0x48) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG - NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +#define CMD_DMA_WRITE 0xc1 +#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +#define CMD_TERMINATE 0xc5 +#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 1 +#define N_FAIL 0 +#define N_RESET -1 +#define N_RETRY -2 + +#define SPI_RESP_RETRY_COUNT (10) +#define SPI_RETRY_COUNT (10) +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8 gu8Crc_off = 0; + +static sint8 nmi_spi_read(uint8 *b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = NULL; + spi.pu8OutBuf = b; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_write(uint8 *b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = b; + spi.pu8OutBuf = NULL; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} +#ifndef USE_OLD_SPI_SW +static sint8 nmi_spi_rw(uint8 *bin, uint8 *bout, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = bin; + spi.pu8OutBuf = bout; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} +#endif +/******************************************** + + Crc7 + +********************************************/ + +static const uint8 crc7_syndrome_table[256] + = {0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x19, 0x10, 0x0b, + 0x02, 0x3d, 0x34, 0x2f, 0x26, 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, + 0x04, 0x0d, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x63, + 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, + 0x08, 0x01, 0x1a, 0x13, 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, + 0x0a, 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, 0x4f, 0x46, + 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, 0x41, 0x48, 0x53, 0x5a, 0x65, + 0x6c, 0x77, 0x7e, 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x3b, 0x32, 0x29, + 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, + 0x14, 0x1d, 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, 0x3c, + 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, 0x17, 0x1e, 0x05, 0x0c, + 0x33, 0x3a, 0x21, 0x28, 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, + 0x31, 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79}; + +static uint8 crc7_byte(uint8 crc, uint8 data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static uint8 crc7(uint8 crc, const uint8 *buffer, uint32 len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + + /******************************************** + + Spi protocol Function + + ********************************************/ + +#define CMD_DMA_WRITE 0xc1 +#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +#define CMD_TERMINATE 0xc5 +#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static sint8 spi_cmd(uint8 cmd, uint32 adr, uint32 u32data, uint32 sz, uint8 clockless) +{ + uint8 bc[9]; + uint8 len = 5; + sint8 result = N_OK; + + bc[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8)(adr >> 8); + if (clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8)adr; + bc[3] = 0x00; + len = 5; + break; + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 8); + bc[5] = (uint8)(sz); + len = 7; + break; + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 16); + bc[5] = (uint8)(sz >> 8); + bc[6] = (uint8)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8)(adr >> 8); + if (clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8)(adr); + bc[3] = (uint8)(u32data >> 24); + bc[4] = (uint8)(u32data >> 16); + bc[5] = (uint8)(u32data >> 8); + bc[6] = (uint8)(u32data); + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)(adr); + bc[4] = (uint8)(u32data >> 24); + bc[5] = (uint8)(u32data >> 16); + bc[6] = (uint8)(u32data >> 8); + bc[7] = (uint8)(u32data); + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result) { + if (!gu8Crc_off) + bc[len - 1] = (crc7(0x7f, (const uint8 *)&bc[0], len - 1)) << 1; + else + len -= 1; + + if (M2M_SUCCESS != nmi_spi_write(bc, len)) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + } + } + + return result; +} + +static sint8 spi_data_rsp(uint8 cmd) +{ + uint8 len; + uint8 rsp[3]; + sint8 result = N_OK; + + if (!gu8Crc_off) + len = 2; + else + len = 3; + + if (M2M_SUCCESS != nmi_spi_read(&rsp[0], len)) { + M2M_ERR("[nmi spi]: Failed bus error...\n"); + result = N_FAIL; + goto _fail_; + } + + if ((rsp[len - 1] != 0) || (rsp[len - 2] != 0xC3)) { + M2M_ERR("[nmi spi]: Failed data response read, %x %x %x\n", rsp[0], rsp[1], rsp[2]); + result = N_FAIL; + goto _fail_; + } +_fail_: + + return result; +} + +static sint8 spi_cmd_rsp(uint8 cmd) +{ + uint8 rsp; + sint8 result = N_OK; + sint8 s8RetryCnt; + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } + + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while ((rsp != cmd) && (s8RetryCnt-- > 0)); + + /** + State response + **/ + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while ((rsp != 0x00) && (s8RetryCnt-- > 0)); + +_fail_: + + return result; +} +#ifndef USE_OLD_SPI_SW +static int spi_cmd_complete(uint8_t cmd, uint32_t adr, uint8_t *b, uint32_t sz, uint8_t clockless) +{ + uint8_t wb[32], rb[32]; + uint8_t wix, rix; + uint32_t len2; + uint8_t rsp; + int len = 0; + int result = N_OK; + + wb[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + wb[1] = (uint8_t)(adr >> 8); + if (clockless == 1) + wb[1] |= (1 << 7); + wb[2] = (uint8_t)adr; + wb[3] = 0x00; + len = 5; + break; + case CMD_TERMINATE: /* termination */ + wb[1] = 0x00; + wb[2] = 0x00; + wb[3] = 0x00; + len = 5; + break; + case CMD_REPEAT: /* repeat */ + wb[1] = 0x00; + wb[2] = 0x00; + wb[3] = 0x00; + len = 5; + break; + case CMD_RESET: /* reset */ + wb[1] = 0xff; + wb[2] = 0xff; + wb[3] = 0xff; + len = 5; + break; + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + wb[4] = (uint8_t)(sz >> 8); + wb[5] = (uint8_t)(sz); + len = 7; + break; + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)adr; + wb[4] = (uint8_t)(sz >> 16); + wb[5] = (uint8_t)(sz >> 8); + wb[6] = (uint8_t)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + wb[1] = (uint8_t)(adr >> 8); + if (clockless == 1) + wb[1] |= (1 << 7); + wb[2] = (uint8_t)(adr); + wb[3] = b[3]; + wb[4] = b[2]; + wb[5] = b[1]; + wb[6] = b[0]; + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + wb[1] = (uint8_t)(adr >> 16); + wb[2] = (uint8_t)(adr >> 8); + wb[3] = (uint8_t)(adr); + wb[4] = b[3]; + wb[5] = b[2]; + wb[6] = b[1]; + wb[7] = b[0]; + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result != N_OK) { + return result; + } + + if (!gu8Crc_off) { + wb[len - 1] = (crc7(0x7f, (const uint8_t *)&wb[0], len - 1)) << 1; + } else { + len -= 1; + } + +#define NUM_SKIP_BYTES (1) +#define NUM_RSP_BYTES (2) +#define NUM_DATA_HDR_BYTES (1) +#define NUM_DATA_BYTES (4) +#define NUM_CRC_BYTES (2) +#define NUM_DUMMY_BYTES (3) + + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + len2 = len + (NUM_SKIP_BYTES + NUM_RSP_BYTES + NUM_DUMMY_BYTES); + } else if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) { + if (!gu8Crc_off) { + len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES + NUM_CRC_BYTES + NUM_DUMMY_BYTES); + } else { + len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES + NUM_DUMMY_BYTES); + } + } else { + len2 = len + (NUM_RSP_BYTES + NUM_DUMMY_BYTES); + } +#undef NUM_DUMMY_BYTES + + if (len2 > (sizeof(wb) / sizeof(wb[0]))) { + M2M_ERR("[nmi spi]: spi buffer size too small (%d) (%d)\n", len2, (sizeof(wb) / sizeof(wb[0]))); + result = N_FAIL; + return result; + } + /* zero spi write buffers. */ + for (wix = len; wix < len2; wix++) { + wb[wix] = 0; + } + rix = len; + + if (nmi_spi_rw(wb, rb, len2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + return result; + } + +#if 0 + { + int jj; + printk("--- cnd = %x, len=%d, len2=%d\n", cmd, len, len2); + for(jj=0; jj= len2) break; + if(((jj+1)%16) != 0) { + if((jj%16) == 0) { + printk("wb[%02x]: %02x ", jj, wb[jj]); + } else { + printk("%02x ", wb[jj]); + } + } else { + printk("%02x\n", wb[jj]); + } + } + printk("\n"); + + for(jj=0; jj= len2) break; + if(((jj+1)%16) != 0) { + if((jj%16) == 0) { + printk("rb[%02x]: %02x ", jj, rb[jj]); + } else { + printk("%02x ", rb[jj]); + } + } else { + printk("%02x\n", rb[jj]); + } + } + printk("\n"); + } +#endif + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) || (cmd == CMD_TERMINATE) || (cmd == CMD_REPEAT)) { + rix++; /* skip 1 byte */ + } + + rsp = rb[rix++]; + + if (rsp != cmd) { + M2M_ERR("[nmi spi]: Failed cmd response, cmd (%02x), resp (%02x)\n", cmd, rsp); + result = N_FAIL; + return result; + } + + /** + State response + **/ + rsp = rb[rix++]; + if (rsp != 0x00) { + M2M_ERR("[nmi spi]: Failed cmd state response state (%02x)\n", rsp); + result = N_FAIL; + return result; + } + + if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ) || (cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) { + int retry; + // uint16_t crc1, crc2; + uint8_t crc[2]; + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + /* ensure there is room in buffer later to read data and crc */ + if (rix < len2) { + rsp = rb[rix++]; + } else { + retry = 0; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Error, data read response (%02x)\n", rsp); + result = N_RESET; + return result; + } + + if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) { + /** + Read bytes + **/ + if ((rix + 3) < len2) { + b[0] = rb[rix++]; + b[1] = rb[rix++]; + b[2] = rb[rix++]; + b[3] = rb[rix++]; + } else { + M2M_ERR("[nmi spi]: buffer overrun when reading data.\n"); + result = N_FAIL; + return result; + } + + if (!gu8Crc_off) { + /** + Read Crc + **/ + if ((rix + 1) < len2) { + crc[0] = rb[rix++]; + crc[1] = rb[rix++]; + } else { + M2M_ERR("[nmi spi]: buffer overrun when reading crc.\n"); + result = N_FAIL; + return result; + } + } + } else if ((cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) { + int ix; + + /* some data may be read in response to dummy bytes. */ + for (ix = 0; (rix < len2) && (ix < sz);) { + b[ix++] = rb[rix++]; + } +#if 0 + if(ix) M2M_INFO("ttt %d %d\n", sz, ix); +#endif + sz -= ix; + + if (sz > 0) { + int nbytes; + + if (sz <= (DATA_PKT_SZ - ix)) { + nbytes = sz; + } else { + nbytes = DATA_PKT_SZ - ix; + } + + /** + Read bytes + **/ + if (nmi_spi_read(&b[ix], nbytes) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + goto _error_; + } + + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (nmi_spi_read(crc, 2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + goto _error_; + } + } + + ix += nbytes; + sz -= nbytes; + } + + /* if any data in left unread, then read the rest using normal DMA code.*/ + while (sz > 0) { + int nbytes; + + if (sz <= DATA_PKT_SZ) { + nbytes = sz; + } else { + nbytes = DATA_PKT_SZ; + } + + /** + read data response only on the next DMA cycles not + the first DMA since data response header is already + handled above for the first DMA. + **/ + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + if (nmi_spi_read(&rsp, 1) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + /** + Read bytes + **/ + if (nmi_spi_read(&b[ix], nbytes) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (nmi_spi_read(crc, 2) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } + } + } +_error_: + return result; +} +#endif +static sint8 spi_data_read(uint8 *b, uint16 sz, uint8 clockless) +{ + sint16 retry, ix, nbytes; + sint8 result = N_OK; + uint8 crc[2]; + uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Respnose header + **/ + retry = SPI_RESP_RETRY_COUNT; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + if (((rsp >> 4) & 0xf) == 0xf) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Failed data response read...(%02x)\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (M2M_SUCCESS != nmi_spi_read(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + if (!clockless) { + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_read(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static sint8 spi_data_write(uint8 *b, uint16 sz) +{ + sint16 ix; + uint16 nbytes; + sint8 result = 1; + uint8 cmd, order, crc[2] = {0}; + // uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } else { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + cmd |= order; + if (M2M_SUCCESS != nmi_spi_write(&cmd, 1)) { + M2M_ERR("[nmi spi]: Failed data block cmd write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (M2M_SUCCESS != nmi_spi_write(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_write(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc write, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } while (sz); + + return result; +} + +/******************************************** + + Spi Internal Read/Write Function + +********************************************/ + +/******************************************** + + Spi interfaces + +********************************************/ + +static sint8 spi_write_reg(uint32 addr, uint32 u32data) +{ + uint8 retry = SPI_RETRY_COUNT; + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_WRITE; + uint8 clockless = 0; + +_RETRY_: + if (addr <= 0x30) { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } else { + cmd = CMD_SINGLE_WRITE; + clockless = 0; + } + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, write reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + +#else + + result = spi_cmd_complete(cmd, addr, (uint8 *)&u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", addr); + goto _FAIL_; + } + +#endif +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %x\n", retry, addr, u32data); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 nm_spi_write(uint32 addr, uint8 *buf, uint16 size) +{ + sint8 result; + uint8 retry = SPI_RETRY_COUNT; + uint8 cmd = CMD_DMA_EXT_WRITE; + +_RETRY_: + /** + Command + **/ +#if defined USE_OLD_SPI_SW + // Workaround hardware problem with single byte transfers over SPI bus + if (size == 1) + size = 2; + + result = spi_cmd(cmd, addr, 0, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi ]: Failed cmd response, write block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, NULL, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", addr); + goto _FAIL_; + } +#endif + + /** + Data + **/ + result = spi_data_write(buf, size); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + goto _FAIL_; + } + /** + Data RESP + **/ + result = spi_data_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + goto _FAIL_; + } + +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %d\n", retry, addr, size); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 spi_read_reg(uint32 addr, uint32 *u32data) +{ + uint8 retry = SPI_RETRY_COUNT; + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_READ; + uint8 tmp[4]; + uint8 clockless = 0; + +_RETRY_: + + if (addr <= 0xff) { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } else { + cmd = CMD_SINGLE_READ; + clockless = 0; + } + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, 0, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read reg (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + /* to avoid endianess issues */ + result = spi_data_read(&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed data read...\n"); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, (uint8 *)&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", addr); + goto _FAIL_; + } + +#endif + + *u32data = tmp[0] | ((uint32)tmp[1] << 8) | ((uint32)tmp[2] << 16) | ((uint32)tmp[3] << 24); + +_FAIL_: + if (result != N_OK) { + + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x\n", retry, addr); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +static sint8 nm_spi_read(uint32 addr, uint8 *buf, uint16 size) +{ + uint8 cmd = CMD_DMA_EXT_READ; + sint8 result; + uint8 retry = SPI_RETRY_COUNT; +#if defined USE_OLD_SPI_SW + uint8 tmp[2]; + uint8 single_byte_workaround = 0; +#endif + +_RETRY_: + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + if (size == 1) { + // Workaround hardware problem with single byte transfers over SPI bus + size = 2; + single_byte_workaround = 1; + } + result = spi_cmd(cmd, addr, 0, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read block (%08x)...\n", (unsigned int)addr); + goto _FAIL_; + } + + /** + Data + **/ + if (single_byte_workaround) { + result = spi_data_read(tmp, size, 0); + buf[0] = tmp[0]; + } else + result = spi_data_read(buf, size, 0); + + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data read...\n"); + goto _FAIL_; + } +#else + result = spi_cmd_complete(cmd, addr, buf, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", addr); + goto _FAIL_; + } +#endif + +_FAIL_: + if (result != N_OK) { + nm_bsp_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + M2M_ERR("Reset and retry %d %x %d\n", retry, addr, size); + nm_bsp_sleep(1); + retry--; + if (retry) + goto _RETRY_; + } + + return result; +} + +/******************************************** + + Bus interfaces + +********************************************/ + +static void spi_init_pkt_sz(void) +{ + uint32 val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE + 0x24); + val32 &= ~(0x7 << 4); + switch (DATA_PKT_SZ) { + case 256: + val32 |= (0 << 4); + break; + case 512: + val32 |= (1 << 4); + break; + case 1024: + val32 |= (2 << 4); + break; + case 2048: + val32 |= (3 << 4); + break; + case 4096: + val32 |= (4 << 4); + break; + case 8192: + val32 |= (5 << 4); + break; + } + nm_spi_write_reg(SPI_BASE + 0x24, val32); +} + +sint8 nm_spi_reset(void) +{ + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_init + * @brief Initialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_init(void) +{ + uint32 chipid; + uint32 reg = 0; + + /** + configure protocol + **/ + gu8Crc_off = 0; + + // TODO: We can remove the CRC trials if there is a definite way to reset + // the SPI to it's initial value. + if (!spi_read_reg(NMI_SPI_PROTOCOL_CONFIG, ®)) { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nmi spi]: Failed internal read protocol with CRC on, retyring with CRC off...\n"); + if (!spi_read_reg(NMI_SPI_PROTOCOL_CONFIG, ®)) { + // Reaad failed with both CRC on and off, something went bad + M2M_ERR("[nmi spi]: Failed internal read protocol...\n"); + return 0; + } + } + if (gu8Crc_off == 0) { + reg &= ~0xc; /* disable crc checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + if (!spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg)) { + M2M_ERR("[nmi spi]: Failed internal write protocol reg...\n"); + return 0; + } + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (!spi_read_reg(0x1000, &chipid)) { + M2M_ERR("[nmi spi]: Fail cmd read chip id...\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nmi spi]: chipid (%08x)\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_init + * @brief DeInitialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Samer Sarhan + * @date 27 Feb 2015 + * @version 1.0 + */ +sint8 nm_spi_deinit(void) +{ + gu8Crc_off = 0; + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +uint32 nm_spi_read_reg(uint32 u32Addr) +{ + uint32 u32Val; + + spi_read_reg(u32Addr, &u32Val); + + return u32Val; +} + +/* + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + sint8 s8Ret; + + s8Ret = spi_read_reg(u32Addr, pu32RetVal); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val) +{ + sint8 s8Ret; + + s8Ret = spi_write_reg(u32Addr, u32Val); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + sint8 s8Ret; + + s8Ret = nm_spi_read(u32Addr, puBuf, u16Sz); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +/* + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author M. Abdelmawla + * @date 11 July 2012 + * @version 1.0 + */ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + sint8 s8Ret; + + s8Ret = nm_spi_write(u32Addr, puBuf, u16Sz); + + if (N_OK == s8Ret) + s8Ret = M2M_SUCCESS; + else + s8Ret = M2M_ERR_BUS_FAIL; + + return s8Ret; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.h new file mode 100644 index 0000000..36eb9a9 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmspi.h @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 SPI protocol bus APIs implementation. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "common/include/nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @fn nm_spi_init + * @brief Initialize the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_init(void); +/** + * @fn nm_spi_reset + * @brief reset the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_reset(void); + +/** + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_deinit(void); + +/** + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_spi_read_reg(uint32 u32Addr); + +/** + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMSPI_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.c b/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.c new file mode 100644 index 0000000..52b8961 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.c @@ -0,0 +1,471 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 UART protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_UART + +#include "driver/source/nmuart.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#define HDR_SZ 12 + +static uint8 get_cs(uint8 *b, uint8 sz) +{ + int i; + uint8 cs = 0; + for (i = 0; i < sz; i++) + cs ^= b[i]; + return cs; +} + +/* + * @fn nm_uart_sync_cmd + * @brief Check COM Port + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_sync_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = -1; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + uint8 onchip = 0; + + /*read reg*/ + b[0] = 0x12; + + rsz = 1; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0x5a) { + s8Ret = 0; + onchip = 1; + M2M_INFO("Built-in WINC1500 UART Found\n"); + } else if (b[0] == 0x5b) { + s8Ret = 0; + onchip = 0; + M2M_INFO("WINC1500 Serial Bridge Found\n"); + } + /*TODO: this should be the way we read the register since the cortus is little endian*/ + /**pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24);*/ + if (s8Ret == M2M_SUCCESS) + s8Ret = (sint8)onchip; + return s8Ret; +} +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + + /*read reg*/ + b[0] = 0xa5; + b[1] = 0; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + b[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + b[8] = (uint8)((u32Addr & 0xff000000) >> 24); + b[9] = 0; + b[10] = 0; + b[11] = 0; + b[12] = 0; + + b[2] = get_cs(&b[1], HDR_SZ); + + rsz = 4; + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + if (!nm_bus_get_chip_type()) { + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the command\n"); + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.u16Sz = rsz; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } else { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + /*TODO: this should be the way we read the register since the cortus is little endian*/ + /**pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24);*/ + + *pu32RetVal = ((uint32)b[0] << 24) | ((uint32)b[1] << 16) | ((uint32)b[2] << 8) | b[3]; + + return s8Ret; +} + +/* + * @fn nm_uart_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +uint32 nm_uart_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_uart_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* + * @fn nm_uart_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 1; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + b[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + b[8] = (uint8)((u32Addr & 0xff000000) >> 24); + b[9] = (uint8)(u32Val & 0x000000ff); + b[10] = (uint8)((u32Val & 0x0000ff00) >> 8); + b[11] = (uint8)((u32Val & 0x00ff0000) >> 16); + b[12] = (uint8)((u32Val & 0xff000000) >> 24); + + b[2] = get_cs(&b[1], HDR_SZ); + + get_cs(&b[1], HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the reg write command\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** + * @fn nm_uart_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 au8Buf[HDR_SZ + 1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 2; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00) >> 8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000) >> 24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1], HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the block read command\n"); + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + M2M_ERR("write error (Error sending the block read command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** + * @fn nm_uart_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Dina El Sissy + * @date 13 AUG 2012 + * @version 1.0 + */ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + static uint8 au8Buf[HDR_SZ + 1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 3; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00) >> 8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00) >> 8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000) >> 16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000) >> 24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1], HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the block Write command\n"); + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + // check for the ack from the SAMD21 for the payload reception. + strUart.pu8Buf = au8Buf; + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (au8Buf[0] == 0xAC) { + M2M_DBG("Successfully sent the data payload\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } else { + M2M_ERR("write error (Error sending the block write command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } else { + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + return s8Ret; +} + +/** + * @fn nm_uart_reconfigure + * @brief Reconfigures the UART interface + * @param [in] ptr + * Pointer to a DWORD containing baudrate at this moment. + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @author Viswanathan Murugesan + * @date 22 OCT 2014 + * @version 1.0 + */ +sint8 nm_uart_reconfigure(void *ptr) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 5; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + b[8] = 0; + b[9] = (uint8)((*(unsigned long *)ptr) & 0x000000ff); + b[10] = (uint8)(((*(unsigned long *)ptr) & 0x0000ff00) >> 8); + b[11] = (uint8)(((*(unsigned long *)ptr) & 0x00ff0000) >> 16); + b[12] = (uint8)(((*(unsigned long *)ptr) & 0xff000000) >> 24); + + b[2] = get_cs(&b[1], HDR_SZ); + + get_cs(&b[1], HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } else { + if (!nm_bus_get_chip_type()) { + // check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) { + s8Ret = M2M_ERR_BUS_FAIL; + } + if (b[0] == 0xAC) { + M2M_DBG("Successfully sent the UART reconfigure command\n"); + } else { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} +#endif +/* EOF */ diff --git a/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.h b/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.h new file mode 100644 index 0000000..0bb1c36 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/driver/source/nmuart.h @@ -0,0 +1,118 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 UART protocol bus APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef _NMUART_H_ +#define _NMUART_H_ + +#include "common/include/nm_common.h" + +/* + * @fn nm_uart_sync_cmd + * @brief Check COM Port + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_sync_cmd(void); +/** + * @fn nm_uart_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32 nm_uart_read_reg(uint32 u32Addr); + +/** + * @fn nm_uart_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32 *pu32RetVal); + +/** + * @fn nm_uart_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val); + +/** + * @fn nm_uart_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_uart_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** + * @fn nm_uart_reconfigure + * @brief Reconfigures the UART interface + * @param [in] ptr + * Pointer to a DWORD containing baudrate at this moment. + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_uart_reconfigure(void *ptr); +#endif /* _NMI2C_H_ */ diff --git a/ChaloupeLora.X/Source/winc1500/programmer/programmer.h b/ChaloupeLora.X/Source/winc1500/programmer/programmer.h new file mode 100644 index 0000000..c788cdc --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/programmer/programmer.h @@ -0,0 +1,71 @@ +/** + * + * \file + * + * \brief WINC Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef __PROGRAMMER_H__ +#define __PROGRAMMER_H__ + +/** + * Include + */ +#include "spi_flash/include/spi_flash_map.h" +#include "spi_flash/include/spi_flash.h" + +#define ROOT_CERT_SIZE M2M_TLS_ROOTCER_FLASH_SIZE + +#define programmer_get_flash_size() (((spi_flash_get_size() * 1024) / 8) * 1024) +#define programmer_write(pu8Buf, u32Offset, u32Sz) spi_flash_write(pu8Buf, u32Offset, u32Sz) +#define programmer_erase(u32Offset, u32Sz) spi_flash_erase(u32Offset, u32Sz) +#define programmer_eraseall() programmer_erase(0, programmer_get_flash_size()) +#define programmer_read(pu8Buf, u32Offset, u32Sz) spi_flash_read(pu8Buf, u32Offset, u32Sz) + +#define programmer_write_root_cert(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) +#define programmer_read_root_cert(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) +#define programmer_erase_root_cert() programmer_erase(M2M_TLS_ROOTCER_FLASH_OFFSET, M2M_TLS_ROOTCER_FLASH_SIZE) + +#define programmer_write_tls_cert_store(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) +#define programmer_read_tls_cert_store(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) +#define programmer_erase_tls_cert_store() programmer_erase(M2M_TLS_SERVER_FLASH_OFFSET, M2M_TLS_SERVER_FLASH_SIZE) + +#endif /* __PROGRAMMER_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/programmer/programmer_apis.h b/ChaloupeLora.X/Source/winc1500/programmer/programmer_apis.h new file mode 100644 index 0000000..72b8b44 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/programmer/programmer_apis.h @@ -0,0 +1,65 @@ +/** + * + * \file + * + * \brief Programmer APIs. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef FIRMWARE_PROGRAMMER_APIS_H_INCLUDED +#define FIRMWARE_PROGRAMMER_APIS_H_INCLUDED + +/** + * Include + */ +#include "common/include/nm_common.h" +#include "programmer/programmer.h" +#include "spi_flash/include/spi_flash_map.h" + +#define programmer_write_cert_image(buff) \ + programmer_write((uint8 *)buff, M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define programmer_read_cert_image(buff) \ + programmer_read((uint8 *)buff, M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define programmer_erase_cert_image() \ + programmer_erase(M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET, M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) + +#define programmer_write_firmware_image(buff, offSet, sz) programmer_write((uint8 *)buff, offSet, sz) +#define programmer_read_firmware_image(buff, offSet, sz) programmer_read((uint8 *)buff, offSet, sz) +//#define programmer_erase_firmware_image() programmer_eraseall() + +#define programmer_erase_all() programmer_erase(0, programmer_get_flash_size()) + +#endif /* __FIRMWARE_PROGRAMMER_APIS__ */ diff --git a/ChaloupeLora.X/Source/winc1500/socket/include/m2m_socket_host_if.h b/ChaloupeLora.X/Source/winc1500/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..4e0bfdb --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/socket/include/m2m_socket_host_if.h @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2014 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "socket/include/socket.h" +#else +#include "m2m_types.h" +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/socket.h + * The two definitions must match. + */ +#ifdef _FIRMWARE_ +#define HOSTNAME_MAX_SIZE (64) +#endif + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invlaid Socket command value. +*/ + +#define SOCKET_CMD_BIND 0x41 +/*!< + Socket Binding command value. +*/ + +#define SOCKET_CMD_LISTEN 0x42 +/*!< + Socket Listening command value. +*/ + +#define SOCKET_CMD_ACCEPT 0x43 +/*!< + Socket Accepting command value. +*/ + +#define SOCKET_CMD_CONNECT 0x44 +/*!< + Socket Connecting command value. +*/ + +#define SOCKET_CMD_SEND 0x45 +/*!< + Socket send command value. +*/ + +#define SOCKET_CMD_RECV 0x46 +/*!< + Socket Recieve command value. +*/ + +#define SOCKET_CMD_SENDTO 0x47 +/*!< + Socket sendTo command value. +*/ + +#define SOCKET_CMD_RECVFROM 0x48 +/*!< + Socket RecieveFrom command value. +*/ + +#define SOCKET_CMD_CLOSE 0x49 +/*!< + Socket Close command value. +*/ + +#define SOCKET_CMD_DNS_RESOLVE 0x4A +/*!< + Socket DNS Resolve command value. +*/ + +#define SOCKET_CMD_SSL_CONNECT 0x4B +/*!< + SSL-Socket Connect command value. +*/ + +#define SOCKET_CMD_SSL_SEND 0x4C +/*!< + SSL-Socket Send command value. +*/ + +#define SOCKET_CMD_SSL_RECV 0x4D +/*!< + SSL-Socket Recieve command value. +*/ + +#define SOCKET_CMD_SSL_CLOSE 0x4E +/*!< + SSL-Socket Close command value. +*/ + +#define SOCKET_CMD_SET_SOCKET_OPTION 0x4F +/*!< + Set Socket Option command value. +*/ + +#define SOCKET_CMD_SSL_CREATE 0x50 +/*!< + */ + +#define SOCKET_CMD_SSL_SET_SOCK_OPT 0x51 +/*!< + */ + +#define SOCKET_CMD_PING 0x52 +/*!< + */ + +#define SOCKET_CMD_SSL_SET_CS_LIST 0x53 +/*!< + Recommend instead using @ref M2M_SSL_REQ_SET_CS_LIST and + associated response @ref M2M_SSL_RESP_SET_CS_LIST +*/ + +#define SOCKET_CMD_SSL_BIND 0x54 +/*!< + */ + +#define SOCKET_CMD_SSL_EXP_CHECK 0x55 +/*!< + */ + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + * @brief + */ +typedef struct { + uint16 u16Family; + uint16 u16Port; + uint32 u32IPAddr; +} tstrSockAddr; + +//typedef sint8 SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct { + char acHostName[HOSTNAME_MAX_SIZE]; + uint32 u32HostIP; +} tstrDnsReply; + +/*! +@brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrBindCmd; + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +} tstrBindReply; + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8BackLog; + uint16 u16SessionID; +} tstrListenCmd; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct { + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +} tstrListenReply; + +/*! + * @brief + */ +typedef struct { + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +} tstrAcceptReply; + +/*! + * @brief + */ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8SslFlags; + uint16 u16SessionID; +} tstrConnectCmd; + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct { + SOCKET sock; + sint8 s8Error; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +} tstrConnectReply; + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + uint8 u8Void; + uint16 u16DataSize; + tstrSockAddr strAddr; + uint16 u16SessionID; + uint16 u16Void; +} tstrSendCmd; + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct { + SOCKET sock; + uint8 u8Void; + sint16 s16SentBytes; + uint16 u16SessionID; + uint16 u16Void; +} tstrSendReply; + +/*! + * @brief + */ +typedef struct { + uint32 u32Timeoutmsec; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrRecvCmd; + +/*! +@struct +@brief +*/ +typedef struct { + tstrSockAddr strRemoteAddr; + sint16 s16RecvStatus; + uint16 u16DataOffset; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +} tstrRecvReply; + +/*! + * @brief + */ +typedef struct { + uint32 u32OptionValue; + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; +} tstrSetSocketOptCmd; + +typedef struct { + SOCKET sslSock; + uint8 __PAD24__[3]; +} tstrSSLSocketCreateCmd; + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; + uint32 u32OptLen; + uint8 au8OptVal[SSL_MAX_OPT_LEN]; +} tstrSSLSetSockOptCmd; + +/*! + */ +typedef struct { + uint32 u32DestIPAddr; + uint32 u32CmdPrivate; + uint16 u16PingCount; + uint8 u8TTL; + uint8 __PAD8__; +} tstrPingCmd; + +typedef struct { + uint32 u32IPAddr; + uint32 u32CmdPrivate; + uint32 u32RTT; + uint16 u16Success; + uint16 u16Fail; + uint8 u8ErrorCode; + uint8 __PAD24__[3]; +} tstrPingReply; + +/*! +@struct\ + tstrSslCertExpSettings + +@brief SSL Certificate Expiry Validation Settings + +@sa tenuSslCertExpSettings +*/ +typedef struct { + uint32 u32CertExpValidationOpt; + /*!< + See @tenuSslCertExpSettings for possible values. + */ +} tstrSslCertExpSettings; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/socket/include/socket.h b/ChaloupeLora.X/Source/winc1500/socket/include/socket.h new file mode 100644 index 0000000..7c31e7f --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/socket/include/socket.h @@ -0,0 +1,1987 @@ +/** + * + * \file + * + * \brief WINC BSD compatible Socket Interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \defgroup SocketHeader Socket + * BSD compatible socket interface beftween the host layer and the network + * protocol stacks in the firmware. + * These functions are used by the host application to send or receive + * packets and to do other socket operations. + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** + * @defgroup SocketDefines Defines + * @ingroup SocketHeader + */ + +/** @defgroup IPDefines TCP/IP Defines + * @ingroup SocketDefines + * The following list of macros are used to define constants used throughout the socket layer. + * @{ + */ + +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/m2m_socket_host_if.h + * The two definitions must match. + */ +#define HOSTNAME_MAX_SIZE 64 +/*!< + Maximum allowed size for a host domain name passed to the function gethostbyname @ref gethostbyname. + command value. Used with the setsockopt function. + +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in + structure. (It is the only supported type for the current implementation.) +*/ + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag shall be passed to the socket API for SSL session. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks. + Used with the @ref setsockopt function. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value (to join a multicast group). + Used with the @ref setsockopt function. +*/ + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value (to leave a multicast group). + Used with the @ref setsockopt function. +*/ +//@} + +/** + * @defgroup TLSDefines TLS Defines + * @ingroup SocketDefines + */ + +/** @defgroup SSLSocketOptions TLS Socket Options + * @ingroup TLSDefines + * The following list of macros are used to define SSL Socket options. + * @{ + * @sa setsockopt + */ + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate + verification process. + It is highly required NOT to use this socket option in production + software applications. It is supported for debugging and testing + purposes. + The option value should be casted to int type and it is handled + as a boolean flag. +*/ + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The + SNI is a NULL terminated string containing the server name + associated with the connection. It must not exceed the size + of HOSTNAME_MAX_SIZE. +*/ + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + This option allow the TLS to cache the session information for fast + TLS session establishment in future connections using the + TLS Protocol session resume features. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Enable SNI validation against the server's certificate subject + common name. If there is no SNI provided (via the SO_SSL_SNI + option), setting this option does nothing. +*/ + +//@} + +/** @defgroup LegacySSLCipherSuite Legacy names for TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros MUST NOT be used. Instead use the new names under SSLCipherSuiteID + * @sa sslSetActiveCipherSuites + * @{ + */ + +#define SSL_ENABLE_RSA_SHA_SUITES 0x01 +/*!< + Enable RSA Hmac_SHA based Cipher suites. For example, + TLS_RSA_WITH_AES_128_CBC_SHA +*/ + +#define SSL_ENABLE_RSA_SHA256_SUITES 0x02 +/*!< + Enable RSA Hmac_SHA256 based Cipher suites. For example, + TLS_RSA_WITH_AES_128_CBC_SHA256 +*/ + +#define SSL_ENABLE_DHE_SHA_SUITES 0x04 +/*!< + Enable DHE Hmac_SHA based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_CBC_SHA +*/ + +#define SSL_ENABLE_DHE_SHA256_SUITES 0x08 +/*!< + Enable DHE Hmac_SHA256 based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 +*/ + +#define SSL_ENABLE_RSA_GCM_SUITES 0x10 +/*!< + Enable RSA AEAD based Cipher suites. For example, + TLS_RSA_WITH_AES_128_GCM_SHA256 +*/ + +#define SSL_ENABLE_DHE_GCM_SUITES 0x20 +/*!< + Enable DHE AEAD based Cipher suites. For example, + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 +*/ + +#define SSL_ENABLE_ALL_SUITES 0x0000003F +/*!< + Enable all possible supported cipher suites. +*/ + +//@} + +/** @defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + +#define SSL_ECC_ONLY_CIPHERS \ + (SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) +/*!< + All ciphers that use ECC crypto only. This execuldes ciphers that use RSA. They use ECDSA instead. + These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ +#define SSL_ECC_ALL_CIPHERS \ + (SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) +/*!< + All supported ECC Ciphers including those ciphers that depend on RSA and ECC. + These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ + +#define SSL_NON_ECC_CIPHERS_AES_128 \ + (SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256) +/*!< + All supported AES-128 Ciphers (ECC ciphers are not counted). This is the default active group after startup. +*/ + +#define SSL_ECC_CIPHERS_AES_256 (SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA) +/*!< + ECC AES-256 supported ciphers. +*/ + +#define SSL_NON_ECC_CIPHERS_AES_256 \ + (SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256) +/*!< + AES-256 Ciphers. + This group is disabled by default at startup because the WINC1500 HW Accelerator + supports only AES-128. If the application needs to force AES-256 cipher support, + it could enable them (or any of them) explicitly by calling sslSetActiveCipherSuites. +*/ + +#define SSL_CIPHER_ALL \ + (SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 \ + | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 \ + | SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 | SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA) +/*!< + Turn On All TLS Ciphers. +*/ + +//@} + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SocketHeader + * The following list of macros are used to define the possible error codes returned as a result of a call to a socket + * function. Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation +*/ + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a specific + address For example: bind is called without specifying a port number +*/ + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. With socket operations, only one IP address per socket is + permitted. Any attempt for a new socket to bind with an IP address already bound to another open socket, will return + the following error code. States that bind operation failed. +*/ + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through + TCP_SOCK_MAX. It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation + failed. +*/ + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through + UDP_SOCK_MAX. It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation + failed +*/ + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a function. +*/ + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies Identifies that @ref listen operation failed. +*/ + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the + current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be + completed. It is generated as an error to the @ref sendto function when the address required to send the data to is + not known. +*/ + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed by the peer. The local socket is + closed also. +*/ + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has Timedout. +*/ + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ + +#ifdef _NM_BSP_BIG_END + +#define _htonl(m) (m) +#define _htons(A) (A) + +#else + +#define _htonl(m) \ + (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) \ + | ((uint32)(((uint32)m) >> 24))) +/*!< + Convert a 4-byte integer from the host representation to the Network byte order representation. +*/ + +#define _htons(A) (uint16)((((uint16)(A)) << 8) | (((uint16)(A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from the host representation to the Network byte order representation. +*/ + +#endif + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from the Network byte order representation to the host representation . +*/ + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from the Network byte order representation to the host representation . +*/ +//@} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** @defgroup SocketEnums DataTypes + * @ingroup SocketHeader + * Specific Enumeration-typedefs used for socket operations + * @{ */ + +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + Such an ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef sint8 SOCKET; + +/*! +@struct \ + in_addr + +@brief + IPv4 address representation. + + This structure is used as a placeholder for IPV4 address in other structures. +@see + sockaddr_in +*/ +typedef struct { + uint32 s_addr; + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ +} in_addr; + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see + sockaddr_in +*/ +struct sockaddr { + uint16 sa_family; + /*!< +Socket address family. + */ + uint8 sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + sockaddr_in + +@brief + Socket address structure for IPV4 addresses. Used to specify socket address information to which to connect to. + Can be cast to @ref sockaddr structure. +*/ +struct sockaddr_in { + uint16 sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16 sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + It must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. non zero otherwise. + */ + uint8 sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; +//@} +/**@defgroup AsyncCalback Asynchronous Events + * @ingroup SocketEnums + * Specific Enumeration used for asynchronous operations + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs, make use of callback functions, in-order to return back the results once the corresponding socket +operation is completed. Hence resuming the normal execution of the application code while the socket operation returns +the results. Callback functions expect event messages to be passed in, in-order to identify the operation they're +returning the results for. The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback +functions. A function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket +operation. + +@see + bind + listen + accept + connect + send + recv + +*/ +typedef enum { + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + sendto socket event. + */ + SOCKET_MSG_RECVFROM + /*!< + Recvfrom socket event. + */ +} tenuSocketCallbackMsgType; + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind + +*/ +typedef struct { + sint8 status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketBindMsg; + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen +function. This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback +function. +@see + listen +*/ +typedef struct { + sint8 status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketListenMsg; + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept +function. This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback +function. +*/ +typedef struct { + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with + the remote peer. Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +} tstrSocketAcceptMsg; + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to the asynchronous call to the @ref +connect socket function. This structure together with the event @ref SOCKET_MSG_CONNECT are passed-in parameters to the +callback function. +*/ +typedef struct { + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the connect function call. + */ + sint8 s8Error; + /*!< + Connect error code. + Holding a value of ZERO for a successful connect or otherwise a negative + error code corresponding to the type of error. + */ +} tstrSocketConnectMsg; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the recv or +recvfrom socket functions. This structure together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM are +passed-in parameters to the callback function. +@remark + In case the received data from the remote peer is larger than the USER buffer size defined during the asynchronous +call to the @ref recv function, the data is delivered to the user in a number of consecutive chunks according to the +USER Buffer size. a negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted + @SOCK_ERR_TIMEOUT : Socket receive timed out +*/ +typedef struct { + uint8 *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + sint16 s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16 u16RemainingSize; + /*!< + The number of bytes remaining in the current @ref recv operation. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +} tstrSocketRecvMsg; + +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application +callback through this function by calling @ref registerSocketCallback. In response to events received, the following +callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref +connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is recived in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb)(SOCKET sock, uint8 u8Msg, void *pvMsg); + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref +registerSocketCallback. The following callback is triggered in response to asynchronous call to the @ref gethostbyname +function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in NW byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb)(uint8 *pu8DomainName, uint32 u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32 u32IPAddr, uint32 u32RTT, uint8 u8ErrorCode); + +/**@}*/ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SocketAPI Function + * @ingroup SocketHeader + */ + +/** @defgroup SocketInitalizationFn socketInit + * @ingroup SocketAPI + * The function performs the necessary initializations for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent reseting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + + */ +/**@{*/ +/*! +@fn \ + NMI_API void socketInit(void); + +@param [in] void + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based in the maximum +number of sockets @ref MAX_SOCKET based on the systems capability. \section Example This example demonstrates the use of +the socketinit for socket initialization for an mqtt chat application. \code tstrWifiInitParam param; int8_t ret; char +topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + m2m_wifi_connect((char *)MAIN_WLAN_SSID, sizeof(MAIN_WLAN_SSID), + MAIN_WLAN_AUTH, (char *)MAIN_WLAN_PSK, M2M_WIFI_CH_ALL); + +\endcode +*/ +NMI_API void socketInit(void); + +/*! +@fn \ + NMI_API void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked as the last any socket operation is performed on any active sockets. +*/ +NMI_API void socketDeinit(void); + +/** @} */ +/** @defgroup SocketCallbackFn registerSocketCallback + * @ingroup SocketAPI + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering + function. The registered callback functions are used to retrieve information in response to the asynchronous socket + functions called. + */ +/**@{*/ + +/*! +@fn \ + NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + +@param [in] tpfAppSocketCb + Assignment of callback function to the global callback @ref tpfAppSocketCb +gpfAppSocketCb. Delivers socket messages to the host application. In response to the asynchronous function calls, such +as @ref bind + @ref listen @ref accept @ref connect + +@param [in] tpfAppResolveCb + Assignment of callback function to the global callback @ref tpfAppResolveCb +gpfAppResolveCb. Used for DNS resolving functionalities. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when, DNS resolution is not required. + +@return void +@remarks + If any of the socket functionalities is not to be used, NULL is passed in as a parameter. + It must be invoked after socketinit and before other socket layer operations. + +\section Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS +resolution CB set to null for a simple UDP server example. \code tstrWifiInitParam param; int8_t ret; struct sockaddr_in +addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + m2m_wifi_connect((char *)MAIN_WLAN_SSID, sizeof(MAIN_WLAN_SSID), MAIN_WLAN_AUTH, (char *)MAIN_WLAN_PSK, +M2M_WIFI_CH_ALL); \endcode +*/ +NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + +/** @} */ + +/** @defgroup SocketFn socket + * @ingroup SocketAPI + * Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and + * their possible types are either TCP or a UDP sockets. The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX + * sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + * + */ +/**@{*/ +/*! +@fn \ + NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + +@param [in] u8Flags + Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets. + It could be @ref SOCKET_FLAGS_SSL if the socket is used for SSL session. The use of the flag + @ref SOCKET_FLAGS_SSL has no meaning in case of UDP sockets. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket +handler. before any call to the socket function can be made. + +@see + connect + bind + listen + accept + recv + recvfrom + send + sendto + close + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of +available sockets. + +@remarks + The socket function must be called a priori to any other related socket functions "e.g. send, recv, close +..etc" \section Example This example demonstrates the use of the socket function to allocate the socket, returning the +socket handler to be used for other socket operations. Socket creation is dependent on the socket type. \subsection sub1 +UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0)); +@endcode +\subsection sub3 SSL example +@code +static SOCKET ssl_socket = -1; + +ssl_socket = socket(AF_INET, SOCK_STREAM, SOCK_FLAGS_SSL)); +@endcode +*/ +NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + +/** @} */ +/** @defgroup BindFn bind + * @ingroup SocketAPI + * Asynchronous bind function associates the provided address and local port to the socket. + * The function can be used with both TCP and UDP sockets it's mandatory to call the @ref bind function before + *starting any UDP or TCP server operation. Upon socket bind completion, the application will receive a @ref + *SOCKET_MSG_BIND message in the socket callback. + */ +/**@{*/ +/*! +\fn \ + NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see + socket + connect + listen + accept + recv + recvfrom + send + sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(1234); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret != 0) + { + printf("Bind Failed. Error code = %d\n",ret); + close(udpServerSocket); + } + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +/** @} */ + +/** @defgroup ListenFn listen + * @ingroup SocketAPI + * After successful socket binding to an IP address and port on the system, start listening on a passive socket for + incoming connections. The socket must be bound on a local port or the listen operation fails. Upon the call to the + asynchronous listen function, response is received through the event [SOCKET_MSG_BIND](@ref SOCKET_MSG_BIND) in the + socket callback. A successful listen means the TCP server operation is active. If a connection is accepted, then the + application socket callback function is notified with the new connected socket through the event @ref + SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function after calling @ref listen. + + After a connection is accepted, the user is then required to call the @ref recv to receive any packets transmitted + by the remote host or to receive notification of socket connection termination. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 listen(SOCKET sock, uint8 backlog); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see + bind + accept + recv + recvfrom + send + sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8 u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +NMI_API sint8 listen(SOCKET sock, uint8 backlog); +/** @} */ +/** @defgroup AcceptFn accept + * @ingroup SocketAPI + * The function has no current implementation. An empty deceleration is used to prevent errors when legacy application + *code is used. For recent application use, the accept function can be safer as it has no effect and could be safely + *removed from any application using it. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); +/** @} */ +/** @defgroup ConnectFn connect + * @ingroup SocketAPI + * Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of a successful new socket connection through the event @ref + SOCKET_MSG_CONNECT. A successful connect means the TCP session is active. The application is then required to make a + call to the @ref recv to receive any packets transmitted by the remote server, unless the application is interrupted by + a notification of socket connection termination. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pstrAddr + Address of the remote server. +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through +the main function and how the callback function handles the @ref SOCKET_MSG_CONNECT event. \subsection sub1 Main +Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,0); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub2 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8 acBuffer[GROWL_MSG_SIZE]; + uint16 u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + close(pstrNotification->Socket); + } + } +@endcode +*/ +NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/** @} */ +/** @defgroup ReceiveFn recv + * @ingroup SocketAPI + * An asynchronous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the + two socket events [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the + socket is already connected to a remote host. The application receives the required data in response to this + asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - SOCK_ERR_NO_ERROR : Socket connection closed + - SOCK_ERR_CONN_ABORTED : Socket connection aborted + - SOCK_ERR_TIMEOUT : Socket receive timed out + The application code is expected to close the socket through the call to the @ref close function upon the appearance + of the above mentioned errors. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see + socket + connect + bind + listen + recvfrom + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Recieve buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification +of the accept or connect events, and the parsing of the received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + close(sock); + } + } + break; + + default: + break; + } +} +@endcode +*/ +NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/** @} */ +/** @defgroup ReceiveFromSocketFn recvfrom + * @ingroup SocketAPI + * Receives data from a UDP Socket. + * + * The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + * a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + * with successful status in the socket callback). + * + * Upon calling the recvfrom function with a successful return code, the application is expected to receive a + *notification in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + * + * Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + * Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error + *@SOCK_ERR_TIMEOUT: + * + * The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + * using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a UDP socket before passing the socket ID to the recvfrom function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref +bind function. + +@see + socket + bind + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon +notification of a successful bind event, and the parsing of the received data when the SOCKET_MSG_RECVFROM event is +received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16 u16port = pstrRx->strRemoteAddr.sin_port; + uint32 strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Recieved frame with size = %d.\tHost address=%x, Port number = +%d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + ret = close(sock); + } + } + break; + + default: + break; + } +} +@endcode +*/ +NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/** @} */ +/** @defgroup SendFn send + * @ingroup SocketAPI +* Asynchronous sending function, used to send data on a TCP/UDP socket. + +* Called by the application code when there is outgoing data available required to be sent on a specific socket +handler. +* The only difference between this function and the similar @ref sendto function, is the type of socket the data is +sent on and the parameters passed in. +* @ref send function is most commonly called for sockets in a connected state. +* After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to +receive an event of type +* @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument +is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the +data). Hence this function is expected to be called after a successful socket connect operation(in client case or accept +in the the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order +to send outgoing data using the @ref send function, at least one successful call must be made to the @ref sendto +function a priori the consecutive calls to the @ref send function, to ensure that the destination address is saved in +the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifier through the a prior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the +error) otherwise. +*/ +NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); +/** @} */ +/** @defgroup SendToSocketFn sendto + * @ingroup SocketAPI + * Asynchronous sending function, used to send data on a UDP socket. + * Called by the application code when there is data required to be sent on a UDP socket handler. + * The application code is expected to receive data from a successful bounded socket node. + * The only difference between this function and the similar @ref send function, is the type of socket the data is + * received on. This function works only with UDP sockets. After the data is sent, the socket callback function + * registered using registerSocketCallback(), is expected to receive an event of type + * @ref SOCKET_MSG_SENDTO. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr +*pstrDestAddr, uint8 u8AddrLen); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument +is passed in. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + +@param [in] flags + Not used in the current implementation + +@param [in] pstrDestAddr + The destination address. + +@param [in] u8AddrLen + Destination address length in bytes. + Not used in the current implementation, only included for BSD compatibility. +@pre + Sockets must be initialized using socketInit. + +@see + socketInit + recvfrom + sendto + socket + connect + accept + send + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket (returned from socket ). + A valid buffer pointer must be used (not NULL). \n + Successful completion of a call to sendto() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) +otherwise. +*/ +NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, + struct sockaddr *pstrDestAddr, uint8 u8AddrLen); +/** @} */ +/** @defgroup CloseSocketFn close + * @ingroup SocketAPI + * Synchronous close function, releases all the socket assigned resources. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 close(SOCKET sock); + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid +argument is passed in. + +@pre + Sockets must be initialized through the call of the socketInit function. + @ref close is called only for valid socket identifiers created through the @ref socket function. + +@warning + If @ref close is called while there are still pending messages (sent or received ) they will be discarded. + +@see + socketInit + socket + +@return + The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) +otherwise. +*/ +NMI_API sint8 close(SOCKET sock); + +/** @} */ +/** @defgroup InetAddressFn nmi_inet_addr + * @ingroup SocketAPI + * Synchronous function which returns a BSD socket compliant Internet Protocol (IPv4) socket address. + * This IPv4 address in the input string parameter could either be specified as a host name, or as a numeric string + * representation like n.n.n.n known as the IPv4 dotted-decimal format (i.e. "192.168.10.1"). This function is used + * whenever an ip address needs to be set in the proper format (i.e. for the @ref tstrM2MIPConfig structure). + */ +/**@{*/ +/*! +@fn \ + NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + +@param [in] pcIpAddr + A null terminated string containing the IP address in IPv4 dotted-decimal address. + +@return + Unsigned 32-bit integer representing the IP address in Network byte order + (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + +*/ +NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + +/** @} */ +/** @defgroup gethostbynameFn gethostbyname + * @ingroup SocketAPI + * Asynchronous DNS resolving function. This function use DNS to resolve a domain name into the corresponding IP + * address. A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS + * callback function registered using registerSocketCallback() + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 gethostbyname(uint8 * pcHostName); + +@param [in] pcHostName + NULL terminated string containing the domain name for the remote host. + Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + +@see + registerSocketCallback + +@warning + Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + a negative return value indicates only locally-detected errors + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint8 gethostbyname(uint8 *pcHostName); + +/** @} */ +/** @defgroup sslEnableCertExpirationCheckFn sslEnableCertExpirationCheck + * @ingroup SocketAPI + * Configure the behavior of the SSL Library for Certificate Expiry Validation. + */ +/**@{*/ +/*! +@fn \ +NMI_API sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting); + +@param [in] enuValidationSetting + See @ref tenuSslCertExpSettings for details. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) for successful operation and negative error code otherwise. + +@sa tenuSslCertExpSettings +*/ +NMI_API sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting); + +/** @} */ + +/** @defgroup SetSocketOptionFn setsockopt + * @ingroup SocketAPI + *The setsockopt() function shall set the option specified by the option_name + * argument, at the protocol level specified by the level argument, to the value + * pointed to by the option_value argument for the socket specified by the socket argument. + * + *

Possible protocol level values supported are @ref SOL_SOCKET and @ref SOL_SSL_SOCKET. + * Possible options when the protocol level is @ref SOL_SOCKET :

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
@ref SO_SET_UDP_SEND_CALLBACKEnable/Disable callback messages for sendto(). + * Since UDP is unreliable by default the user maybe interested (or not) in + * receiving a message of @ref SOCKET_MSG_SENDTO for each call of sendto(). + * Enabled if option value equals @ref TRUE, disabled otherwise.
@ref IP_ADD_MEMBERSHIPValid for UDP sockets. This option is used to receive frames sent to + * a multicast group. option_value shall be a pointer to Unsigned 32-bit + * integer containing the multicast IPv4 address.
@ref IP_DROP_MEMBERSHIPValid for UDP sockets. This option is used to stop receiving frames + * sent to a multicast group. option_value shall be a pointer to Unsigned + * 32-bit integer containing the multicast IPv4 address.
+ *

Possible options when the protcol leve  is @ref SOL_SSL_SOCKET

+ * + * + * + * + * + * + * + * + * + * + * + * + * + *
+ * @ref SO_SSL_BYPASS_X509_VERIFAllow an opened SSL socket to bypass the X509 + * certificate verification process. It is highly recommended NOT to use + * this socket option in production software applications. The option is + * supported for debugging and testing purposes. The option value should be + * casted to int type and it is handled as a boolean flag.
@ref SO_SSL_SNISet the Server Name Indicator (SNI) for an SSL socket. The SNI is a + * null terminated string containing the server name associated with the + * connection. It must not exceed the size of @ref HOSTNAME_MAX_SIZE.
@ref SO_SSL_ENABLE_SESSION_CACHINGThis option allow the TLS to cache the session information for fast + * TLS session establishment in future connections using the TLS Protocol + * session resume features.
+ */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); + +@param [in] sock + Socket handler. + +@param [in] level + protocol level. See description above. + +@param [in] option_name + option to be set. See description above. + +@param [in] option_value + pointer to user provided value. + +@param [in] option_len + length of the option value in bytes. +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +@sa SOL_SOCKET, SOL_SSL_SOCKET, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP +*/ +NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, const void *option_value, + uint16 u16OptionLen); + +/** @} */ +/** @defgroup GetSocketOptionsFn getsockopt + * @ingroup SocketAPI + * Get socket options retrieves + * This Function isn't implemented yet but this is the form that will be released later. + */ +/**@{*/ +/*! +@fn \ + sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 * pu8OptLen); + +@brief + +@param [in] sock + Socket Identifie. +@param [in] u8Level + The protocol level of the option. +@param [in] u8OptName + The u8OptName argument specifies a single option to get. +@param [out] pvOptValue + The pvOptValue argument contains pointer to a buffer containing the option value. +@param [out] pu8OptLen + Option value buffer length. +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 *pu8OptLen); +/** @} */ + +/**@}*/ +/** @defgroup PingFn m2m_ping_req + * @ingroup SocketAPI + * The function sends ping request to the given IP Address. + */ +/**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); + +@param [in] u32DstIP + Target Destination IP Address for the ping request. It must be represented in Network byte order. + The function nmi_inet_addr could be used to translate the dotted decimal notation IP + to its Network bytes order integer represntative. + +@param [in] u8TTL + IP TTL value for the ping request. If set to ZERO, the dfault value SHALL be used. + +@param [in] fpPingCb + Callback will be called to deliver the ping statistics. + +@see nmi_inet_addr +@return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); +/**@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/socket/source/socket.c b/ChaloupeLora.X/Source/winc1500/socket/source/socket.c new file mode 100644 index 0000000..4ee5002 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/socket/source/socket.c @@ -0,0 +1,1194 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2015 - 2017 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "bsp/include/nm_bsp.h" +#include "socket/include/socket.h" +#include "driver/source/m2m_hif.h" +#include "socket/source/socket_internal.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_2_RESERVD NBIT2 +#define SSL_FLAGS_3_RESERVD NBIT3 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_NO_TX_COPY NBIT5 +#define SSL_FLAGS_CHECK_SNI NBIT6 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + * @brief + */ +typedef struct { + SOCKET sock; + uint8 u8Dummy; + uint16 u16SessionID; +} tstrCloseCmd; + +/*! + * @brief + */ +typedef struct { + uint8 *pu8UserBuffer; + uint16 u16UserBufferSize; + uint16 u16SessionID; + uint16 u16DataOffset; + uint8 bIsUsed; + uint8 u8SSLFlags; + uint8 bIsRecvPending; +} tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile sint8 gsockerrno; +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint8 gu8OpCode; +volatile uint16 gu16BufferSize; +volatile uint16 gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8 gbSocketInit = 0; +volatile tpfPingCb gfpPingCb; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the NMC1500 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8 u8SocketMsg, uint32 u32StartAddress, + uint16 u16ReadCount) +{ + if ((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) + && (gastrSockets[sock].bIsUsed == 1)) { + uint32 u32Address = u32StartAddress; + uint16 u16Read; + sint16 s16Diff; + uint8 u8SetRxDone; + + pstrRecv->u16RemainingSize = u16ReadCount; + do { + u8SetRxDone = 1; + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if (s16Diff > 0) { + u8SetRxDone = 0; + u16Read = gastrSockets[sock].u16UserBufferSize; + } + + if (hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, u8SetRxDone) == M2M_SUCCESS) { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8SocketMsg, pstrRecv); + + u16ReadCount -= u16Read; + u32Address += u16Read; + + if ((!gastrSockets[sock].bIsUsed) && (u16ReadCount)) { + M2M_DBG("Application Closed Socket While Rx Is not Complete\n"); + if (hif_receive(0, NULL, 0, 1) == M2M_SUCCESS) + M2M_DBG("hif_receive Success\n"); + else + M2M_DBG("hif_receive Fail\n"); + break; + } + } else { + M2M_INFO("(ERRR)Current <%d>\n", u16ReadCount); + break; + } + } while (u16ReadCount != 0); + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +static void m2m_ip_cb(uint8 u8OpCode, uint16 u16BufferSize, uint32 u32Address) +{ + if ((u8OpCode == SOCKET_CMD_BIND) || (u8OpCode == SOCKET_CMD_SSL_BIND)) { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if (hif_receive(u32Address, (uint8 *)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) { + strBind.status = strBindReply.s8Status; + if (gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock, SOCKET_MSG_BIND, &strBind); + } + } else if (u8OpCode == SOCKET_CMD_LISTEN) { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if (hif_receive(u32Address, (uint8 *)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) { + strListen.status = strListenReply.s8Status; + if (gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock, SOCKET_MSG_LISTEN, &strListen); + } + } else if (u8OpCode == SOCKET_CMD_ACCEPT) { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if (hif_receive(u32Address, (uint8 *)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) { + if (strAcceptReply.sConnectedSock >= 0) { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags + = gastrSockets[strAcceptReply.sListenSock].u8SSLFlags; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + gastrSockets[strAcceptReply.sConnectedSock].u16DataOffset + = strAcceptReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if (gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n", strAcceptReply.sConnectedSock, gu16SessionID); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if (gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } else if ((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT)) { + tstrConnectReply strConnectReply; + tstrSocketConnectMsg strConnMsg; + if (hif_receive(u32Address, (uint8 *)&strConnectReply, sizeof(tstrConnectReply), 0) == M2M_SUCCESS) { + strConnMsg.sock = strConnectReply.sock; + strConnMsg.s8Error = strConnectReply.s8Error; + if (strConnectReply.s8Error == SOCK_ERR_NO_ERROR) { + gastrSockets[strConnectReply.sock].u16DataOffset + = strConnectReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + } + if (gpfAppSocketCb) + gpfAppSocketCb(strConnectReply.sock, SOCKET_MSG_CONNECT, &strConnMsg); + } + } else if (u8OpCode == SOCKET_CMD_DNS_RESOLVE) { + tstrDnsReply strDnsReply; + if (hif_receive(u32Address, (uint8 *)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) { + if (gpfAppResolveCb) + gpfAppResolveCb((uint8 *)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } else if ((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) + || (u8OpCode == SOCKET_CMD_SSL_RECV)) { + SOCKET sock; + sint16 s16RecvStatus; + tstrRecvReply strRecvReply; + uint16 u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8 u8CallbackMsgID = SOCKET_MSG_RECV; + uint16 u16DataOffset; + + if (u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if (hif_receive(u32Address, (uint8 *)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) { + uint16 u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n", u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if (u16SessionID == gastrSockets[sock].u16SessionID) { + if ((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. If the buffer is smaller than the received data, + the data is passed to the application in chunks according to its buffer size. + */ + u16ReadSize = (uint16)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } else { + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &strRecvMsg); + } + } else { + M2M_DBG("Discard recv callback %d %d \r\n", u16SessionID, gastrSockets[sock].u16SessionID); + if (u16ReadSize < u16BufferSize) { + if (hif_receive(0, NULL, 0, 1) == M2M_SUCCESS) + M2M_DBG("hif_receive Success\n"); + else + M2M_DBG("hif_receive Fail\n"); + } + } + } + } else if ((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) { + SOCKET sock; + sint16 s16Rcvd; + tstrSendReply strReply; + uint8 u8CallbackMsgID = SOCKET_MSG_SEND; + + if (u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if (hif_receive(u32Address, (uint8 *)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) { + uint16 u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n", u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if (u16SessionID == gastrSockets[sock].u16SessionID) { + if (gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &s16Rcvd); + } else { + M2M_DBG("Discard send callback %d %d \r\n", u16SessionID, gastrSockets[sock].u16SessionID); + } + } + } else if (u8OpCode == SOCKET_CMD_PING) { + tstrPingReply strPingReply; + if (hif_receive(u32Address, (uint8 *)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) { + gfpPingCb = (void (*)(uint32, uint32, uint8))strPingReply.u32CmdPrivate; + if (gfpPingCb != NULL) { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); + } + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void socketInit(void) +{ + if (gbSocketInit == 0) { + m2m_memset((uint8 *)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, m2m_ip_cb); + gbSocketInit = 1; + gu16SessionID = 0; + } +} +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. + +Author + Samer Sarhan + +Version + 1.0 + +Date + 27 Feb 2015 +*********************************************************************/ +void socketDeinit(void) +{ + m2m_memset((uint8 *)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. + +Author + Ahmed Ezzat + +Versio + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags) +{ + SOCKET sock = -1; + uint8 u8SockID; + uint8 u8Count; + volatile tstrSocket * pstrSock; + static volatile uint8 u8NextTcpSock = 0; + static volatile uint8 u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if (u16Domain == AF_INET) { + if (u8Type == SOCK_STREAM) { + for (u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count++) { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if (!pstrSock->bIsUsed) { + sock = (SOCKET)u8SockID; + break; + } + } + } else if (u8Type == SOCK_DGRAM) { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for (u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count++) { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if (!pstrSock->bIsUsed) { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + break; + } + } + } + + if (sock >= 0) { + m2m_memset((uint8 *)pstrSock, 0, sizeof(tstrSocket)); + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if (gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n", sock, gu16SessionID); + + if (u8Flags & SOCKET_FLAGS_SSL) { + tstrSSLSocketCreateCmd strSSLCreate; + strSSLCreate.sslSock = sock; + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE | SSL_FLAGS_NO_TX_COPY; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8 *)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + } + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((pstrAddr != NULL) && (sock >= 0) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) { + tstrBindCmd strBind; + uint8 u8CMD = SOCKET_CMD_BIND; + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8CMD = SOCKET_CMD_SSL_BIND; + } + + /* Build the bind request. */ + strBind.sock = sock; + m2m_memcpy((uint8 *)&strBind.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(u8CMD, (uint8 *)&strBind, sizeof(tstrBindCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 listen(SOCKET sock, uint8 backlog) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8 *)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((sock >= 0) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) { + tstrConnectCmd strConnect; + uint8 u8Cmd = SOCKET_CMD_CONNECT; + if ((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + m2m_memcpy((uint8 *)&strConnect.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) + && (gastrSockets[sock].bIsUsed == 1)) { + uint16 u16DataOffset; + tstrSendCmd strSend; + uint8 u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if (sock >= TCP_SOCK_MAX) { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd | M2M_REQ_DATA_PKT, + (uint8 *)&strSend, + sizeof(tstrSendCmd), + pvSendBuffer, + u16SendLength, + u16DataOffset); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, + uint8 u8AddrLen) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) + && (gastrSockets[sock].bIsUsed == 1)) { + if (gastrSockets[sock].bIsUsed) { + tstrSendCmd strSendTo; + + m2m_memset((uint8 *)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if (pstrDestAddr != NULL) { + struct sockaddr_in *pstrAddr; + pstrAddr = (void *)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO | M2M_REQ_DATA_PKT, + (uint8 *)&strSendTo, + sizeof(tstrSendCmd), + pvSendBuffer, + u16SendLength, + UDP_TX_PACKET_OFFSET); + + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8 *)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if (!gastrSockets[sock].bIsRecvPending) { + tstrRecvCmd strRecv; + uint8 u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if (u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + close + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 close(SOCKET sock) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + M2M_INFO("Sock to delete <%d>\n", sock); + if (sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) { + uint8 u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + gastrSockets[sock].bIsUsed = 0; + gastrSockets[sock].u16SessionID = 0; + + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strclose, sizeof(tstrCloseCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + m2m_memset((uint8 *)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_NO_ERROR; + if ((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) { + if (gastrSockets[sock].bIsUsed) { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8 *)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if (!gastrSockets[sock].bIsRecvPending) { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if (u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8 *)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if (s16Ret != SOCK_ERR_NO_ERROR) { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } else { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + nmi_inet_addr + +Description + +Return + Unsigned 32-bit integer representing the IP address in Network + byte order. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +uint32 nmi_inet_addr(char *pcIpAddr) +{ + uint8 tmp; + uint32 u32IP = 0; + uint8 au8IP[4]; + uint8 c; + uint8 i, j; + + tmp = 0; + + for (i = 0; i < 4; ++i) { + j = 0; + do { + c = *pcIpAddr; + ++j; + if (j > 4) { + return 0; + } + if (c == '.' || c == 0) { + au8IP[i] = tmp; + tmp = 0; + } else if (c >= '0' && c <= '9') { + tmp = (tmp * 10) + (c - '0'); + } else { + return 0; + } + ++pcIpAddr; + } while (c != '.' && c != 0); + } + m2m_memcpy((uint8 *)&u32IP, au8IP, 4); + return u32IP; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 gethostbyname(uint8 *pcHostName) +{ + sint8 s8Err = SOCK_ERR_INVALID_ARG; + uint8 u8HostNameSize = (uint8)m2m_strlen(pcHostName); + if (u8HostNameSize <= HOSTNAME_MAX_SIZE) { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE, (uint8 *)pcHostName, u8HostNameSize + 1, NULL, 0, 0); + } + return s8Err; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +static sint8 sslSetSockOpt(SOCKET sock, uint8 u8Opt, const void *pvOptVal, uint16 u16OptLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if (sock < TCP_SOCK_MAX) { + if (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) { + if (u8Opt == SO_SSL_BYPASS_X509_VERIF) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_BYPASS_X509; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_BYPASS_X509; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_ENABLE_SESSION_CACHING) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CACHE_SESSION; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CACHE_SESSION; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_ENABLE_SNI_VALIDATION) { + int optVal = *((int *)pvOptVal); + if (optVal) { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CHECK_SNI; + } else { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CHECK_SNI; + } + s8Ret = SOCK_ERR_NO_ERROR; + } else if (u8Opt == SO_SSL_SNI) { + if (u16OptLen < HOSTNAME_MAX_SIZE) { + uint8 * pu8SNI = (uint8 *)pvOptVal; + tstrSSLSetSockOptCmd strCmd; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + m2m_memcpy(strCmd.au8OptVal, pu8SNI, HOSTNAME_MAX_SIZE); + + if (SOCKET_REQUEST( + SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8 *)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0) + == M2M_ERR_MEM_ALLOC) { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8 *)&strCmd, + sizeof(tstrSSLSetSockOptCmd), + 0, + 0, + 0); + } + s8Ret = SOCK_ERR_NO_ERROR; + } else { + M2M_ERR("SNI Exceeds Max Length\n"); + } + } else { + M2M_ERR("Unknown SSL Socket Option %d\n", u8Opt); + } + } else { + M2M_ERR("Not SSL Socket\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +sint8 setsockopt(SOCKET sock, uint8 u8Level, uint8 option_name, const void *option_value, uint16 u16OptionLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if ((sock >= 0) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) { + if (u8Level == SOL_SSL_SOCKET) { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } else { + uint8 u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option = option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32 *)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8 *)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if (s8Ret != SOCK_ERR_NO_ERROR) { + s8Ret = SOCK_ERR_INVALID; + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 24 August 2014 +*********************************************************************/ +sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 *pu8OptLen) +{ + /* TBD */ + return M2M_SUCCESS; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2015 +*********************************************************************/ +sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if ((u32DstIP != 0) && (fpPingCb != NULL)) { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = (uint32)fpPingCb; + strPingCmd.u8TTL = u8TTL; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8 *)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} +/********************************************************************* +Function + sslEnableCertExpirationCheck + +Description + Enable/Disable TLS Certificate Expiration Check. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + +*********************************************************************/ +sint8 sslEnableCertExpirationCheck(tenuSslCertExpSettings enuValidationSetting) +{ + tstrSslCertExpSettings strSettings; + strSettings.u32CertExpValidationOpt = (uint32)enuValidationSetting; + return SOCKET_REQUEST(SOCKET_CMD_SSL_EXP_CHECK, (uint8 *)&strSettings, sizeof(tstrSslCertExpSettings), NULL, 0, 0); +} diff --git a/ChaloupeLora.X/Source/winc1500/socket/source/socket_internal.h b/ChaloupeLora.X/Source/winc1500/socket/source/socket_internal.h new file mode 100644 index 0000000..f74c162 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/socket/source/socket_internal.h @@ -0,0 +1,66 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#ifndef __SOCKET_INTERNAL_H__ +#define __SOCKET_INTERNAL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket/include/socket.h" +#include "socket/include/m2m_socket_host_if.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8 u8SocketMsg, uint32 u32StartAddress, + uint16 u16ReadCount); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash.h b/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..f0bcfbe --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash.h @@ -0,0 +1,225 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/** \defgroup SPIFLASH Spi Flash + * @file spi_flash.h + * @brief This file describe SPI flash APIs, how to use it and limitations with each one. + * @section Example + * This example illustrates a complete guide of how to use these APIs. + * @code{.c} + #include "spi_flash.h" + + #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + + int main() + { + uint8 au8FlashContent[FLASH_SECTOR_SZ] = {0}; + uint32 u32FlashTotalSize = 0; + uint32 u32FlashOffset = 0; + + ret = m2m_wifi_download_mode(); + if(M2M_SUCCESS != ret) + { + printf("Unable to enter download mode\r\n"); + } + else + { + u32FlashTotalSize = spi_flash_get_size(); + } + + while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + { + ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to read SPI sector\r\n"); + break; + } + memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + + ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to erase SPI sector\r\n"); + break; + } + + ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + if(M2M_SUCCESS != ret) + { + printf("Unable to write SPI sector\r\n"); + break; + } + u32FlashOffset += FLASH_SECTOR_SZ; + } + + if(M2M_SUCCESS == ret) + { + printf("Successful operations\r\n"); + } + else + { + printf("Failed operations\r\n"); + } + + while(1); + return M2M_SUCCESS; + } + * @endcode + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +/** + * @fn spi_flash_enable + * @brief Enable spi flash operations + * @version 1.0 + */ +sint8 spi_flash_enable(uint8 enable); +/** \defgroup SPIFLASHAPI Function + * @ingroup SPIFLASH + */ + +/** @defgroup SPiFlashGetFn spi_flash_get_size + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn uint32 spi_flash_get_size(void); + * @brief Returns with \ref uint32 value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32 spi_flash_get_size(void); +/**@}*/ + +/** @defgroup SPiFlashRead spi_flash_read + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_read(uint8 *, uint32, uint32); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will fill in with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus + * using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz); +/**@}*/ + +/** @defgroup SPiFlashWrite spi_flash_write + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_write(uint8 *, uint32, uint32); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the required to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and compare it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus + using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase it first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_write(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Sz); +/**@}*/ + +/** @defgroup SPiFlashErase spi_flash_erase + * @ingroup SPIFLASHAPI + */ +/**@{*/ +/*! + * @fn sint8 spi_flash_erase(uint32, uint32); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Size of SPI flash required to be erased. + * @note It is blocking function \n +* @warning +* - Address (offset) plus size of data must not exceed flash size.\n +* - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus +using + * @ref m2m_wifi_download_mode + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz); +/**@}*/ +#endif //__SPI_FLASH_H__ diff --git a/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash_map.h b/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..ce3ed21 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/spi_flash/include/spi_flash_map.h @@ -0,0 +1,243 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2016-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/** + * @file spi_flash_map.h + * @brief This module contains spi flash CONTENT + * @author M.S.M + * @date 17 SEPT 2013 + * @version 1.0 + */ +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +#define FLASH_MAP_VER_0 (0) +#define FLASH_MAP_VER_1 (1) +#define FLASH_MAP_VER_2 (2) +#define FLASH_MAP_VER_3 (3) + +#define FLASH_MAP_VERSION FLASH_MAP_VER_3 + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! location :xxxK + * "S:xxxK" -means-> Size is :xxxK + */ + +/* + * Boot Firmware: which used to select which firmware to run + * + */ +#define M2M_BOOT_FIRMWARE_STARTING_ADDR (FLASH_START_ADDR) +#define M2M_BOOT_FIRMWARE_FLASH_SZ (FLASH_SECTOR_SZ) + +/* + * Control Section: which used by Boot firmware + * + */ +#define M2M_CONTROL_FLASH_OFFSET (M2M_BOOT_FIRMWARE_STARTING_ADDR + M2M_BOOT_FIRMWARE_FLASH_SZ) +#define M2M_CONTROL_FLASH_BKP_OFFSET (M2M_CONTROL_FLASH_OFFSET + FLASH_SECTOR_SZ) +#define M2M_CONTROL_FLASH_SEC_SZ (FLASH_SECTOR_SZ) +#define M2M_CONTROL_FLASH_TOTAL_SZ (FLASH_SECTOR_SZ * 2) + +/* + * LUT for PLL and TX Gain settings: + * + */ +#define M2M_PLL_FLASH_OFFSET (M2M_CONTROL_FLASH_OFFSET + M2M_CONTROL_FLASH_TOTAL_SZ) +#define M2M_PLL_FLASH_SZ (1024 * 1) +#define M2M_GAIN_FLASH_OFFSET (M2M_PLL_FLASH_OFFSET + M2M_PLL_FLASH_SZ) +#define M2M_GAIN_FLASH_SZ (M2M_CONFIG_SECT_TOTAL_SZ - M2M_PLL_FLASH_SZ) +#define M2M_CONFIG_SECT_TOTAL_SZ (FLASH_SECTOR_SZ) + +/* + * Certificate: + * + */ +#define M2M_TLS_ROOTCER_FLASH_OFFSET (M2M_PLL_FLASH_OFFSET + M2M_CONFIG_SECT_TOTAL_SZ) +#define M2M_TLS_ROOTCER_FLASH_SIZE (FLASH_SECTOR_SZ * 1) + +/* + * Scratch: + * + */ +#define M2M_TLS_FLASH_SESSION_CACHE_OFFSET (M2M_TLS_FLASH_ROOTCERT_CACHE_OFFSET + M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE) +#define M2M_TLS_FLASH_SESSION_CACHE_SIZE (FLASH_SECTOR_SZ * 1) + +/* + * reserved section + * + */ +#define M2M_TLS_SERVER_FLASH_OFFSET (M2M_TLS_ROOTCER_FLASH_OFFSET + M2M_TLS_ROOTCER_FLASH_SIZE) +#define M2M_TLS_SERVER_FLASH_SIZE (FLASH_SECTOR_SZ * 2) + +/* + * HTTP Files + * + */ +#define M2M_HTTP_MEM_FLASH_OFFSET (M2M_RESERVED_FLASH_OFFSET + M2M_RESERVED_FLASH_SZ) +#define M2M_HTTP_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 2) +/* + * Saved Connection Parameters: + * + */ +#define M2M_CACHED_CONNS_FLASH_OFFSET (M2M_HTTP_MEM_FLASH_OFFSET + M2M_HTTP_MEM_FLASH_SZ) +#define M2M_CACHED_CONNS_FLASH_SZ (FLASH_SECTOR_SZ * 1) + +/* + * + * Common section size + */ + +#define M2M_COMMON_DATA_SEC \ + (M2M_BOOT_FIRMWARE_FLASH_SZ + M2M_CONTROL_FLASH_TOTAL_SZ + M2M_CONFIG_SECT_TOTAL_SZ \ + + M2M_TLS_FLASH_ROOTCERT_CACHE_SIZE + M2M_TLS_FLASH_SESSION_CACHE_SIZE + M2M_HTTP_MEM_FLASH_SZ \ + + M2M_CACHED_CONNS_FLASH_SZ + M2M_RESERVED_FLASH_SZ) +/* + * + * OTA image1 Offset + */ + +#define M2M_OTA_IMAGE1_OFFSET (M2M_CACHED_CONNS_FLASH_OFFSET + M2M_CACHED_CONNS_FLASH_SZ) +/* + * Firmware Offset + * + */ +#if (defined _FIRMWARE_) || (defined OTA_GEN) +#define M2M_FIRMWARE_FLASH_OFFSET (0UL) +#else +#if (defined DOWNLOAD_ROLLBACK) +#define M2M_FIRMWARE_FLASH_OFFSET (M2M_OTA_IMAGE2_OFFSET) +#else +#define M2M_FIRMWARE_FLASH_OFFSET (M2M_OTA_IMAGE1_OFFSET) +#endif +#endif +/* + * + * Firmware + */ +#define M2M_FIRMWARE_FLASH_SZ (236 * 1024UL) +/** + * + * OTA image Size + */ +#define OTA_IMAGE_SIZE (M2M_FIRMWARE_FLASH_SZ) +/** + * + * Flash Total size + */ +#define FLASH_IMAGE1_CONTENT_SZ (M2M_COMMON_DATA_SEC + OTA_IMAGE_SIZE) + +/** + * + * OTA image 2 offset + */ +#define M2M_OTA_IMAGE2_OFFSET (FLASH_IMAGE1_CONTENT_SZ) + +/* + * App(Cortus App 4M): App. which runs over firmware + * + */ +#define M2M_APP_4M_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 16) +#define M2M_APP_4M_MEM_FLASH_OFFSET (FLASH_4M_TOTAL_SZ - M2M_APP_4M_MEM_FLASH_SZ) +#define M2M_APP_8M_MEM_FLASH_OFFSET (M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) +#define M2M_APP_8M_MEM_FLASH_SZ (FLASH_SECTOR_SZ * 32) +#define M2M_APP_OTA_MEM_FLASH_OFFSET (M2M_APP_8M_MEM_FLASH_OFFSET + M2M_APP_8M_MEM_FLASH_SZ) + +/* Check if total size of content + * don't exceed total size of memory allowed + **/ +#if (M2M_COMMON_DATA_SEC + (OTA_IMAGE_SIZE * 2) > FLASH_4M_TOTAL_SZ) +#error "Excced 4M Flash Size" +#endif /* (FLASH_CONTENT_SZ > FLASH_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/ChaloupeLora.X/Source/winc1500/spi_flash/source/spi_flash.c b/ChaloupeLora.X/Source/winc1500/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..992cfe1 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/spi_flash/source/spi_flash.c @@ -0,0 +1,740 @@ +/** + * + * \file + * + * \brief WINC1500 SPI Flash. + * + * Copyright (c) 2017-2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifdef PROFILING +#include "windows.h" +#endif +#include "spi_flash/include/spi_flash.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +//#define DISABLE_UNSED_FLASH_FUNCTIONS + +#define FLASH_BLOCK_SIZE (32UL * 1024) +/*!> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_sector_erase + * @brief Erase sector (4KB) + * @param[IN] u32FlashAdr + * Any memory address within the sector + * @return Status of execution + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_sector_erase(uint32 u32FlashAdr) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_write_enable + * @brief Send write enable command to SPI flash + * @return Status of execution + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_write_enable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_write_disable + * @brief Send write disable command to SPI flash + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_write_disable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_page_program + * @brief Write data (less than page size) from cortus memory to SPI flash + * @param[IN] u32MemAdr + * Cortus data address. It must be set to its AHB access address + * @param[IN] u32FlashAdr + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @note Compatible with MX25L6465E and should be working with other types + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_page_program(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0] | (cmd[1] << 8) | (cmd[2] << 16) | (cmd[3] << 24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1 << 7) | ((u32Sz & 0xfffff) << 8)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if (M2M_SUCCESS != ret) + break; + } while (val != 1); + + return ret; +} + +/** + * @fn spi_flash_read_internal + * @brief Read from data from SPI flash + * @param[OUT] pu8Buf + * Pointer to data buffer + * @param[IN] u32Addr + * Address to read from at the SPI flash + * @param[IN] u32Sz + * Data size + * @note Data size must be < 64KB (limitation imposed by the bus wrapper) + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_read_internal(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if (M2M_SUCCESS != ret) + goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** + * @fn spi_flash_pp + * @brief Program data of size less than a page (256 bytes) at the SPI flash + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] pu8Buf + * Pointer to data buffer + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @author M. Abdelmawla + * @version 1.0 + */ +static sint8 spi_flash_pp(uint32 u32Offset, uint8 *pu8Buf, uint16 u16Sz) +{ + sint8 ret = M2M_SUCCESS; + uint8 tmp; + spi_flash_write_enable(); + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + ret += spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz); + ret += spi_flash_read_status_reg(&tmp); + do { + if (ret != M2M_SUCCESS) + goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } while (tmp & 0x01); + ret += spi_flash_write_disable(); +ERR: + return ret; +} + +/** + * @fn spi_flash_rdid + * @brief Read SPI Flash ID + * @return SPI FLash ID + * @author M.S.M + * @version 1.0 + */ +static uint32 spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32 reg = 0; + uint32 cnt = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + do { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if (M2M_SUCCESS != ret) + break; + if (++cnt > 500) { + ret = M2M_ERR_INIT; + break; + } + } while (reg != 1); + reg = (M2M_SUCCESS == ret) ? (nm_read_reg(DUMMY_REGISTER)) : (0); + M2M_PRINT("Flash ID %x \n", (unsigned int)reg); + return reg; +} + +/** + * @fn spi_flash_unlock + * @brief Unlock SPI Flash + * @author M.S.M + * @version 1.0 + */ +#if 0 +static void spi_flash_unlock(void) +{ + uint8 tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif +static void spi_flash_enter_low_power_mode(void) +{ + volatile unsigned long tmp; + unsigned char * cmd = (unsigned char *)&tmp; + unsigned int count = 0; + + cmd[0] = 0xb9; + + nm_write_reg(SPI_FLASH_DATA_CNT, 0); + nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + while (nm_read_reg(SPI_FLASH_TR_DONE) != 1) //JFM ajouté compteur... + { + if(count++ >= 5000) + return; + } +} + +static void spi_flash_leave_low_power_mode(void) +{ + volatile unsigned long tmp; + unsigned char * cmd = (unsigned char *)&tmp; + + cmd[0] = 0xab; + + nm_write_reg(SPI_FLASH_DATA_CNT, 0); + nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1 << 7)); + while (nm_read_reg(SPI_FLASH_TR_DONE) != 1) + ; +} +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ +/** + * @fn spi_flash_enable + * @brief Enable spi flash operations + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_enable(uint8 enable) +{ + sint8 s8Ret = M2M_SUCCESS; + if (REV(nmi_get_chipid()) >= REV_3A0) { + uint32 u32Val; + + /* Enable pinmux to SPI flash. */ + s8Ret = nm_read_reg_with_ret(0x1410, &u32Val); + if (s8Ret != M2M_SUCCESS) { + goto ERR1; + } + /* GPIO15/16/17/18 */ + u32Val &= ~((0x7777ul) << 12); + u32Val |= ((0x1111ul) << 12); + nm_write_reg(0x1410, u32Val); + if (enable) { + spi_flash_leave_low_power_mode(); + } else { + spi_flash_enter_low_power_mode(); + } + /* Disable pinmux to SPI flash to minimize leakage. */ + u32Val &= ~((0x7777ul) << 12); + u32Val |= ((0x0010ul) << 12); + nm_write_reg(0x1410, u32Val); + } +ERR1: + return s8Ret; +} +/** + * @fn spi_flash_read + * @brief Read from data from SPI flash + * @param[OUT] pu8Buf + * Pointer to data buffer + * @param[IN] u32offset + * Address to read from at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @note Data size is limited by the SPI flash size only + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32offset, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + if (u32Sz > FLASH_BLOCK_SIZE) { + do { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if (M2M_SUCCESS != ret) + goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while (u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** + * @fn spi_flash_write + * @brief Proram SPI flash + * @param[IN] pu8Buf + * Pointer to data buffer + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_write(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Sz) +{ +#ifdef PROFILING + uint32 t1 = 0; + uint32 percent = 0; + uint32 tpercent = 0; +#endif + sint8 ret = M2M_SUCCESS; + uint32 u32wsz; + uint32 u32off; + uint32 u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz / u32Blksz) + ((u32Sz % u32Blksz) > 0); + t1 = GetTickCount(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if (u32Sz <= 0) { + M2M_ERR("Data size = %d", (int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if (u32off) /*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if (spi_flash_pp(u32Offset, pu8Buf, (uint16)BSP_MIN(u32Sz, u32wsz)) != M2M_SUCCESS) { + ret = M2M_ERR_FAIL; + goto ERR; + } + if (u32Sz < u32wsz) + goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while (u32Sz > 0) { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if (spi_flash_pp(u32Offset, pu8Buf, (uint16)u32wsz) != M2M_SUCCESS) { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r", ((percent * 100) / tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r", (GetTickCount() - t1) / 1000.0); +#endif +ERR: + return ret; +} + +/** + * @fn spi_flash_erase + * @brief Erase from data from SPI flash + * @param[IN] u32Offset + * Address to write to at the SPI flash + * @param[IN] u32Sz + * Data size + * @return Status of execution + * @note Data size is limited by the SPI flash size only + * @author M. Abdelmawla + * @version 1.0 + */ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz) +{ + uint32 i = 0; + sint8 ret = M2M_SUCCESS; + uint8 tmp = 0; +#ifdef PROFILING + uint32 t; + t = GetTickCount(); +#endif + M2M_PRINT("\r\n>Start erasing...\r\n"); + for (i = u32Offset; i < (u32Sz + u32Offset); i += (16 * FLASH_PAGE_SZ)) { + ret += spi_flash_write_enable(); + ret += spi_flash_read_status_reg(&tmp); + ret += spi_flash_sector_erase(i + 10); + ret += spi_flash_read_status_reg(&tmp); + do { + if (ret != M2M_SUCCESS) + goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } while (tmp & 0x01); + } + M2M_PRINT("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (GetTickCount() - t) / 1000.0); +#endif +ERR: + return ret; +} + +/** + * @fn spi_flash_get_size + * @brief Get size of SPI Flash + * @return Size of Flash + * @author M.S.M + * @version 1.0 + */ +uint32 spi_flash_get_size(void) +{ + uint32 u32FlashId = 0, u32FlashPwr = 0; + static uint32 gu32InernalFlashSize = 0; + + if (!gu32InernalFlashSize) { + u32FlashId = spi_flash_rdid(); // spi_flash_probe(); + if (u32FlashId != 0xffffffff) { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId >> 16) & 0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InernalFlashSize = 1 << u32FlashPwr; + M2M_INFO("Flash Size %lu Mb\n", gu32InernalFlashSize); + } else { + M2M_ERR("Cann't Detect Flash size\n"); + } + } + + return gu32InernalFlashSize; +} diff --git a/ChaloupeLora.X/Source/winc1500/winc_init.c b/ChaloupeLora.X/Source/winc1500/winc_init.c new file mode 100644 index 0000000..344dcd9 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/winc_init.c @@ -0,0 +1,38 @@ +/* + * Code generated from Atmel Start. + * + * This file will be overwritten when reconfiguring your Atmel Start project. + * Please copy examples or other code you want to keep to a separate file or main.c + * to avoid loosing it when reconfiguring. + */ + +//#include "atmel_start.h" +#include "string.h" +#include "winc_init.h" +#include "driver/source/nmasic.h" +#include + +//extern void set_winc_spi_descriptor(struct spi_m_sync_descriptor *spi_inst); + +/* + * \brief Initialize Wifi library + */ +void wifi_init(tstrWifiInitParam *params) +{ + tstrWifiInitParam param; + int8_t ret; + + //set_winc_spi_descriptor(&WINC_SPI); //JFM + + /* Initialize the BSP. */ + nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = params->pfAppWifiCb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + while (1) { + } + } +} diff --git a/ChaloupeLora.X/Source/winc1500/winc_init.h b/ChaloupeLora.X/Source/winc1500/winc_init.h new file mode 100644 index 0000000..dce666c --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500/winc_init.h @@ -0,0 +1,14 @@ +#ifndef WINC1500_MAIN_H +#define WINC1500_MAIN_H + +//#include "atmel_start.h" + +#include "driver/include/m2m_wifi.h" + +//#define CONF_WINC_PIN_CHIP_SELECT WINC_PIN_CHIP_SELECT +//#define CONF_WINC_PIN_CHIP_ENABLE WINC_PIN_CHIP_ENABLE +//#define CONF_WINC_PIN_RESET WINC_PIN_RESET + +void wifi_init(tstrWifiInitParam *params); + +#endif diff --git a/ChaloupeLora.X/Source/winc1500_config.h b/ChaloupeLora.X/Source/winc1500_config.h new file mode 100644 index 0000000..1439fe2 --- /dev/null +++ b/ChaloupeLora.X/Source/winc1500_config.h @@ -0,0 +1,28 @@ +/* Auto-generated config file winc1500_config.h */ +#ifndef WINC1500_CONFIG_H +#define WINC1500_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +#include +// Basic configuration + +// Enable Wi-Fi Management +// Enable Wi-Fi Management +// wifi_mgmt_enable +#ifndef CONF_MGMT +#define CONF_MGMT 0 +#endif +#ifndef CONF_WINC_USE_SPI +#define CONF_WINC_USE_SPI 1 +#endif +#ifndef CONF_PERIPH +#define CONF_PERIPH 1 +#endif +#define CONF_WINC_DEBUG (1) +#define CONF_WINC_PRINTF printf +// + +// <<< end of configuration section >>> + +#endif // WINC1500_CONFIG_H diff --git a/ChaloupeLora.X/Source/winc3400/WINC3400_BLE_APIs.chm b/ChaloupeLora.X/Source/winc3400/WINC3400_BLE_APIs.chm new file mode 100644 index 0000000..00af218 Binary files /dev/null and b/ChaloupeLora.X/Source/winc3400/WINC3400_BLE_APIs.chm differ diff --git a/ChaloupeLora.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm b/ChaloupeLora.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm new file mode 100644 index 0000000..1cc90f7 Binary files /dev/null and b/ChaloupeLora.X/Source/winc3400/WINC3400_IoT_SW_APIs.chm differ diff --git a/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp.h b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp.h new file mode 100644 index 0000000..1da8018 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp.h @@ -0,0 +1,248 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 BSP APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup nm_bsp BSP + */ + +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define NMI_API +/*!< +* Attribute used to define memory section to map Functions in host memory. +*/ + +#include "winc3400_config.h" +#define CONST const + +#ifndef NULL +#define NULL ((void*)0) +#endif +/*!< +* Void Pointer to '0' in case of NULL is not defined. +*/ + + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) +/*!< +* Computes the minimum of \b x and \b y. +*/ + + //@} + +/**@defgroup DataT Enumeration/Typedefs + * @ingroup nm_bsp + * @{ + */ + + /*! +* Used for code portability. +*/ + +/*! + * @typedef void (*tpfNmBspIsr) (void); + * @brief Pointer to function.\n + * Used as a data type of ISR function registered by \ref nm_bsp_register_isr + * @return None + */ +typedef void (*tpfNmBspIsr)(void); + + /*! + * @ingroup DataTypes + * @typedef unsigned char uint8; + * @brief Range of values between 0 to 255 + */ +typedef unsigned char uint8; + + /*! + * @ingroup DataTypes + * @typedef unsigned short uint16; + * @brief Range of values between 0 to 65535 + */ +typedef unsigned short uint16; + + /*! + * @ingroup Data Types + * @typedef unsigned long uint32; + * @brief Range of values between 0 to 4294967295 + */ +typedef unsigned long uint32; + + + /*! + * @ingroup Data Types + * @typedef signed char sint8; + * @brief Range of values between -128 to 127 + */ +typedef signed char sint8; + + /*! + * @ingroup DataTypes + * @typedef signed short sint16; + * @brief Range of values between -32768 to 32767 + */ +typedef signed short sint16; + + /*! + * @ingroup DataTypes + * @typedef signed long sint32; + * @brief Range of values between -2147483648 to 2147483647 + */ + +typedef signed long sint32; + //@} + +#ifndef CORTUS_APP + + +#ifdef __cplusplus +extern "C"{ +#endif + +/** \defgroup BSPAPI Functions + * @ingroup nm_bsp + * @{ + */ + +/*! + * @fn sint8 nm_bsp_init(void); + * Initialization for BSP such as Reset and Chip Enable Pins for WINC, delays, register ISR, enable/disable IRQ for WINC, ...etc. You must use this function in the head of your application to + * enable WINC and Host Driver to communicate with each other. + * @note Implementation of this function is host dependent. + * @warning Omission will lead to unavailability of host communication.\n + * + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_init(void); +/*! + * @fn sint8 nm_bsp_deinit(void); + * De-initialization for BSP (\e Board \e Support \e Package) + * @pre Initialize \ref nm_bsp_init first + * @note Implementation of this function is host dependent. + * @warning Omission may lead to unknown behavior in case of soft reset.\n + * @see nm_bsp_init + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 nm_bsp_deinit(void); + /*! + * @fn void nm_bsp_reset(void); + * Resetting NMC1500 SoC by setting CHIP_EN and RESET_N signals low, then after specific delay the function will put CHIP_EN high then RESET_N high, + * for the timing between signals please review the WINC data-sheet + * @pre Initialize \ref nm_bsp_init first + * @note Implementation of this function is host dependent and called by HIF layer. + * @see nm_bsp_init + * @return None + + */ +void nm_bsp_reset(void); +/*! + * @fn void nm_bsp_sleep(uint32); + * Sleep in units of milliseconds.\n + * This function is used by HIF Layer as required in various situations. + * @brief + * @param [in] u32TimeMsec + * Time unit in milliseconds + * @pre Initialize \ref nm_bsp_init first + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds.\n + * @note Implementation of this function is host dependent. + * @see nm_bsp_init + * @return None + */ +void nm_bsp_sleep(uint32 u32TimeMsec); +/*! + * @fn void nm_bsp_register_isr(tpfNmBspIsr); + * Register ISR (Interrupt Service Routine) in the initialization of HIF (Host Interface) Layer. + * When the interrupt trigger the BSP layer should call the pfisr function once inside the interrupt. + * @param [in] pfIsr + * Pointer to ISR handler in HIF + * @warning Make sure that ISR for IRQ pin for WINC is disabled by default in your implementation. + * @note Implementation of this function is host dependent and called by HIF layer. + * @see tpfNmBspIsr + * @return None + + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr); +/*! + * @fn void nm_bsp_interrupt_ctrl(uint8); + * Synchronous enable/disable interrupts function + * @brief Enable/Disable interrupts + * @param [in] u8Enable + * '0' disable interrupts. '1' enable interrupts + * @see tpfNmBspIsr + * @note Implementation of this function is host dependent and called by HIF layer. + * @return None + + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable); + /**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif + +/** + * @addtogroup BSPDefine + * @{ + */ + +#ifdef _NM_BSP_BIG_END +/*! Switch endianness of 32bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_32(x) \ +((((x) & 0x000000FF) << 24) + \ +(((x) & 0x0000FF00) << 8) + \ +(((x) & 0x00FF0000) >> 8) + \ +(((x) & 0xFF000000) >> 24)) +/*! Switch endianness of 16bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_16(x) \ +((((x) & 0x00FF) << 8) + \ +(((x) & 0xFF00) >> 8)) +#else +/*! Retain endianness of 32bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_32(x) (x) +/*! Retain endianness of 16bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_16(x) (x) +#endif + +/**@} + */ + +#endif /*_NM_BSP_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_internal.h b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_internal.h new file mode 100644 index 0000000..3fac66d --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_internal.h @@ -0,0 +1,100 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 BSP APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +/**@defgroup BSPDefine Defines + * @ingroup nm_bsp + * @{ + */ +#ifndef _NM_BSP_INTERNAL_H_ +#define _NM_BSP_INTERNAL_H_ + + + +#ifdef WIN32 +#include "nm_bsp_win32.h" +#endif + +#ifdef __K20D50M__ +#include "nm_bsp_k20d50m.h" +#endif + +#ifdef __MSP430FR5739__ +#include "bsp_msp430fr5739.h" +#endif + +#ifdef _FREESCALE_MCF51CN128_ +#include "bsp/include/nm_bsp_mcf51cn128.h" +#endif + +#ifdef __MCF964548__ +#include "bsp/include/nm_bsp_mc96f4548.h" +#endif + +#ifdef __APP_APS3_CORTUS__ +#include "nm_bsp_aps3_cortus.h" +#endif + +#if (defined __SAMD21J18A__) || (defined __SAMD21G18A__) +#include "bsp/include/nm_bsp_samd21.h" +#endif + +#if (defined __SAM4S16C__) || (defined __SAM4SD32C__) +#include "bsp/include/nm_bsp_sam4s.h" +#endif + +#ifdef __SAMG55J19__ +#include "bsp/include/nm_bsp_samg55.h" +#endif + +#ifdef __SAMG53N19__ +#include "bsp/include/nm_bsp_samg53.h" +#endif + +#if (defined __SAME70Q21__) || (defined __SAME70Q21B__) +#include "bsp/include/nm_bsp_same70.h" +#endif + +#ifdef CORTUS_APP +#include "crt_iface.h" +#endif + +#ifdef NRF51 +#include "nm_bsp_nrf51822.h" +#endif + +#ifdef _ARDUINO_UNO_ +#include "bsp/include/nm_bsp_arduino_uno.h" +#endif + + +#endif //_NM_BSP_INTERNAL_H_ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21.h b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21.h new file mode 100644 index 0000000..070ff1a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21.h @@ -0,0 +1,46 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BSP_SAMD21_H_ +#define _NM_BSP_SAMD21_H_ + +#include "conf_winc.h" +#include "math.h" + +#define NM_EDGE_INTERRUPT (1) + +#define NM_DEBUG CONF_WINC_DEBUG +#define NM_BSP_PRINTF CONF_WINC_PRINTF + +#endif /* _NM_BSP_SAMD21_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h new file mode 100644 index 0000000..a173746 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/include/nm_bsp_samd21_app.h @@ -0,0 +1,204 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BSP_SAMD21_APP_H_ +#define _NM_BSP_SAMD21_APP_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include + + +#define M2M_PRINTX(x) nm_bsp_uart_send((const uint8_t *)x,sizeof(x)) +/** +*Extern global variables +* +*/ +extern uint32 gu32Jiffies20ms; +extern uint32 gu32Jiffies1ms; +#ifdef __cplusplus +extern "C"{ +#endif + +/* +* +*/ +#define SW1 NBIT0 +#define SW2 NBIT1 +/**/ + +#define NM_BSP_PERM_FIRMWARE_SIZE (1024UL*256) /* Permenant storage size available for the firmware */ + +#define TICK_RES 20 /*!< Tick resolution in milliseconds*/ +#define TICK_RES_SLEEP 20 /*it must be equal tick or higher*/ + +#define NM_BSP_TIME_MSEC (gu32Jiffies20ms * TICK_RES) + + +/** +* +*Callback functions +*/ +typedef void (*tpfNmBspBtnPress)(uint8 u8Btn, uint8 u8Type); +typedef void (*tpfNmBspTimerCb)(void); + +/** +* @fn nm_bsp_init +* @brief Initialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_init(void); + +/* +* @fn nm_bsp_app_configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_app_configurable_timer_init(uint32_t u32Period); + +/** +* @fn nm_bsp_deinit +* @brief De-iInitialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_deinit(void); + +/** +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_uart_send(const uint8 *pu8Buf, uint16 u16Sz); +/** +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_btn_init(tpfNmBspBtnPress pfBtnCb); +#ifdef _STATIC_PS_ +/** +* @fn nm_bsp_register_wake_isr +* @brief REGISTER wake up timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_register_wake_isr(tpfNmBspIsr pfIsr,uint32 u32MsPeriod); +/** +* @fn nm_bsp_wake_ctrl +* @brief control wake up timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_wake_ctrl(uint8 en); + +#endif +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +/** +* @fn nm_bsp_enable_mcu_ps +* @brief Start POWER SAVE FOR MCU +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_enable_mcu_ps(void); +#endif + +/** +* @fn nm_bsp_start_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_start_timer(tpfNmBspTimerCb pfCb, uint32 u32Period); + +/* +* @fn nm_bsp_start_1ms_timer +* @brief Start 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_1ms_timer(tpfNmBspTimerCb pfCb); + +/* +* @fn nm_bsp_start_configurable_timer +* @brief Start configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_configurable_timer(tpfNmBspTimerCb pfCb); + +/** +* @fn nm_bsp_stop_timer +* @brief Stop 20ms timer +* @author M.S.M +* @date 28 oct 2013 +* @version 1.0 +*/ +void nm_bsp_stop_timer(void); + +/* +* @fn nm_bsp_stop_1ms_timer +* @brief Stop 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_1ms_timer(void); + +/* +* @fn nm_bsp_stop_configurable_timer +* @brief Stop configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_configurable_timer(void); + + +#ifdef __cplusplus +} +#endif +#endif /* _NM_BSP_SAMD21_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp.c b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp.c new file mode 100644 index 0000000..7261bc1 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp.c @@ -0,0 +1,181 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2018 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "timer.h" +#include "define.h" +#include "BoardCfg.h" +//#include + +//#include "atmel_start.h" +//#include "winc_init.h" + +#ifndef CONF_WINC_EXT_INT_PIN +#define CONF_WINC_EXT_INT_PIN 0 +#endif + +static tpfNmBspIsr gpfIsr = NULL; + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + if (gpfIsr) + { + gpfIsr(); + } + + IFS0bits.INT0IF = 0; +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; +// +//JFM Not necessary, we know our timer base is 1ms... + +// /* Make sure a 1ms Systick is configured. */ +// if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { +// delay_init(SysTick); +// } + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_bsp_reset(void) +{ +// GP_DEBUG_1_PIN = 1; + + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(100); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(150); + WIFI_CHP_RST_PIN = 1; + + // GP_DEBUG_1_PIN = 0; + + +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, false); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, false); +// nm_bsp_sleep(1); +// gpio_set_pin_level(CONF_WINC_PIN_CHIP_ENABLE, true); +// nm_bsp_sleep(5); +// gpio_set_pin_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + Sleep(u32TimeMsec); + + + +// while (u32TimeMsec--) { +// delay_ms(1); +// } +} + +/** + * \internal Get the PIO hardware instance + * + * \param[in] pin The PIO pin + * + * \return The instance of PIO hardware + */ + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + gpfIsr = pfIsr; +// +// ext_irq_register(CONF_WINC_EXT_INT_PIN, chip_isr); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if(u8Enable == 0) + { + IEC0bits.INT0IE = 0; + } + else + { + IEC0bits.INT0IE = 1; + } +// _ext_irq_enable(CONF_WINC_EXT_INT_PIN, u8Enable); +} diff --git a/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21.c b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21.c new file mode 100644 index 0000000..0691ef2 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21.c @@ -0,0 +1,185 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp.h" +#include "bsp/include/nm_bsp_internal.h" +#include "common/include/nm_common.h" +#include "extint.h" +#include "port.h" +#ifdef TICK_IF +#include "tick_if.h" +#else +#include "delay.h" +#endif +#include "system_interrupt.h" +#include "conf_winc.h" + +static tpfNmBspIsr gpfIsr; + +static void chip_isr(void) +{ + if (gpfIsr) { + gpfIsr(); + } +} + +/* + * @fn init_chip_pins + * @brief Initialize reset, chip enable and wake pin + */ +static void init_chip_pins(void) +{ + struct port_config pin_conf; + + port_get_config_defaults(&pin_conf); + + /* Configure control pins as output. */ + pin_conf.direction = PORT_PIN_DIR_OUTPUT; + port_pin_set_config(CONF_WINC_PIN_RESET, &pin_conf); + port_pin_set_config(CONF_WINC_PIN_CHIP_ENABLE, &pin_conf); + port_pin_set_config(CONF_WINC_PIN_WAKE, &pin_conf); + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, false); + port_pin_set_output_level(CONF_WINC_PIN_RESET, false); +} + +/* + * @fn nm_bsp_init + * @brief Initialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_init(void) +{ + gpfIsr = NULL; + + /* Initialize chip IOs. */ + init_chip_pins(); +#ifndef CONF_WINC_USE_SPI + nm_bsp_reset(); +#endif + + /* Make sure a 1ms Systick is configured. */ + if (!(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk && SysTick->CTRL & SysTick_CTRL_TICKINT_Msk)) { + delay_init(); + } + + system_interrupt_enable_global(); + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_deinit + * @brief De-iInitialize BSP + * @return 0 in case of success and -1 in case of failure + */ +sint8 nm_bsp_deinit(void) +{ + struct port_config pin_conf; + port_get_config_defaults(&pin_conf); + /* Configure control pins as input no pull up. */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_NONE; + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, false); + port_pin_set_output_level(CONF_WINC_PIN_RESET, false); + port_pin_set_config(CONF_WINC_SPI_INT_PIN, &pin_conf); + return M2M_SUCCESS; +} + +/** + * @fn nm_bsp_reset + * @brief Reset NMC1500 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high. + * CHIP_EN and RESET_N are actually already set low by nm_bsp_init or nm_bsp_deinit(). + * Here we just need to set them high. + */ +void nm_bsp_reset(void) +{ + port_pin_set_output_level(CONF_WINC_PIN_CHIP_ENABLE, true); + nm_bsp_sleep(5); + port_pin_set_output_level(CONF_WINC_PIN_RESET, true); +} + +/* + * @fn nm_bsp_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_bsp_sleep(uint32 u32TimeMsec) +{ + while (u32TimeMsec--) { + delay_ms(1); + } +} + +/* + * @fn nm_bsp_register_isr + * @brief Register interrupt service routine + * @param[IN] pfIsr + * Pointer to ISR handler + */ +void nm_bsp_register_isr(tpfNmBspIsr pfIsr) +{ + struct extint_chan_conf config_extint_chan; + + gpfIsr = pfIsr; + + extint_chan_get_config_defaults(&config_extint_chan); + config_extint_chan.gpio_pin = CONF_WINC_SPI_INT_PIN; + config_extint_chan.gpio_pin_mux = CONF_WINC_SPI_INT_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(CONF_WINC_SPI_INT_EIC, &config_extint_chan); + extint_register_callback(chip_isr, CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + extint_chan_enable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); +} + +/* + * @fn nm_bsp_interrupt_ctrl + * @brief Enable/Disable interrupts + * @param[IN] u8Enable + * '0' disable interrupts. '1' enable interrupts + */ +void nm_bsp_interrupt_ctrl(uint8 u8Enable) +{ + if (u8Enable) { + extint_chan_enable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + } else { + extint_chan_disable_callback(CONF_WINC_SPI_INT_EIC, + EXTINT_CALLBACK_TYPE_DETECT); + } +} diff --git a/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c new file mode 100644 index 0000000..c681949 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bsp/source/nm_bsp_samd21_app.c @@ -0,0 +1,522 @@ +/** + * + * \file + * + * \brief This module contains SAMD21 BSP APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "bsp/include/nm_bsp_samd21_app.h" +#include "common/include/nm_common.h" + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) + + +#define SW1_PIN +#define SW1_MUX +#define SW1_LINE + +#ifdef WING_BOARD_WITH_LEDS_BUTTON +#define SW2_LINE 3 +#define SW2_PIN PIN_PB03 +#define SW2_MUX MUX_PB03A_EIC_EXTINT3 +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + +/* + --------------------------------- + ------ Module Pin Settings ------ + --------------------------------- +*/ + +#define LONG_PRESS_TIME (1500/TICK_RES) // ~2 sec +#define DEBOUNCE_TIME (40/TICK_RES) // ~50ms + +/* +* Structure +* +*/ +typedef struct +{ + tpfNmBspTimerCb pfCb; + uint32 u32Timeout; + uint32 u32Period; +} tstrTimer; + + +typedef struct +{ + tstrTimer strTimer; + uint8 u8Enabled; +} tstrWakeTimer; +/** +* +* Global variables +*/ +uint32 gu32Jiffies1ms; +uint32 gu32Jiffies20ms; + + +static uint16 gu16Btn1Cnt, gu16Btn2Cnt; +static tpfNmBspBtnPress gpfBtns; +static uint8 gu8BtnIfg; +static tstrTimer gstrTimer20ms, gstrTimer1ms, gstrConfigurableTimer; +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +static tstrWakeTimer gstrWakeTimer; +#endif + +struct tcc_module tcc_instance; +struct tcc_module configurable_tcc; +/** +* +* Static functions +*/ +static void btn_poll(void) +{ + bool btn_inactive; + if (gu8BtnIfg & SW1) { + if (gu16Btn1Cnt <= LONG_PRESS_TIME) { + gu16Btn1Cnt++; + } + if (gu16Btn1Cnt == LONG_PRESS_TIME) { + gpfBtns(SW1, 1); /* long press callback */ + } + btn_inactive = (port_pin_get_input_level(BUTTON_0_PIN) == BUTTON_0_INACTIVE); + if ((gu16Btn1Cnt >= DEBOUNCE_TIME) && (gu16Btn1Cnt < LONG_PRESS_TIME) + && btn_inactive) { + gpfBtns(SW1, 0); /* Short press callback */ + } + if (btn_inactive) + { + gu8BtnIfg &= ~SW1; + gu16Btn1Cnt = 0; + extint_chan_enable_callback(BUTTON_0_EIC_LINE, EXTINT_CALLBACK_TYPE_DETECT); + } + } + +#ifdef WING_BOARD_WITH_LEDS_BUTTON + if (gu8BtnIfg & SW2) { + if (gu16Btn2Cnt <= LONG_PRESS_TIME) { + gu16Btn2Cnt++; + } + if (gu16Btn2Cnt == LONG_PRESS_TIME) { + gpfBtns(SW2, 1); /* long press callback */ + } + btn_inactive = (port_pin_get_input_level(SW2_PIN) == BUTTON_0_INACTIVE); + if ((gu16Btn2Cnt >= DEBOUNCE_TIME) && (gu16Btn2Cnt < LONG_PRESS_TIME) + && btn_inactive) { + gpfBtns(SW2, 0); /* Short press callback */ + } + if (btn_inactive) + { + gu8BtnIfg &= ~SW2; + gu16Btn2Cnt = 0; + extint_chan_enable_callback(SW2_LINE, EXTINT_CALLBACK_TYPE_DETECT); + } + } +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ +} + +static void _tcc_callback_to_change_duty_cycle(struct tcc_module *const module_inst) +{ + gu32Jiffies1ms++; + if(gstrTimer1ms.pfCb) + gstrTimer1ms.pfCb(); + + if(gu32Jiffies1ms%20 == 0) + { +#ifdef _STATIC_PS_ + if((gstrWakeTimer.strTimer.pfCb)&&(gstrWakeTimer.u8Enabled)) + { + gu32Jiffies20ms+=(TICK_RES_SLEEP/TICK_RES); + } +else +#endif + { + gu32Jiffies20ms++; + } +#ifdef _STATIC_PS_ + if(gstrWakeTimer.strTimer.pfCb) + { + if(NM_BSP_TIME_MSEC >= gstrWakeTimer.strTimer.u32Timeout) + { + nm_bsp_wake_ctrl(0); + gstrWakeTimer.strTimer.pfCb(); + gstrWakeTimer.strTimer.u32Timeout = NM_BSP_TIME_MSEC + gstrWakeTimer.strTimer.u32Period; + } + } +#endif + if(gstrTimer20ms.pfCb) + { + if(NM_BSP_TIME_MSEC >= gstrTimer20ms.u32Timeout) + { + gstrTimer20ms.pfCb(); + gstrTimer20ms.u32Timeout = NM_BSP_TIME_MSEC + gstrTimer20ms.u32Period; + } + } + + btn_poll(); + } +} + +/* +* @fn _tcc_configurable_timer_callback +* @brief Configurable Timer Callback +* @date 08 October 2015 +* @version 1.0 +*/ + +static void _tcc_configurable_timer_callback(struct tcc_module *const module_inst) +{ + if(gstrConfigurableTimer.pfCb) + gstrConfigurableTimer.pfCb(); +} + + +static void timer0_init(void) +{ + + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, TCC0); + + //! [setup_change_config] + config_tcc.counter.period = 750; + config_tcc.counter.reload_action = TCC_RELOAD_ACTION_GCLK; + config_tcc.counter.clock_prescaler = TCC_CLOCK_PRESCALER_DIV64; + tcc_init(&tcc_instance, TCC0, &config_tcc); + tcc_enable(&tcc_instance); + + //! [setup_register_callback] + tcc_register_callback( + &tcc_instance, + _tcc_callback_to_change_duty_cycle, + TCC_CALLBACK_CHANNEL_0); + + tcc_enable_callback(&tcc_instance, + TCC_CALLBACK_CHANNEL_0); +} + +/* +* @fn configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ + +static void configurable_timer_init(uint32_t u32Period) +{ + struct tcc_config config_tcc; + tcc_get_config_defaults(&config_tcc, TCC1); + M2M_DBG("Timer period: %lu\r\n", u32Period); + + //! [setup_change_config] + config_tcc.counter.period = u32Period; + tcc_init(&configurable_tcc, TCC1, &config_tcc); + tcc_enable(&configurable_tcc); + + //! [setup_register_callback] + tcc_register_callback( + &configurable_tcc, + _tcc_configurable_timer_callback, + TCC_CALLBACK_OVERFLOW); +} + + +static void btn_isr(void) +{ + gu8BtnIfg |= SW1; + extint_chan_disable_callback(BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +} +#ifdef WING_BOARD_WITH_LEDS_BUTTON +static void btn2_isr(void) +{ + + gu8BtnIfg |= SW2; + extint_chan_disable_callback(SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +} +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + +/* +* @fn nm_bsp_init +* @brief Initialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M.S.M +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_init(void) +{ + gstrTimer20ms.pfCb = NULL; + gstrTimer20ms.u32Timeout = 0; + gstrTimer20ms.u32Period = 0; + +#ifdef _STATIC_PS_ + gstrWakeTimer.strTimer.pfCb = NULL; + gstrWakeTimer.strTimer.u32Timeout = 0; + gstrWakeTimer.strTimer.u32Period = ((uint32)-1); + gstrWakeTimer.u8Enabled = 0; +#endif + + gstrTimer1ms.pfCb = NULL; + gstrTimer1ms.u32Timeout = 0; + gstrTimer1ms.u32Period = 0; + + gstrConfigurableTimer.pfCb = NULL; + gstrConfigurableTimer.u32Timeout = 0; + gstrConfigurableTimer.u32Period = 0; + + timer0_init(); + + return M2M_SUCCESS; +} + +/* +* @fn nm_bsp_app_configurable_timer_init +* @brief Initialize the Configurable Timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_app_configurable_timer_init(uint32_t u32Period) +{ + configurable_timer_init(u32Period); +} + +/** +* @fn nm_bsp_deinit +* @brief De-iInitialize BSP +* @return 0 in case of success and -1 in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bsp_app_deinit(void) +{ + return M2M_SUCCESS; +} + +/* +* @fn nm_bsp_btn_init +* @brief Initialize buttons driver +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ + +void nm_bsp_btn_init(tpfNmBspBtnPress pfBtnCb) +{ + //struct port_config pin_conf; + struct extint_chan_conf config_extint_chan; + + gpfBtns = pfBtnCb; + gu8BtnIfg = 0; + gu16Btn1Cnt = 0; + gu16Btn2Cnt = 0; + +#ifdef WING_BOARD_WITH_LEDS_BUTTON + port_get_config_defaults(&pin_conf); + + /* Set buttons as inputs */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_UP; + port_pin_set_config(SW2_PIN, &pin_conf); + + + /*Configure SW1*/ + extint_chan_get_config_defaults(&config_extint_chan); + + config_extint_chan.gpio_pin = SW2_PIN; + config_extint_chan.gpio_pin_mux = SW2_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(SW2_LINE, &config_extint_chan); + + extint_register_callback(btn2_isr, + SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + extint_chan_enable_callback(SW2_LINE, + EXTINT_CALLBACK_TYPE_DETECT); +#endif /* WING_BOARD_WITH_LEDS_BUTTON */ + + /*Configure SW2*/ + extint_chan_get_config_defaults(&config_extint_chan); + + config_extint_chan.gpio_pin = BUTTON_0_EIC_PIN; + config_extint_chan.gpio_pin_mux = BUTTON_0_EIC_MUX; + config_extint_chan.gpio_pin_pull = EXTINT_PULL_UP; + config_extint_chan.detection_criteria = EXTINT_DETECT_FALLING; + + extint_chan_set_config(BUTTON_0_EIC_LINE, &config_extint_chan); + + extint_register_callback(btn_isr, + BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + + extint_chan_enable_callback(BUTTON_0_EIC_LINE, + EXTINT_CALLBACK_TYPE_DETECT); + +} + +/* +* @fn nm_bsp_uart_sendnm_bsp_uart_send +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_uart_send(const uint8 *pu8Buf, uint16 u16Sz) +{ + +} +/** +* @fn nm_bsp_start_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_start_timer(tpfNmBspTimerCb pfCb, uint32 u32Period) +{ + gstrTimer20ms.pfCb = pfCb; + gstrTimer20ms.u32Timeout = u32Period+ NM_BSP_TIME_MSEC; + gstrTimer20ms.u32Period = u32Period; +} + +/* +* @fn nm_bsp_start_1ms_timer +* @brief Start 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_1ms_timer(tpfNmBspTimerCb pfCb) +{ + gstrTimer1ms.pfCb = pfCb; +} + +/* +* @fn nm_bsp_start_configurable_timer +* @brief Start configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_start_configurable_timer(tpfNmBspTimerCb pfCb) +{ + tcc_enable_callback(&configurable_tcc, TCC_CALLBACK_OVERFLOW); + gstrConfigurableTimer.pfCb = pfCb; +} + +/** +* @fn nm_bsp_stop_timer +* @brief Start 20ms timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_stop_timer(void) +{ + gstrTimer20ms.pfCb = NULL; +} + +/* +* @fn nm_bsp_stop_1ms_timer +* @brief Stop 1ms timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_1ms_timer(void) +{ + gstrTimer1ms.pfCb = NULL; +} + +/* +* @fn nm_bsp_stop_configurable_timer +* @brief Stop configurable timer +* @date 08 October 2015 +* @version 1.0 +*/ +void nm_bsp_stop_configurable_timer(void) +{ + gstrConfigurableTimer.pfCb = NULL; + tcc_disable_callback(&configurable_tcc, TCC_CALLBACK_OVERFLOW); + tcc_disable(&configurable_tcc); +} + +#ifdef _STATIC_PS_ +/** +* @fn nm_bsp_register_wake_isr +* @brief REGISTER wake up timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_register_wake_isr(tpfNmBspIsr pfIsr,uint32 u32MsPeriod) +{ + + gstrWakeTimer.strTimer.pfCb = pfIsr; + gstrWakeTimer.strTimer.u32Timeout = u32MsPeriod + NM_BSP_TIME_MSEC; + gstrWakeTimer.strTimer.u32Period = u32MsPeriod; + gstrWakeTimer.u8Enabled = 0; +} +/** +* @fn nm_bsp_wake_ctrl +* @brief control wake up timer +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_wake_ctrl(uint8 en) +{ + gstrWakeTimer.u8Enabled = en; + if(en) + { + gstrWakeTimer.strTimer.u32Timeout = gstrWakeTimer.strTimer.u32Period + NM_BSP_TIME_MSEC; + } +} +#endif +#if (defined _STATIC_PS_)||(defined _DYNAMIC_PS_) +/** +* @fn nm_bsp_enable_mcu_ps +* @brief Start POWER SAVE FOR MCU +* @author M.S.M +* @date 28 OCT 2013 +* @version 1.0 +*/ +void nm_bsp_enable_mcu_ps(void) +{ + if(!gu8BtnIfg) + { + if(gstrWakeTimer.u8Enabled) + { + + } + } +} +#endif + + diff --git a/ChaloupeLora.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h b/ChaloupeLora.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h new file mode 100644 index 0000000..6c680e4 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bus_wrapper/include/nm_bus_wrapper.h @@ -0,0 +1,189 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus wrapper APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_BUS_WRAPPER_H_ +#define _NM_BUS_WRAPPER_H_ + +#include "common/include/nm_common.h" + +/** + BUS Type +**/ +#define NM_BUS_TYPE_I2C ((uint8)0) +#define NM_BUS_TYPE_SPI ((uint8)1) +#define NM_BUS_TYPE_UART ((uint8)2) +/** + IOCTL commands +**/ +#define NM_BUS_IOCTL_R ((uint8)0) /*!< Read only ==> I2C/UART. Parameter:tstrNmI2cDefault/tstrNmUartDefault */ +#define NM_BUS_IOCTL_W ((uint8)1) /*!< Write only ==> I2C/UART. Parameter type tstrNmI2cDefault/tstrNmUartDefault*/ +#define NM_BUS_IOCTL_W_SPECIAL ((uint8)2) /*!< Write two buffers within the same transaction + (same start/stop conditions) ==> I2C only. Parameter:tstrNmI2cSpecial */ +#define NM_BUS_IOCTL_RW ((uint8)3) /*!< Read/Write at the same time ==> SPI only. Parameter:tstrNmSpiRw */ + +#define NM_BUS_IOCTL_WR_RESTART ((uint8)4) /*!< Write buffer then made restart condition then read ==> I2C only. parameter:tstrNmI2cSpecial */ +/** +* @struct tstrNmBusCapabilities +* @brief Structure holding bus capabilities information +* @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI +*/ +typedef struct +{ + uint16 u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +/** +* @struct tstrNmI2cDefault +* @brief Structure holding I2C default operation parameters +* @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W +*/ +typedef struct +{ + uint8 u8SlaveAdr; + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmI2cDefault; + +/** +* @struct tstrNmI2cSpecial +* @brief Structure holding I2C special operation parameters +* @sa NM_BUS_IOCTL_W_SPECIAL +*/ +typedef struct +{ + uint8 u8SlaveAdr; + uint8 *pu8Buf1; /*!< pointer to the 1st buffer */ + uint8 *pu8Buf2; /*!< pointer to the 2nd buffer */ + uint16 u16Sz1; /*!< 1st buffer size */ + uint16 u16Sz2; /*!< 2nd buffer size */ +} tstrNmI2cSpecial; + +/** +* @struct tstrNmSpiRw +* @brief Structure holding SPI R/W parameters +* @sa NM_BUS_IOCTL_RW +*/ +typedef struct +{ + uint8 *pu8InBuf; /*!< pointer to input buffer. + Can be set to null and in this case zeros should be sent at MOSI */ + uint8 *pu8OutBuf; /*!< pointer to output buffer. + Can be set to null and in this case data from MISO can be ignored */ + uint16 u16Sz; /*!< Transfere size */ +} tstrNmSpiRw; + + +/** +* @struct tstrNmUartDefault +* @brief Structure holding UART default operation parameters +* @sa NM_BUS_IOCTL_R, NM_BUS_IOCTL_W +*/ +typedef struct +{ + uint8 *pu8Buf; /*!< Operation buffer */ + uint16 u16Sz; /*!< Operation size */ +} tstrNmUartDefault; +/*!< Bus capabilities. This structure must be declared at platform specific bus wrapper */ +extern tstrNmBusCapabilities egstrNmBusCapabilities; + + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @param [in] req_com_port +* Used to choose com port assigned to device like edbg +* @param [in] req_serial_number +* Used to choose peripheral, eg if 2 aardvark's are connected to pc. +* Pass 0 to select first/only or if using UART. +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_init(uint8 *req_com_port, uint32 req_serial_number); + +/** +* @fn nm_bus_ioctl +* @brief send/receive from the bus +* @param [in] u8Cmd +* IOCTL command for the operation +* @param [in] pvParameter +* Arbitrary parameter depending on IOCTL +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +* @note For SPI only, it's important to be able to send/receive at the same time +*/ +sint8 nm_bus_ioctl(uint8 u8Cmd, void* pvParameter); + +/** +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_deinit(void); + +/* +* @fn nm_bus_reinit +* @brief re-initialize the bus wrapper +* @param [in] void *config +* re-init configuration data +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_reinit(void *); +/* +* @fn nm_bus_get_chip_type +* @brief get chip type +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +#ifdef CONF_WINC_USE_UART +uint8 nm_bus_get_chip_type(void); +uint8 nm_bus_get_sb_type(void); +#endif + +/* +* @fn spi_rw +* @brief Process SPI Read/Write operation +* @param pu8Mosi TX Data buffer +* @param pu8Miso RX Data buffer +* @param u16Sz Transfer length +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +#ifdef CONF_WINC_USE_SPI +sint8 nm_spi_rw(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz); +#endif + +#ifdef __cplusplus + } + #endif + +#endif /*_NM_BUS_WRAPPER_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c b/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c new file mode 100644 index 0000000..a227973 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.c @@ -0,0 +1,215 @@ +/** + * + * \file + * + * \brief This module contains NMC1000 bus wrapper APIs implementation. + * + * Copyright (c) 2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "define.h" +#include "BoardCfg.h" +#include "SPI.h" +//#include "atmel_start.h" +//#include "winc_init.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = {NM_BUS_MAX_TRX_SZ}; +unsigned char mWifiSPIBaudrate; + + +sint8 nm_spi_rw(uint8 *pu8Mosi, uint8 *pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + + if (!u8SkipMiso) + { + while(u16Sz-- != 0) + { + uint8 tmp; + WIFI_SPI_SS_PIN = 0; + tmp = SPITransaction(0x00,mWifiSPIBaudrate); + WIFI_SPI_SS_PIN = 1; + //tmp = SPITransaction(0xDE); + *pu8Miso++ = tmp; + } + } + if (!u8SkipMosi) + { + while(u16Sz-- != 0) + { + uint8 tmp; + WIFI_SPI_SS_PIN = 0; + tmp = SPITransaction(*pu8Mosi++,mWifiSPIBaudrate); //assign to tmp for debug purposes only. + WIFI_SPI_SS_PIN = 1; + } + } + WIFI_SPI_SS_PIN = 1; + + + /*uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + + if (!pu8Mosi) + { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if (!pu8Miso) + { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else + { + return M2M_ERR_BUS_FAIL; + } + + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, false); + if (!u8SkipMiso) { + io_read(io, pu8Miso, u16Sz); + } + if (!u8SkipMosi) { + io_write(io, pu8Mosi, u16Sz); + } + gpio_set_pin_level(CONF_WINC_PIN_CHIP_SELECT, true);*/ + + return M2M_SUCCESS; +} + +/* + * @fn nm_bus_init + * @brief Initialize the bus wrapper + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +//sint8 nm_bus_init(void *pvinit) +sint8 nm_bus_init(uint8 *req_com_port, uint32 req_serial_number) +{ + sint8 result = M2M_SUCCESS; + mWifiSPIBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, WIFI_MODULE_SPI_BAUDRATE); + nm_bsp_reset(); + nm_bsp_sleep(1); + return result; +} + + + + //JFM The SPI module has been initialized in InitBoard() + //so the two following lines are not needed. +/* spi_m_sync_get_io_descriptor(spi_instance, &io); + spi_m_sync_enable(spi_instance);/* + + nm_bsp_reset(); + nm_bsp_sleep(1); + + return result; +} + +/* + * @fn nm_bus_ioctl + * @brief send/receive from the bus + * @param[IN] u8Cmd + * IOCTL command for the operation + * @param[IN] pvParameter + * Arbitrary parameter depenging on IOCTL + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @note For SPI only, it's important to be able to send/receive at the same time + */ +sint8 nm_bus_ioctl(uint8 u8Cmd, void *pvParameter) +{ + sint8 s8Ret = 0; + switch (u8Cmd) + { + case NM_BUS_IOCTL_RW: + { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = nm_spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + break; + } + + + default: + { + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + } + return s8Ret; +} + +/* + * @fn nm_bus_deinit + * @brief De-initialize the bus wrapper + */ +sint8 nm_bus_deinit(void) +{ + sint8 result = 0; + return result; +} +/* + * @fn nm_bus_reinit + * @brief re-initialize the bus wrapper + * @param [in] void *config + * re-init configuration data + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +sint8 nm_bus_reinit(void *config) +{ + return M2M_SUCCESS; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c b/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c new file mode 100644 index 0000000..d2183ab --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/bus_wrapper/source/nm_bus_wrapper_samd21.c @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus wrapper APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "spi.h" +#include "port.h" +#include "conf_winc.h" + +#define NM_BUS_MAX_TRX_SZ 256 + +tstrNmBusCapabilities egstrNmBusCapabilities = +{ + NM_BUS_MAX_TRX_SZ +}; + +#ifdef CONF_WINC_USE_I2C + +struct i2c_master_module i2c_master_instance; +#define SLAVE_ADDRESS 0x60 + +/** Number of times to try to send packet if failed. */ +#define I2C_TIMEOUT 100 + +static sint8 nm_i2c_write(uint8 *b, uint16 sz) +{ + sint8 result = M2M_SUCCESS; + uint16_t timeout = 0; + + struct i2c_master_packet packet = { + .address = SLAVE_ADDRESS, + .data_length = sz, + .data = b, + }; + + /* Write buffer to slave until success. */ + while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { + /* Increment timeout counter and check if timed out. */ + if (timeout++ == I2C_TIMEOUT) { + break; + } + } + + return result; +} + +static sint8 nm_i2c_read(uint8 *rb, uint16 sz) +{ + uint16_t timeout = 0; + sint8 result = M2M_SUCCESS; + struct i2c_master_packet packet = { + .address = SLAVE_ADDRESS, + .data_length = sz, + .data = rb, + }; + + /* Write buffer to slave until success. */ + while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { + /* Increment timeout counter and check if timed out. */ + if (timeout++ == I2C_TIMEOUT) { + break; + } + } + + return result; +} + +static sint8 nm_i2c_write_special(uint8 *wb1, uint16 sz1, uint8 *wb2, uint16 sz2) +{ + static uint8 tmp[NM_BUS_MAX_TRX_SZ]; + m2m_memcpy(tmp, wb1, sz1); + m2m_memcpy(&tmp[sz1], wb2, sz2); + return nm_i2c_write(tmp, sz1+sz2); +} +#endif + +#ifdef CONF_WINC_USE_SPI + +struct spi_module master; +struct spi_slave_inst slave_inst; + +#ifdef CONF_WINC_SPI_DMA +static volatile bool spi_dma_tx_done; +static volatile bool spi_dma_rx_done; +struct dma_resource dma_res_tx; +struct dma_resource dma_res_rx; +COMPILER_ALIGNED(32) DmacDescriptor dma_dsc_tx; +COMPILER_ALIGNED(32) DmacDescriptor dma_dsc_rx; +struct dma_descriptor_config dma_cfg_rx; +struct dma_descriptor_config dma_cfg_tx; + +static void spi_dma_tx_completion_callback(const struct dma_resource* const resource) +{ + spi_dma_tx_done = true; +} +static void spi_dma_rx_completion_callback(const struct dma_resource* const resource) +{ + spi_dma_rx_done = true; +} + +static inline sint8 spi_rw_dma(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ + uint32_t dummy_buf = 0; + spi_dma_tx_done = false; + spi_dma_rx_done = false; + + dma_cfg_tx.block_transfer_count = u16Sz; + dma_cfg_rx.block_transfer_count = u16Sz; + + if (pu8Mosi) { + dma_cfg_tx.src_increment_enable = true; + dma_cfg_tx.source_address = (uint32_t)pu8Mosi + u16Sz; + } else { + dma_cfg_tx.src_increment_enable = false; + dma_cfg_tx.source_address = &dummy_buf; + } + dma_descriptor_create(&dma_dsc_tx, &dma_cfg_tx); + + if (pu8Miso) { + dma_cfg_rx.dst_increment_enable = true; + dma_cfg_rx.destination_address = (uint32_t)pu8Miso + u16Sz; + } else { + dma_cfg_rx.dst_increment_enable = false; + dma_cfg_rx.destination_address = &dummy_buf; + } + dma_descriptor_create(&dma_dsc_rx, &dma_cfg_rx); + + spi_select_slave(&master, &slave_inst, true); + dma_start_transfer_job(&dma_res_rx); + dma_start_transfer_job(&dma_res_tx); + while((!spi_dma_tx_done) && (!spi_dma_rx_done)) + ; + spi_select_slave(&master, &slave_inst, false); + + return M2M_SUCCESS; +} +#endif //CONF_WINC_SPI_DMA + +static inline sint8 spi_rw_pio(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ + uint8 u8Dummy = 0; + uint8 u8SkipMosi = 0, u8SkipMiso = 0; + uint16_t txd_data = 0; + uint16_t rxd_data = 0; + + if (!pu8Mosi) { + pu8Mosi = &u8Dummy; + u8SkipMosi = 1; + } + else if(!pu8Miso) { + pu8Miso = &u8Dummy; + u8SkipMiso = 1; + } + else { + return M2M_ERR_BUS_FAIL; + } + + spi_select_slave(&master, &slave_inst, true); + + while (u16Sz) { + txd_data = *pu8Mosi; + while (!spi_is_ready_to_write(&master)) + ; + while(spi_write(&master, txd_data) != STATUS_OK) + ; + + /* Read SPI master data register. */ + while (!spi_is_ready_to_read(&master)) + ; + while (spi_read(&master, &rxd_data) != STATUS_OK) + ; + *pu8Miso = rxd_data; + + u16Sz--; + if (!u8SkipMiso) + pu8Miso++; + if (!u8SkipMosi) + pu8Mosi++; + } + + while (!spi_is_write_complete(&master)) + ; + + spi_select_slave(&master, &slave_inst, false); + + return M2M_SUCCESS; +} + +sint8 nm_spi_rw(uint8* pu8Mosi, uint8* pu8Miso, uint16 u16Sz) +{ +#ifdef CONF_WINC_SPI_DMA + if (u16Sz >= 8) { + return spi_rw_dma(pu8Mosi, pu8Miso, u16Sz); + } + else +#endif //CONF_WINC_SPI_DMA + { + return spi_rw_pio(pu8Mosi, pu8Miso, u16Sz); + } +} + +#endif + +/* +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_init(uint8 *pvinit, uint32 req_serial_number) +{ + sint8 result = M2M_SUCCESS; + +#ifdef CONF_WINC_USE_I2C + /* Initialize config structure and software module. */ + struct i2c_master_config config_i2c_master; + i2c_master_get_config_defaults(&config_i2c_master); + + /* Change buffer timeout to something longer. */ + config_i2c_master.buffer_timeout = 1000; + + /* Initialize and enable device with config. */ + i2c_master_init(&i2c_master_instance, SERCOM2, &config_i2c_master); + + i2c_master_enable(&i2c_master_instance); + +#elif defined CONF_WINC_USE_SPI + /* Structure for SPI configuration. */ + struct spi_config config; + struct spi_slave_inst_config slave_config; + + /* Select SPI slave CS pin. */ + /* This step will set the CS high */ + spi_slave_inst_get_config_defaults(&slave_config); + slave_config.ss_pin = CONF_WINC_SPI_CS_PIN; + spi_attach_slave(&slave_inst, &slave_config); + + /* Configure the SPI master. */ + spi_get_config_defaults(&config); + config.mux_setting = CONF_WINC_SPI_SERCOM_MUX; + config.pinmux_pad0 = CONF_WINC_SPI_PINMUX_PAD0; + config.pinmux_pad1 = CONF_WINC_SPI_PINMUX_PAD1; + config.pinmux_pad2 = CONF_WINC_SPI_PINMUX_PAD2; + config.pinmux_pad3 = CONF_WINC_SPI_PINMUX_PAD3; + config.master_slave_select_enable = false; + + config.mode_specific.master.baudrate = CONF_WINC_SPI_CLOCK; + if (spi_init(&master, CONF_WINC_SPI_MODULE, &config) != STATUS_OK) { + return M2M_ERR_BUS_FAIL; + } + + /* Enable the SPI master. */ + spi_enable(&master); + +#ifdef CONF_WINC_SPI_DMA + { + struct dma_resource_config dma_config; + spi_dma_tx_done = false; + spi_dma_rx_done = false; + dma_get_config_defaults(&dma_config); + dma_config.peripheral_trigger = CONF_WINC_SPI_DMA_PERIPHERAL_TRIGGER_RX; + dma_config.trigger_action = DMA_TRIGGER_ACTON_BEAT; + dma_allocate(&dma_res_rx, &dma_config); + dma_add_descriptor(&dma_res_rx, &dma_dsc_rx); + dma_register_callback(&dma_res_rx, spi_dma_rx_completion_callback, DMA_CALLBACK_TRANSFER_DONE); + dma_enable_callback(&dma_res_rx, DMA_CALLBACK_TRANSFER_DONE); + + dma_get_config_defaults(&dma_config); + dma_config.peripheral_trigger = CONF_WINC_SPI_DMA_PERIPHERAL_TRIGGER_TX; + dma_config.trigger_action = DMA_TRIGGER_ACTON_BEAT; + dma_allocate(&dma_res_tx, &dma_config); + dma_add_descriptor(&dma_res_tx, &dma_dsc_tx); + dma_register_callback(&dma_res_tx, spi_dma_tx_completion_callback, DMA_CALLBACK_TRANSFER_DONE); + dma_enable_callback(&dma_res_tx, DMA_CALLBACK_TRANSFER_DONE); + + dma_descriptor_get_config_defaults(&dma_cfg_rx); + dma_descriptor_get_config_defaults(&dma_cfg_tx); + dma_cfg_tx.destination_address = (uint32_t)(&master.hw->SPI.DATA.reg); + dma_cfg_tx.dst_increment_enable = false; + dma_cfg_rx.source_address = (uint32_t)(&master.hw->SPI.DATA.reg); + dma_cfg_rx.src_increment_enable = false; + } +#endif + + nm_bsp_reset(); + nm_bsp_sleep(1); +#endif + return result; +} + +/* +* @fn nm_bus_ioctl +* @brief send/receive from the bus +* @param[IN] u8Cmd +* IOCTL command for the operation +* @param[IN] pvParameter +* Arbitrary parameter depenging on IOCTL +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @note For SPI only, it's important to be able to send/receive at the same time +*/ +sint8 nm_bus_ioctl(uint8 u8Cmd, void* pvParameter) +{ + sint8 s8Ret = 0; + switch(u8Cmd) + { +#ifdef CONF_WINC_USE_I2C + case NM_BUS_IOCTL_R: { + tstrNmI2cDefault *pstrParam = (tstrNmI2cDefault *)pvParameter; + s8Ret = nm_i2c_read(pstrParam->pu8Buf, pstrParam->u16Sz); + } + break; + case NM_BUS_IOCTL_W: { + tstrNmI2cDefault *pstrParam = (tstrNmI2cDefault *)pvParameter; + s8Ret = nm_i2c_write(pstrParam->pu8Buf, pstrParam->u16Sz); + } + break; + case NM_BUS_IOCTL_W_SPECIAL: { + tstrNmI2cSpecial *pstrParam = (tstrNmI2cSpecial *)pvParameter; + s8Ret = nm_i2c_write_special(pstrParam->pu8Buf1, pstrParam->u16Sz1, pstrParam->pu8Buf2, pstrParam->u16Sz2); + } + break; +#elif defined CONF_WINC_USE_SPI + case NM_BUS_IOCTL_RW: { + tstrNmSpiRw *pstrParam = (tstrNmSpiRw *)pvParameter; + s8Ret = nm_spi_rw(pstrParam->pu8InBuf, pstrParam->pu8OutBuf, pstrParam->u16Sz); + } + break; +#endif + default: + s8Ret = -1; + M2M_ERR("invalide ioclt cmd\n"); + break; + } + + return s8Ret; +} + +/* +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +*/ +sint8 nm_bus_deinit(void) +{ + sint8 result = M2M_SUCCESS; + struct port_config pin_conf; + + port_get_config_defaults(&pin_conf); + /* Configure control pins as input no pull up. */ + pin_conf.direction = PORT_PIN_DIR_INPUT; + pin_conf.input_pull = PORT_PIN_PULL_NONE; + +#ifdef CONF_WINC_USE_I2C + i2c_master_disable(&i2c_master_instance); + port_pin_set_config(CONF_WINC_I2C_SCL, &pin_conf); + port_pin_set_config(CONF_WINC_I2C_SDA, &pin_conf); +#endif /* CONF_WINC_USE_I2C */ +#ifdef CONF_WINC_USE_SPI + nm_bsp_deinit(); + + spi_disable(&master); + port_pin_set_config(CONF_WINC_SPI_MOSI, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_MISO, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_SCK, &pin_conf); + port_pin_set_config(CONF_WINC_SPI_SS, &pin_conf); + + //port_pin_set_output_level(CONF_WINC_SPI_MOSI, false); + //port_pin_set_output_level(CONF_WINC_SPI_MISO, false); + //port_pin_set_output_level(CONF_WINC_SPI_SCK, false); + //port_pin_set_output_level(CONF_WINC_SPI_SS, false); +#endif /* CONF_WINC_USE_SPI */ + return result; +} +/* +* @fn nm_bus_reinit +* @brief re-initialize the bus wrapper +* @param [in] void *config +* re-init configuration data +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_reinit(void* config) +{ + return M2M_SUCCESS; +} + diff --git a/ChaloupeLora.X/Source/winc3400/common/include/nm_common.h b/ChaloupeLora.X/Source/winc3400/common/include/nm_common.h new file mode 100644 index 0000000..619957a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/common/include/nm_common.h @@ -0,0 +1,242 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup COMMON COMMON +*/ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include "bsp/include/nm_bsp.h" +#include "common/include/nm_debug.h" + +/**@defgroup COMMONDEF Defines + * @ingroup COMMON + */ +/**@{*/ +#define M2M_TIME_OUT_DELAY 10000 + +/*states*/ +#define M2M_SUCCESS ((sint8)0) +#define M2M_ERR_SEND ((sint8)-1) +#define M2M_ERR_RCV ((sint8)-2) +#define M2M_ERR_MEM_ALLOC ((sint8)-3) +#define M2M_ERR_TIME_OUT ((sint8)-4) +#define M2M_ERR_INIT ((sint8)-5) +#define M2M_ERR_BUS_FAIL ((sint8)-6) +#define M2M_NOT_YET ((sint8)-7) +#define M2M_ERR_FIRMWARE ((sint8)-8) +#define M2M_SPI_FAIL ((sint8)-9) +#define M2M_ERR_FIRMWARE_bURN ((sint8)-10) +#define M2M_ACK ((sint8)-11) +#define M2M_ERR_FAIL ((sint8)-12) +#define M2M_ERR_FW_VER_MISMATCH ((sint8)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((sint8)-14) +/* +Invalid argument +*/ +#define M2M_ERR_INVALID_ARG ((sint8)-15) + +/*i2c MAASTER ERR*/ +#define I2C_ERR_LARGE_ADDRESS 0xE1UL /*!< the address exceed the max addressing mode in i2c flash*/ +#define I2C_ERR_TX_ABRT 0xE2UL /*!< NO ACK from slave*/ +#define I2C_ERR_OVER_SIZE 0xE3UL /**/ +#define ERR_PREFIX_NMIS 0xE4UL /*!< wrong first four byte in flash NMIS*/ +#define ERR_FIRMEWARE_EXCEED_SIZE 0xE5UL /*!< Total size of firmware exceed the max size 256k*/ +/**/ +#define PROGRAM_START 0x26961735UL +#define BOOT_SUCCESS 0x10add09eUL +#define BOOT_START 0x12345678UL + + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +/*! Maximum of two values */ +#define M2M_MAX(A,B) ((A) > (B) ? (A) : (B)) +/*! Choose one of three values */ +#define M2M_SEL(x,m1,m2,m3) ((x>1)?((x>2)?(m3):(m2)):(m1)) +/*! Align to next multiple of 4 */ +#define WORD_ALIGN(val) (((val) & 0x03) ? ((val) + 4 - ((val) & 0x03)) : (val)) + + + +#define DATA_PKT_OFFSET 4 + +#ifndef BIG_ENDIAN +/*! Most significant byte of 32bit word (LE) */ +#define BYTE_0(word) ((uint8)(((word) >> 0 ) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (LE) */ +#define BYTE_1(word) ((uint8)(((word) >> 8 ) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (LE) */ +#define BYTE_2(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (LE) */ +#define BYTE_3(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +#else +/*! Most significant byte of 32bit word (BE) */ +#define BYTE_0(word) ((uint8)(((word) >> 24) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (BE) */ +#define BYTE_1(word) ((uint8)(((word) >> 16) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (BE) */ +#define BYTE_2(word) ((uint8)(((word) >> 8 ) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (BE) */ +#define BYTE_3(word) ((uint8)(((word) >> 0 ) & 0x000000FFUL)) +#endif +/**@}*/ + +#ifdef __cplusplus + extern "C" { + #endif +/**@defgroup COMMONAPI Functions + * @ingroup COMMON + */ +/**@{*/ + +/*! + * @fn void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz); + * @brief Copy specified number of bytes from source buffer to destination buffer + * @param [in] sz + * number of data bytes to copy + * @param [in] pSrc + * source buffer + * @param [out] pDst + * destination buffer +* @return None + */ +NMI_API void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz); +/*! + * @fn void m2m_memset(uint8* pBuf,uint8 val,uint32 sz); + * @brief Set specified number of data bytes in specified data buffer to specified value + * @param [in] sz + * number of data bytes (in specified data buffer whose values are to be set to the specified value) + * @param [in] val + * the specified value (to which data bytes in data buffer will be set) + * @param [out] pBuf + * the specified data buffer (whose data bytes will be set to the specified value) + * @return None + */ +NMI_API void m2m_memset(uint8* pBuf,uint8 val,uint32 sz); +/*! + * @fn uint16 m2m_strlen(uint8 * pcStr); + * @brief Returns the string length of a null terminated string buffer + * @param [in] pcStr + * null terminated string buffer + * @return length of the string in the specified string buffer + */ +NMI_API uint16 m2m_strlen(uint8 * pcStr); +/*! + * @fn sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size); + * @brief Compare specified number of data bytes in pu8Buff1 and pu8Buff2 and decide if they all match. + * @param [in] u32Size + * number of data bytes to compare + * @param [in] pu8Buff1 + * one of two data buffers for the comparison + * @param [in] pu8Buff2 + * one of two data buffers for the comparison + * @return zero if matched, one if not matched + */ +NMI_API sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size); +/*! + * @fn uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); + * @brief Compare specified number of data bytes in string buffers pcS1 and pcS2 + * @param [in] u16Len + * Number of data bytes to compare + * @param [in] pcS1 + * first of two string buffers for the comparison + * @param [in] pcS2 + * second of two string buffers for the comparison + * @return 0 if matched, -1 if the first non-matching byte in pcS1 is smaller than that in pcS2, +1 if it is bigger + */ +NMI_API uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len); +/*! + * @fn uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr); + * @brief Find the occurrence of pcStr string in pcIn string + * @param [in] pcStr + * one of two string buffers + * @param [in] pcIn + * one of two string buffers + * @return If pcStr string is part of pcIn string return a valid pointer to the start of pcStr within pcIn. If not a NULL Pointer is returned + */ +NMI_API uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr); +/*! + * @fn uint8 m2m_checksum(uint8* buf, int sz); + * @brief calculates checksum for the specified number of data bytes in specified data buffer + * @param [in] sz + * number of data bytes used in the checksum calculation + * @param [in] buf + * the specified data buffer (whose data bytes will be used to calculate the checksum) + * @return the calculated checksum + */ +NMI_API uint8 m2m_checksum(uint8* buf, int sz); + +/*! + * @fn void (*at_sb_printf)(const char *_format, ...); + * @brief chooses which function to use in order to output debug + */ +NMI_API void (*at_sb_printf)(const char *_format, ...); +/**@}*/ +#ifdef __cplusplus +} + #endif +#endif /*_NM_COMMON_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400/common/include/nm_debug.h b/ChaloupeLora.X/Source/winc3400/common/include/nm_debug.h new file mode 100644 index 0000000..28b14ff --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/common/include/nm_debug.h @@ -0,0 +1,108 @@ +/** + * + * \file + * + * \brief This module contains debug APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + +#include "bsp/include/nm_bsp.h" +#include "bsp/include/nm_bsp_internal.h" + +#define M2M_LOG_NONE 0 +#define M2M_LOG_ERROR 1 +#define M2M_LOG_INFO 2 +#define M2M_LOG_REQ 3 +#define M2M_LOG_DBG 4 + + +#define M2M_LOG_LEVEL M2M_LOG_DBG + +/**/ +#if !((defined __MSP430FR5739)||(defined __MCF964548__)) + +#define M2M_ERR(...) +#define M2M_INFO(...) +#define M2M_REQ(...) +#define M2M_DBG(...) + +#if (CONF_WINC_DEBUG == 1) +#define M2M_PRINT(...) do{CONF_WINC_PRINTF(__VA_ARGS__);}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_ERROR) +#undef M2M_ERR +#define M2M_ERR(...) do{CONF_WINC_PRINTF("(APP)(ERR)[%s][%d]",__FUNCTION__,__LINE__); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_INFO) +#undef M2M_INFO +#define M2M_INFO(...) do{CONF_WINC_PRINTF("(APP)(INFO)"); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_REQ) +#undef M2M_REQ +#define M2M_REQ(...) do{CONF_WINC_PRINTF("(APP)(R)"); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#if (M2M_LOG_LEVEL >= M2M_LOG_DBG) +#undef M2M_DBG +#define M2M_DBG(...) do{CONF_WINC_PRINTF("(APP)(DBG)[%s][%d]",__FUNCTION__,__LINE__); CONF_WINC_PRINTF(__VA_ARGS__);CONF_WINC_PRINTF("\r");}while(0) +#endif +#endif +#endif +#endif +#else +#define M2M_ERR(...) +#define M2M_DBG(...) +#define M2M_REQ(...) +#define M2M_INFO(...) +#define M2M_PRINT(...) +#endif +#else +#if (!defined __MCF964548__)||(!defined __SAMD21J18A__) +static void M2M_ERR(const char *_format, ...) //__attribute__ ((__format__ (M2M_ERR, 1, 2))) +{ +} +static void M2M_DBG(const char *_format, ...) //__attribute__ ((__format__ (M2M_DBG, 1, 2))) +{ +} +static void M2M_REQ(const char *_format, ...) //__attribute__ ((__format__ (M2M_DBG, 1, 2))) +{ +} +static void M2M_INFO(const char *_format, ...) // __attribute__ ((__format__ (M2M_INFO, 1, 2))) +{ + +} +static void M2M_PRINT(const char *_format, ...) // __attribute__ ((__format__ (M2M_INFO, 1, 2))) +{ + +} +static void CONF_WINC_PRINTF(const char *_format, ...) +{ +} +#endif +#endif + +#endif /* _NM_DEBUG_H_ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/common/source/nm_common.c b/ChaloupeLora.X/Source/winc3400/common/source/nm_common.c new file mode 100644 index 0000000..6c3e99f --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/common/source/nm_common.c @@ -0,0 +1,129 @@ +/** + * + * \file + * + * \brief This module contains common APIs declarations. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +void m2m_memcpy(uint8* pDst,uint8* pSrc,uint32 sz) +{ + if(sz == 0) return; + do + { + *pDst = *pSrc; + pDst++; + pSrc++; + }while(--sz); +} +uint8 m2m_checksum(uint8* buf, int sz) +{ + uint8 cs = 0; + while(--sz) + { + cs ^= *buf; + buf++; + } + + return cs; +} + +void m2m_memset(uint8* pBuf,uint8 val,uint32 sz) +{ + if(sz == 0) return; + do + { + *pBuf = val; + pBuf++; + }while(--sz); +} + +uint16 m2m_strlen(uint8 * pcStr) +{ + uint16 u16StrLen = 0; + while(*pcStr) + { + u16StrLen ++; + pcStr++; + } + return u16StrLen; +} + +uint8 m2m_strncmp(uint8 *pcS1, uint8 *pcS2, uint16 u16Len) +{ + for ( ; u16Len > 0; pcS1++, pcS2++, --u16Len) + if (*pcS1 != *pcS2) + return ((*(uint8 *)pcS1 < *(uint8 *)pcS2) ? -1 : +1); + else if (*pcS1 == '\0') + return 0; + return 0; +} + +/* Finds the occurance of pcStr in pcIn. +If pcStr is part of pcIn it returns a valid pointer to the start of pcStr within pcIn. +Otherwise a NULL Pointer is returned. +*/ +uint8 * m2m_strstr(uint8 *pcIn, uint8 *pcStr) +{ + uint8 u8c; + uint16 u16StrLen; + + u8c = *pcStr++; + if (!u8c) + return (uint8 *) pcIn; // Trivial empty string case + + u16StrLen = m2m_strlen(pcStr); + do { + uint8 u8Sc; + + do { + u8Sc = *pcIn++; + if (!u8Sc) + return (uint8 *) 0; + } while (u8Sc != u8c); + } while (m2m_strncmp(pcIn, pcStr, u16StrLen) != 0); + + return (uint8 *) (pcIn - 1); +} + +sint8 m2m_memcmp(uint8 *pu8Buff1,uint8 *pu8Buff2 ,uint32 u32Size) +{ + uint32 i; + sint8 s8Result = 0; + for(i = 0 ; i < u32Size ; i++) + { + if(pu8Buff1[i] != pu8Buff2[i]) + { + s8Result = 1; + break; + } + } + return s8Result; +} diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/ecc_types.h b/ChaloupeLora.X/Source/winc3400/driver/include/ecc_types.h new file mode 100644 index 0000000..1e50b71 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/ecc_types.h @@ -0,0 +1,238 @@ +/** + * + * \file + * + * \brief WINC Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + +#if 0 +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +#endif +/*!< +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve{ + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +}tenuEcNamedCurve; + + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint{ + uint8 X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8 Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16 u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16 u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +}tstrECPoint; + + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam{ + uint32 p[ECC_POINT_MAX_SIZE_WORDS]; + uint32 a[ECC_POINT_MAX_SIZE_WORDS]; + uint32 b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +}tstrECDomainParam; + + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct{ + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +}tstrEllipticCurve; + + +typedef enum{ + ECC_REQ_NONE, + ECC_REQ_CLIENT_ECDH, + ECC_REQ_SERVER_ECDH, + ECC_REQ_GEN_KEY, + ECC_REQ_SIGN_GEN, + ECC_REQ_SIGN_VERIFY +}tenuEccREQ; + + +typedef struct{ + tstrECPoint strPubKey; + uint8 au8Key[ECC_POINT_MAX_SIZE]; +}tstrEcdhReqInfo; + + +typedef struct{ + uint32 u32nSig; +}tstrEcdsaVerifyReqInfo; + + +typedef struct{ + uint16 u16CurveType; + uint16 u16HashSz; +}tstrEcdsaSignReqInfo; + + +typedef struct{ + uint16 u16REQ; + uint16 u16Status; + uint32 u32UserData; + uint32 u32SeqNo; + union{ + tstrEcdhReqInfo strEcdhREQ; + tstrEcdsaSignReqInfo strEcdsaSignREQ; + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + }; +}tstrEccReqInfo; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#if 0 +static tstrEllipticCurve gastrECCSuppList[] = { + { + EC_SECP256R1, + { + {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0xFFFFFFFC, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF}, + {0x27D2604B, 0x3BCE3C3E, 0xCC53B0F6, 0x651D06B0, 0x769886BC, 0xB3EBBD55, 0xAA3A93E7, 0x5AC635D8}, + { + { + 0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, 0x63, 0xA4, 0x40, 0xF2, + 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98, 0xC2, 0x96 + }, + { + 0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A, 0x7C, 0x0F, 0x9E, 0x16, + 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF, 0x51, 0xF5 + }, + 32 + } + } + } +}; +#endif + +/*!< + List of supported Elliptic Curves ordered by security level (most secure curve is at index ZERO). +*/ + + + +#endif /* __ECC_TYPES_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ate_mode.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ate_mode.h new file mode 100644 index 0000000..a68e14d --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ate_mode.h @@ -0,0 +1,580 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ + +#ifndef _M2M_ATE_MODE_H_ +#define _M2M_ATE_MODE_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_ATE_MAX_NUM_OF_RATES (20) +/*!< Maximum number of all rates (b,g and n) + */ +#define M2M_ATE_MAX_FRAME_LENGTH (1024) +/*!< Maximum number of length for each frame + */ +#define M2M_ATE_MIN_FRAME_LENGTH (1) +/*!< Minimum number of length for each frame + */ + + +#define M2M_ATE_SUCCESS (M2M_SUCCESS) +/*!< No Error and operation has been completed successfully. +*/ +#define M2M_ATE_ERR_VALIDATE (M2M_ERR_FAIL) +/*!< Error in parameters passed to functions. + */ +#define M2M_ATE_ERR_TX_ALREADY_RUNNING (-1) +/*!< This means that TX case is already running and RX or even TX can't start without stopping it first. + */ +#define M2M_ATE_ERR_RX_ALREADY_RUNNING (-2) +/*!< This means that RX case is already running and TX or even RX can't start without stopping it first. + */ +#define M2M_ATE_ERR_UNHANDLED_CASE (-3) +/*!< Invalid case. + */ +#define M2M_ATE_RX_DISABLE_DA 0x0 +#define M2M_ATE_RX_ENABLE_DA 0x1 + +#define M2M_ATE_RX_DISABLE_SA 0x0 +#define M2M_ATE_RX_ENABLE_SA 0x1 + +#define M2M_ATE_DISABLE_SELF_MACADDR 0x0 +#define M2M_ATE_SET_SELF_MACADDR 0x1 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! + *@enum tenuM2mAteFwState + *@brief Enumeration used for change ATE firmware state + */ +typedef enum { + M2M_ATE_FW_STATE_STOP = 0x00, + /*!< State to stop ATE firmware + */ + M2M_ATE_FW_STATE_RUN = 0x01, + /*!< State to run ATE firmware + */ +}tenuM2mAteFwState; + +/*! + *@enum tenuM2mAteTxRates + *@brief Used to get value of rate referenced by this index + */ +typedef enum { + M2M_ATE_TX_RATE_1_Mbps_INDEX = 0x00, + M2M_ATE_TX_RATE_2_Mbps_INDEX = 0x01, + M2M_ATE_TX_RATE_55_Mbps_INDEX = 0x02, + M2M_ATE_TX_RATE_11_Mbps_INDEX = 0x03, + /*!< B-Rates + */ + M2M_ATE_TX_RATE_6_Mbps_INDEX = 0x04, + M2M_ATE_TX_RATE_9_Mbps_INDEX = 0x05, + M2M_ATE_TX_RATE_12_Mbps_INDEX = 0x06, + M2M_ATE_TX_RATE_18_Mbps_INDEX = 0x07, + M2M_ATE_TX_RATE_24_Mbps_INDEX = 0x08, + M2M_ATE_TX_RATE_36_Mbps_INDEX = 0x09, + M2M_ATE_TX_RATE_48_Mbps_INDEX = 0x0A, + M2M_ATE_TX_RATE_54_Mbps_INDEX = 0x0B, + /*!< G-Rates + */ + M2M_ATE_TX_RATE_MCS_0_INDEX = 0x0C, + M2M_ATE_TX_RATE_MCS_1_INDEX = 0x0D, + M2M_ATE_TX_RATE_MCS_2_INDEX = 0x0E, + M2M_ATE_TX_RATE_MCS_3_INDEX = 0x0F, + M2M_ATE_TX_RATE_MCS_4_INDEX = 0x10, + M2M_ATE_TX_RATE_MCS_5_INDEX = 0x11, + M2M_ATE_TX_RATE_MCS_6_INDEX = 0x12, + M2M_ATE_TX_RATE_MCS_7_INDEX = 0x13, + /*!< N-Rates + */ +}tenuM2mAteTxIndexOfRates; + +/*! + *@enum tenuM2mAteTxDutyCycle + *@brief Values of duty cycle + */ +typedef enum { + M2M_ATE_TX_DUTY_1 = 0x01, + M2M_ATE_TX_DUTY_2 = 0x02, + M2M_ATE_TX_DUTY_3 = 0x03, + M2M_ATE_TX_DUTY_4 = 0x04, + M2M_ATE_TX_DUTY_5 = 0x05, + M2M_ATE_TX_DUTY_6 = 0x06, + M2M_ATE_TX_DUTY_7 = 0x07, + M2M_ATE_TX_DUTY_8 = 0x08, + M2M_ATE_TX_DUTY_9 = 0x09, + M2M_ATE_TX_DUTY_10 = 0xA0, +}tenuM2mAteTxDutyCycle; + + +#define M2M_ATE_TX_DUTY_MAX_VALUE M2M_ATE_TX_DUTY_1 +/*!< The maximum value of duty cycle +*/ +#define M2M_ATE_TX_DUTY_MIN_VALUE M2M_ATE_TX_DUTY_10 +/*!< The minimum value of duty cycle +*/ + +/*! + *@enum tenuM2mAteTxDpdControl + *@brief Allowed values for DPD control + */ +typedef enum { + M2M_ATE_TX_DPD_DYNAMIC = 0x00, + M2M_ATE_TX_DPD_BYPASS = 0x01, + M2M_ATE_TX_DPD_ENABLED = 0x02, +}tenuM2mAteTxDpdControl; + +/*! + *@enum tenuM2mAteTxGainSetting + *@brief Options for TX gain selection mode + */ +typedef enum { + M2M_ATE_TX_GAIN_DYNAMIC = 0x00, + M2M_ATE_TX_GAIN_BYPASS = 0x01, + M2M_ATE_TX_GAIN_FCC = 0x02, + M2M_ATE_TX_GAIN_TELEC = 0x03, +}tenuM2mAteTxGainSetting; + +/*! + *@enum tenuM2mAtePMUSetting + *@brief Used to Enable PMU or disable it + */ +typedef enum { + M2M_ATE_PMU_DISBLE = 0x00, + M2M_ATE_PMU_ENABLE = 0x01, +}tenuM2mAtePMUSetting; + +/*! + *@enum tenuM2mAteTxSource + *@brief Used to define if enable PHY continues mode or MAC + */ +typedef enum { + M2M_ATE_TX_SRC_MAC = 0x00, + M2M_ATE_TX_SRC_PHY = 0x01, +}tenuM2mAteTxSource; + +/*! + *@enum tenuM2mAteTxMode + *@brief Used to define type of TX mode either normal or CW(Continuous Wave) TX sequence + */ +typedef enum { + M2M_ATE_TX_MODE_NORM = 0x00, + M2M_ATE_TX_MODE_CW = 0x01, +}tenuM2mAteTxMode; + +/*! + *@enum tenuM2mAteChannels + *@brief Available channels for TX and RX + */ +typedef enum { + M2M_ATE_CHANNEL_1 = 0x01, + M2M_ATE_CHANNEL_2 = 0x02, + M2M_ATE_CHANNEL_3 = 0x03, + M2M_ATE_CHANNEL_4 = 0x04, + M2M_ATE_CHANNEL_5 = 0x05, + M2M_ATE_CHANNEL_6 = 0x06, + M2M_ATE_CHANNEL_7 = 0x07, + M2M_ATE_CHANNEL_8 = 0x08, + M2M_ATE_CHANNEL_9 = 0x09, + M2M_ATE_CHANNEL_10 = 0x0A, + M2M_ATE_CHANNEL_11 = 0x0B, + M2M_ATE_CHANNEL_12 = 0x0C, + M2M_ATE_CHANNEL_13 = 0x0D, + M2M_ATE_CHANNEL_14 = 0x0E, +}tenuM2mAteChannels; + +/*! + *@struct tstrM2mAteRxStatus + *@brief Used to save statistics of RX case + */ +typedef struct { + uint32 num_rx_pkts; + /*!< Number of total RX packet + */ + uint32 num_err_pkts; + /*!< Number of RX failed packets + */ + uint32 num_good_pkts; + /*!< Number of RX packets actually received + */ +} tstrM2mAteRxStatus; + +/*! + *@struct tstrM2mAteTx + *@brief Used as data source in case of enabling TX test case + */ +typedef struct { + uint32 num_frames; + /*!< Number of frames to be sent where maximum number allowed is 4294967295 ul, and ZERO means infinite number of frames + */ + uint32 data_rate; + /*!< Rate to sent packets over to select rate use value of \ref tenuM2mAteTxIndexOfRates and pass it to \ref m2m_ate_get_tx_rate + */ + uint8 channel_num; + /*!< Channel number \ref tenuM2mAteChannels + */ + uint8 duty_cycle; + /*!< Duty cycle value between from 1 to 10, where maximum = 1, minimum = 10 \ref tenuM2mAteTxDutyCycle + */ + uint16 frame_len; + /*!< Use \ref M2M_ATE_MAX_FRAME_LENGTH (1024) as the maximum value while \ref M2M_ATE_MIN_FRAME_LENGTH (1) is the minimum value + */ + uint8 tx_gain_sel; + /*!< TX gain mode selection value \ref tenuM2mAteTxGainSetting + */ + uint8 dpd_ctrl; + /*!< DPD mode value\ref tenuM2mAteTxDpdControl + */ + uint8 use_pmu; + /*!< This is 0 if PMU is not used otherwise it must be be 1 \ref tenuM2mAtePMUSetting + */ + uint8 phy_burst_tx; + /*!< Source of Burst TX either PHY or MAC\ref tenuM2mAteTxSource + */ + uint8 cw_tx; + /*!< Mode of Burst TX either normal TX sequence or CW(Continuous Wave) TX sequence \ref tenuM2mAteTxMode + */ + uint32 xo_offset_x1000; + /*!< Signed XO offset value in PPM (Part Per Million) multiplied by 1000. + */ + uint8 use_efuse_xo_offset; + /*!< Set to 0 to use the XO offset provided in xo_offset_x1000. Set to 1 to use XO offset programmed on WINC efuse. + */ + uint8 peer_mac_addr[6]; + /*!< Set peer address to send directed frames to a certain address. + */ +} tstrM2mAteTx; + +/*! + *@struct tstrM2mAteRx + *@brief Used as data source in case of enabling RX test case + */ +typedef struct { + uint8 channel_num; + /*!< Channel number \ref tenuM2mAteChannels + */ + uint8 use_pmu; + /*!< This is 0 if PMU is not used otherwise it must be be 1 \ref tenuM2mAtePMUSetting + */ + uint32 xo_offset_x1000; + /*!< Signed XO offset value in PPM (Part Per Million) multiplied by 1000. + */ + uint8 use_efuse_xo_offset; + /*!< Set to 0 to use the XO offset provided in xo_offset_x1000. Set to 1 to use XO offset programmed on WINC efuse. + */ + uint8 self_mac_addr[6]; + /*!< Set to the self mac address required to be overriden. + */ + uint8 sa_mac_addr[6]; + /*!< Set to the source mac address expected to filter frames from. + */ + uint8 mac_filter_en_da; + /*!< Flag set to enable or disable reception with destination address as a filter. + */ + uint8 mac_filter_en_sa; + /*!< Flag set to enable or disable reception with source address as a filter. + */ + uint8 override_self_mac_addr; + /*!< Flag set to enable or disable self mac address feature. + */ +} tstrM2mAteRx; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(uint32 req_serial_number); + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void); + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8); + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void); + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8); + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void); + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx *); + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void); + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void); + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx *); + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void); + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *); + +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB); + +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * pdGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * pdGaindB + The retrieved digital gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double * pdGaindB); + +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(uint32 *paGain) + +@brief + This function is used to get the pa gain + +@param [out] uint32 *paGain + The retrieved pa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(uint32 * paGain); + +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) + +@brief + This function is used to get the ppa gain + +@param [out] uint32 * ppaGain + The retrieved ppa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain); + +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * pTotGaindB) + +@brief + This function is used to get the total gain + +@param [out] double * pTotGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, pa and ppa gain values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double * pTotGaindB); + + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_CONFIG_MODE_H_ */ + +#endif //_M2M_ATE_FW_ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_crypto.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_crypto.h new file mode 100644 index 0000000..f173e0d --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_crypto.h @@ -0,0 +1,212 @@ +/** + * + * \file + * + * \brief WINC3400 Crypto API + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_CRYPTO_H__ +#define __M2M_CRYPTO_H__ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define M2M_SHA256_CONTEXT_BUFF_LEN 128 +#define M2M_SHA256_DIGEST_LEN 32 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrM2mSha256Ctxt + +@brief + SHA256 context data +*/ +typedef struct sha256ctxt{ + uint32 au32Sha256CtxtBuff[M2M_SHA256_CONTEXT_BUFF_LEN/sizeof(uint32)]; +} tstrM2mSha256Ctxt; + + +/*! +@enum \ + tenuRsaSignStatus + +@brief + RSA Signature status: pass or fail. +*/ +typedef enum{ + M2M_RSA_SIGN_OK, + M2M_RSA_SIGN_FAIL +} tenuRsaSignStatus; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@fn \ + sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + +@brief SHA256 hash initialization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. +*/ +sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *psha256Ctxt); + + +/*! +@fn \ + sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + +@brief SHA256 hash update + +@param [in] psha256Ctxt + Pointer to the sha256 context. + +@param [in] pu8Data + Buffer holding the data submitted to the hash. + +@param [in] u16DataLength + Size of the data bufefr in bytes. +*/ +sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Data, uint16 u16DataLength); + + +/*! +@fn \ + sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + +@brief SHA256 hash finalization + +@param[in] psha256Ctxt + Pointer to a sha256 context allocated by the caller. + +@param [in] pu8Sha256Digest + Buffer allocated by the caller which will hold the resultant SHA256 Digest. It must be allocated no less than M2M_SHA256_DIGEST_LEN. +*/ +sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *psha256Ctxt, uint8 *pu8Sha256Digest); + + + + +/*! +@fn \ + sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Verification + + The function shall request the RSA Signature verification from the WINC Firmware for the given message. The signed message shall be + compressed to the corresponding hash algorithm before calling this function. + The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8E + RSA public exponent. + +@param[in] u16ESize + Size of the RSA public exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Signature value to be verified. +*/ +sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature); + + +/*! +@fn \ + sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, \ + uint16 u16HashLength, uint8 *pu8RsaSignature); + +@brief RSA Signature Generation + + The function shall request the RSA Signature generation from the WINC Firmware for the given message. The signed message shall be + compressed to the corresponding hash algorithm before calling this function. + The hash type is identified by the given hash length. For example, if the hash length is 32 bytes, then it is SHA256. + +@param[in] pu8N + RSA Key modulus n. + +@param[in] u16NSize + Size of the RSA modulus n in bytes. + +@param[in] pu8d + RSA private exponent. + +@param[in] u16dSize + Size of the RSA private exponent in bytes. + +@param[in] pu8SignedMsgHash + The hash digest of the signed message. + +@param[in] u16HashLength + The length of the hash digest. + +@param[out] pu8RsaSignature + Pointer to a user buffer allocated by teh caller shall hold the generated signature. +*/ +sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature); +#ifdef __cplusplus +} +#endif + + +#endif /* __M2M_CRYPTO_H__ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_flash.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_flash.h new file mode 100644 index 0000000..258664c --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_flash.h @@ -0,0 +1,511 @@ +/** + * + * \file + * + * \brief WINC3400 Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup FLASHAPI FLASH +*/ + +#ifndef __M2M_FLASH_H__ +#define __M2M_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/**@defgroup FlashDefs Defines + * @ingroup FLASHAPI + * @{*/ + + +/*! Bit 0 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to write new firmware image to WINC inactive partition. */ +#define FLASH_UPDATEIMAGE_OPTION_UPDATE NBIT0 +/*! Bit 1 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to mark image in WINC inactive partition as valid. If set along with + * @ref FLASH_UPDATEIMAGE_OPTION_UPDATE, the image is not marked valid if the writing fails. */ +#define FLASH_UPDATEIMAGE_OPTION_VALIDATE NBIT1 +/*! Bit 2 of u8Options parameter of @ref m2m_flash_updateimage.\n + * Request to switch the WINC active/inactive partitions. Use this to switch to a new image or to + * revert to an old one. The switch only succeeds if the image has been marked valid. */ +#define FLASH_UPDATEIMAGE_OPTION_SWITCH NBIT2 + +/*! Return success, transfer succeeded. */ +#define FLASH_SUCCESS 0 +/*! Return error. The parameters provided by the MCU application failed sanity checks. */ +#define FLASH_ERR_PARAM (-1) +/*! Return error. An MCU application function of type @ref tpfDataAccessFn returned failure. */ +#define FLASH_ERR_LOCAL_ACCESS (-2) +/*! Return error. There was an error while accessing WINC flash, or contents of WINC flash were not as expected. */ +#define FLASH_ERR_WINC_ACCESS (-3) +/*! Return error. The transfer destination location was too small for the size of data to be transferred. */ +#define FLASH_ERR_SIZE (-4) +/*! Return error. The data provided by the MCU application caused a failure. For example:\n + * - An item could not be added to a WINC flash store because the identifier matched an existing item. + * - An item could not be read or removed from a WINC flash store because the identifier did not match an existing item. + * - A firmware image could not be written to WINC flash because it did not match the format of WINC firmware images. */ +#define FLASH_ERR_WINC_CONFLICT (-5) +/*! Return error. The MCU application did not call @ref m2m_flash_init during Wi-Fi initialization. */ +#define FLASH_ERR_UNINIT (-6) +/*! Return error. The module hit an internal error, such as insufficient heap memory. */ +#define FLASH_ERR_INTERNAL (-7) + + /**@} + */ +/**@defgroup FlashEnums Enumeration/Typedefs + * @ingroup FLASHAPI + * @{*/ + +/*! +@enum tenuFlashDataFnCtl + +@brief Control parameter for @ref tpfDataAccessFn. + */ +typedef enum { + /*! Data access about to start. Check and save parameters as required, ready for subsequent + * data accesses. */ + FLASH_DATA_FN_INITIALIZE, + /*! Sequential data access, using parameters previously provided by FLASH_DATA_FN_INITIALIZE. */ + FLASH_DATA_FN_DATA, + /*! Data access aborted. Did not complete and will not be continued. */ + FLASH_DATA_FN_TERMINATE, + /*! Data access complete. */ + FLASH_DATA_FN_COMPLETE +}tenuFlashDataFnCtl; + +/*! +@enum tenuDataFnRW + +@brief Indicates whether data is to be read or written + */ +typedef enum { + /*! Read data from application memory. */ + FLASH_DATA_FN_READ, + /*! Write data to application memory. */ + FLASH_DATA_FN_WRITE +}tenuDataFnRW; + +/*! +@enum tenuImageId + +@brief Indicates which image to access in WINC flash + */ +typedef enum { + /*! Access the image in the inactive partition. */ + FLASH_IMAGE_INACTIVE, + /*! Access the image in the active partition. */ + FLASH_IMAGE_ACTIVE +}tenuImageId; + + +/*! +@typedef \ + tpfDataAccessFn + +@brief + A function of this type is used for local data access. It can be implemented to handle simple + RAM access with pointer/length, or it can be implemented to handle access to external memory. + Functions of this type are provided to the module via various function APIs. +@see m2m_flash_rootcert_add +@see m2m_flash_rootcert_read +@see m2m_flash_rootcert_readidx +@see m2m_flash_updateimage +@see m2m_flash_readimage + +@param [in] enuCtl + Control parameter. +@param [in] pvStr + Generic pointer to structure. The structure type depends on enuCtl: + - @ref tstrDataAccessInitParamsApp if enuCtl is @ref FLASH_DATA_FN_INITIALIZE. + - @ref tstrDataAccessParamsApp if enuCtl is @ref FLASH_DATA_FN_DATA. + - @ref NULL if enuCtl is @ref FLASH_DATA_FN_TERMINATE or @ref FLASH_DATA_FN_COMPLETE. + +@note The function is typically called by the module multiple times during a data transfer: + Once with @ref FLASH_DATA_FN_INITIALIZE, then multiple times with @ref FLASH_DATA_FN_DATA, then + once with @ref FLASH_DATA_FN_COMPLETE. + +@return Zero for success. Non-zero otherwise. + +\section FlashExample1 Example +This example illustrates an implementation of a function of type @ref tpfDataAccessFn. \n +This example assumes the application's data buffer is in RAM, so we can use memcpy. Alternatively +memcpy can be replaced by dedicated functions which read/write the application buffer. + +gpu8DataLocation is a pointer to the data buffer in RAM, set by the application. \n +gu32DataSize is the size of the data buffer, set by the application. + +@code{.c} +sint8 data_access_ptr(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + // Return value. + sint8 s8Ret = -1; + // Fixed variables, set in case FLASH_DATA_FN_INITIALIZE, reset in case FLASH_DATA_FN_COMPLETE. + static tenuDataFnRW enuRW; + static uint8 *pu8Location = NULL; + static uint32 u32BytesRemaining = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + if (pvStr != NULL) + { + tstrDataAccessInitParamsApp *init_params = (tstrDataAccessInitParamsApp*)pvStr; + if (init_params->u32TotalSize > gu32DataSize) + break; + // Set fixed variables. + enuRW = init_params->enuRW; + pu8Location = gpu8DataLocation; + u32BytesRemaining = init_params->u32TotalSize; + s8Ret = 0; + } + break; + case FLASH_DATA_FN_DATA: + if ((pvStr != NULL) && (pu8Location != NULL)) + { + tstrDataAccessParamsApp *params = (tstrDataAccessParamsApp*)pvStr; + // Some sanity checks which should never fail. + if (u32BytesRemaining < params->u32DataSize) + break; + if (params->pu8Data == NULL) + break; + switch (enuRW) + { + case FLASH_DATA_FN_WRITE: + memcpy(pu8Location, params->pu8Data, params->u32DataSize); + s8Ret = 0; + break; + case FLASH_DATA_FN_READ: + memcpy(params->pu8Data, pu8Location, params->u32DataSize); + s8Ret = 0; + break; + } + // Update fixed variables for sequential access. + pu8Location += params->u32DataSize; + u32BytesRemaining -= params->u32DataSize; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + // Reset fixed variables. + pu8Location = NULL; + u32BytesRemaining = 0; + s8Ret = 0; + break; + } + return s8Ret; +} +@endcode +*/ +typedef sint8 (*tpfDataAccessFn) (tenuFlashDataFnCtl enuCtl, void *pvStr); + +/*! +@struct \ + tstrDataAccessInitParamsApp +@brief + This structure contains parameters for initializing a local data access (read or write). + +@see tpfDataAccessFn. + */ +typedef struct { + /*! Total size of data to be accessed in data location. */ + uint32 u32TotalSize; + /*! Flags indicating type of data access (read or write). */ + tenuDataFnRW enuRW; +}tstrDataAccessInitParamsApp; + +/*! +@struct \ + tstrDataAccessParamsApp +@brief + This structure contains data for local data access (read or write). +@see tpfDataAccessFn. + */ +typedef struct { + /*! Buffer to be written from or read to. */ + uint8 *pu8Data; + /*! Size of data to be written or read. */ + uint32 u32DataSize; +}tstrDataAccessParamsApp; + +/*! +@struct \ + tstrFlashState +@brief + This structure contains information about an attempted transfer. +@see m2m_flash_init + */ +typedef struct { + /*! Last access attempt. Identifier provided by MCU application. 0 if info not available. */ + uint16 u16LastAccessId; + /*! Was the last access attempt successful? */ + uint8 u8Success; + /*! Did the last access attempt result in modified WINC flash? */ + uint8 u8Changed; + /*! Has the module been initialized? */ + uint8 u8Init; + /*! Has the module been initialized more recently than the module last reset the WINC? */ + uint8 u8Reset; +}tstrFlashState; + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup FLASHFUNCTIONS Functions +* @ingroup FLASHAPI +*/ + +/**@{*/ +/*! +@fn \ + sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); + +@brief Write/validate/switch a WINC firmware image. + +@param [in] u8Options + Flags indicating the required combination of write / validate / switch. +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfSourceFn + Function for the module to call to obtain the image from the MCU application. +@param [in] u32SourceSize + Size of the image being provided by the MCU application. + +@see FLASH_UPDATEIMAGE_OPTION_UPDATE +@see FLASH_UPDATEIMAGE_OPTION_VALIDATE +@see FLASH_UPDATEIMAGE_OPTION_SWITCH + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); +/*! +@fn \ + sint8 m2m_flash_readimage(tenuImageId enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize); + +@brief Read a WINC firmware image. + +@param [in] enuImageId + Which partition to read image from. +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the image to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the image. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_readimage(tenuImageId enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize); +/*! +@fn \ +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize); + +@brief Add an entry to the WINC TLS root certificate store. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfSourceFn + Function for the module to call to obtain the certificate entry from the MCU application. +@param [in] u32SourceSize + Size of the certificate entry being provided by the MCU application. + +@note The data location to be accessed via pfSourceFn + contains the entry to be added. The format of a TLS root certificate entry is: + @code{.c} + Name Offset Length Contents + Header 0 36 tstrRootCertEntryHeader + Key 36 KeyLength Public key and padding + Padding 36+KeyLength PadLength 0xFF + @endcode + For RSA public keys, the format of Key is: + @code{.c} + Name Offset Length + Modulus 36 ModLength RSA modulus, with leading 0s stripped off + Exponent 36+ModLength ExpLength Public exponent, with leading 0s stripped off + @endcode + In this case PadLength is the amount of padding that would be required for 4-byte alignment of Modulus + plus the amount of padding that would be required for 4-byte alignment of Exponent.\n + For ECDSA public keys, the format of Key is: + @code{.c} + Name Offset Length + X Coord 36 CoordLength Public key X-coordinate + Y Coord 36+CoordLength CoordLength Public key Y-coordinate + @endcode + In this case PadLength is the amount of padding that would be required for 4-byte alignment of X Coord + plus the amount of padding that would be required for 4-byte alignment of Y Coord. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfFn, uint32 u32Size); + +/*! +@fn \ +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz); + +@brief Remove an entry from the WINC TLS root certificate store. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pu8Identifier + Identifier for the entry to be removed. This is the SHA1 digest of the certificate issuer name. +@param [in] u32IdentifierSz + Size of the identifier (20). + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz); +/*! +@fn \ + sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz); + +@brief Read an entry from the WINC TLS root certificate store, referenced by entry identifier. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the certificate entry to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the entry. +@param [in] pu8Identifier + Identifier for the entry to be read. This is the SHA1 digest of the certificate issuer name. +@param [in] u32IdentifierSz + Size of the identifier (20). + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz); +/*! +@fn \ + sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index); + +@brief Read an entry from the WINC TLS root certificate store, referenced by entry index. + +@param [in] u16Id + Transfer identifier, not interpreted by this module. +@param [in] pfDestFn + Function for the module to call to send the certificate entry to the MCU application. +@param [in] u32DestSize + Size of the memory available to the MCU application for storing the entry. +@param [in] u8Index + Zero-based index of the entry to be read. + +@return Zero indicates success. + Negative values indicate failure. +*/ +sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index); + +/*! +@fn \ + void m2m_flash_get_state(tstrFlashState *pstrState); + +@brief Get information about the module current state and about the most recent access attempt. + +@param [out] pstrState + Module state and most recent access attempt info. + +@return None. +*/ +void m2m_flash_get_state(tstrFlashState *pstrState); + + +/*! +@fn \ + sint8 m2m_flash_init(void); + +@brief Initialize the module. + +@warning This API must be called at a particular point during MCU application initialization. + +@see m2m_wifi_init +@see m2m_wifi_init_hold +@see m2m_wifi_init_start + +\section FlashExample2 Example +This example demonstrates how to add @ref m2m_flash_init and @ref m2m_flash_get_state +to MCU application initialization code. + +Original code: +@code{.c} +{ + tstrWifiInitParam param = {...} + sint8 status = 0; + + status = m2m_wifi_init(param); + if (status != 0) + { + // Wifi init failed. + } +} +@endcode +New code: +@code{.c} +{ + tstrWifiInitParam param = {...} + sint8 status = 0; + + status = m2m_wifi_init_hold(); + if (status == 0) + { + tstrFlashState strFlashState; + + m2m_flash_get_state(&strFlashState); + printf("FlashAccess:%x:%d%d\n", strFlashState.u16LastAccessId, strFlashState.u8Success, strFlashState.u8Changed); + + switch (strFlashState.u16LastAccessId) + { + // Application code dependent on meaning of u16LastAccessId. + } + m2m_flash_init(); + status = m2m_wifi_init_start(param); + } + if (status != 0) + { + // Wifi init failed. + } +} +@endcode + +@return Zero for successful initialization of module. Negative value otherwise. +*/ +sint8 m2m_flash_init(void); + + /**@}*/ +#endif /* __M2M_FLASH_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ota.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ota.h new file mode 100644 index 0000000..f532024 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ota.h @@ -0,0 +1,383 @@ +/** + * + * \file + * + * \brief WINC3400 IoT OTA Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup OTAAPI OTA +*/ + +#ifndef __M2M_OTA_H__ +#define __M2M_OTA_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" + +/** +* @addtogroup OTATYPEDEF +*/ +/**@{*/ + +/*! +@typedef \ + void (*tpfOtaNotifCb) (tstrOtaUpdateInfo *); + +@brief A callback to get notification about a potential OTA update. + +@param[in] pstrOtaUpdateInfo A structure to provide notification payload. + +@sa + tstrOtaUpdateInfo +@warning + The notification is not supported (Not implemented yet) + +*/ +typedef void (*tpfOtaNotifCb) (tstrOtaUpdateInfo * pstrOtaUpdateInfo); + + +/*! +@typedef \ + void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); + +@brief + A callback to get OTA status update, the callback provides the download status, + the switch to the downloaded firmware status and roll-back status. + +@param[in] u8OtaUpdateStatusType Possible values are listed in \ref tenuOtaUpdateStatusType. Possible types are: +- [DL_STATUS](@ref DL_STATUS) +- [SW_STATUS](@ref SW_STATUS) +- [RB_STATUS](@ref RB_STATUS) + +@param[in] u8OtaUpdateStatus Possible values are listed in \ref tenuOtaUpdateStatus. + +@see + tenuOtaUpdateStatusType + tenuOtaUpdateStatus + */ +typedef void (*tpfOtaUpdateCb) (uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus); + /**@} + */ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup OTAFUNCTIONS Functions + * @ingroup OTAAPI + */ +#ifdef __cplusplus + extern "C" { +#endif + + /**@{*/ +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb); + * Synchronous initialization function for the OTA layer by registering the update callback. + * The notification callback is not supported at the current version. Calling this API is a + * prerequisite for all other OTA API's. +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb,tpfOtaNotifCb pfOtaNotifCb); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + * Set the OTA notification server URL, the functions need to be called before any check for update. + * This functionality is not supported by WINC firmware. + +@param [in] u8Url + Set the OTA notification server URL, the functions need to be called before any check for update. +@warning + This functionality is not supported by WINC firmware. + +@see + m2m_ota_init +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + * Synchronous function to check for the OTA update using the Notification Server + * URL. This functionality is not supported by WINC firmware. +@warning + This functionality is not supported by WINC firmware. + +@sa + m2m_ota_init + m2m_ota_notif_set_url +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); +* Schedule OTA notification Server check for update request after specific number of days. +* This functionality is not supported by WINC firmware. + +@param [in] u32Period + Period in days + +@warning + This functionality is not supported by WINC firmware. + +@sa + m2m_ota_init + m2m_ota_notif_check_for_update + m2m_ota_notif_set_url +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + Request OTA start update using the downloaded URL. + The firmware OTA module will download the OTA image, ensure integrity of the image, and update the validity of the image in + the control structure. + On completion, a callback of type @ref tpfOtaUpdateCb is called (callback previously provided via @ref m2m_ota_init()). + Switching to the updated image additionally requires completion of @ref m2m_ota_switch_firmware(), and system_reset(). + +@param [in] u8DownloadUrl + The download firmware URL, according to the application server. + +@warning + Calling this API does not guarantee OTA WINC image update; it depends on the connection with the download server and the validity + of the image. + Calling this API invalidates the previous rollback image. The current image will become the rollback image after + @ref m2m_ota_switch_firmware(). + +@pre + @ref m2m_ota_init() must have been called before using @ref m2m_ota_start_update(). +@sa + @ref m2m_ota_init() + @ref m2m_ota_switch_firmware() + @ref tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + Note that successful operation in this context means the OTA update request has reached the firmware OTA module. It does not + indicate whether or not the image update succeeded. + +\section OTAExample Example + This example shows how an OTA image update and switch is carried out. + It demonstrates use of the following OTA APIs: + @ref m2m_ota_init() + @ref tpfOtaUpdateCb + @ref m2m_ota_start_update() + @ref m2m_ota_switch_firmware() + @ref m2m_ota_rollback() + It also makes use of @ref m2m_wifi_check_ota_rb() in order to inform OTA decisions. + +@code +static void OtaUpdateCb(uint8 u8OtaUpdateStatusType ,uint8 u8OtaUpdateStatus) +{ + sint8 s8tmp; + tstrM2mRev strtmp; + + M2M_INFO("%d %d\n", u8OtaUpdateStatusType, u8OtaUpdateStatus); + + switch(u8OtaUpdateStatusType) { + case DL_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { + M2M_INFO("OTA download succeeded\n"); + s8tmp = m2m_wifi_check_ota_rb(); + if(s8tmp == M2M_ERR_FW_VER_MISMATCH) { + // In this case the application SHOULD update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver would lead to severely limited functionality (i.e. OTA rollback only). + } + else if(s8tmp == M2M_SUCCESS) { + // In this case the application MAY WANT TO update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver may lead to suboptimal functionality. + } + else { + M2M_INFO("Cannot recognize downloaded image\n"); + // In this case the application MUST NOT update the host driver if such an update would change the + // driver HIF Major field. Firmware switch @ref using m2m_ota_switch_firmware() is blocked. + break; + } + M2M_INFO("Now switching active partition...\n"); + s8tmp = m2m_ota_switch_firmware(); + } + break; + case SW_STATUS: + case RB_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCSESS) { + M2M_INFO("Switch/Rollback succeeded\n"); + M2M_INFO("Now resetting the system...\n"); + system_reset(); + } + break; + } +} +static void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) +{ + // ... + case M2M_WIFI_REQ_DHCP_CONF: + { + //After successful connection, start the OTA upgrade. + m2m_ota_start_update(OTA_URL); + } + break; + // ... +} +int main (void) +{ + sint8 ret = M2M_SUCCESS; + tstrWifiInitParam param; + bool rollback_required = FALSE; + + // ... system init etc here ... + + //Initialize the WINC Driver. + m2m_memset((uint8*)¶m, 0, sizeof(param)); + param.pfAppWifiCb = wifi_event_cb; + + ret = m2m_wifi_init(¶m); + if(ret == M2M_ERR_FW_VER_MISMATCH) { + ret = m2m_wifi_check_ota_rb(); + if(ret == M2M_SUCCESS) { + // In this case the image in the inactive partition has compatible HIF. We will switch/rollback to it + // after initializing the OTA module. + rollback_required = TRUE; + } + } + if(ret != M2M_SUCCESS) { + M2M_ERR("Driver Init Failed <%d>\n",ret); + while(1); + } + + //Initialize the OTA module. + m2m_ota_init(OtaUpdateCb, NULL); + + if(rollback_required) { + // We need to call either @ref m2m_ota_rollback() or @ref m2m_ota_switch_firmware() (functionally equivalent). + m2m_ota_rollback(); + } else { + // Connect to AP that provides connection to the OTA server + m2m_wifi_default_connect(); + } + + while(1) { + // Handle the app state machine plus the WINC event handler. + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + } + } +} +@endcode + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + Request rollback to the old (inactive) WINC image. The WINC firmware will check the validity of + the inactive image and activate it if it is valid. + On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously + have provided the callback via @ref m2m_ota_init()). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If rollback will necessitate a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this + API. + In the event of system reset with incompatible driver/firmware, compatibility can be recovered + by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + Abort an ota in progress (eg if server has stalled) and clean up +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void); +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + Request switch to the updated WINC image. The WINC firmware will check the validity of the + inactive image and activate it if it is valid. + On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously + have provided the callback via @ref m2m_ota_init()). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If switch will necessitate a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this + API. + In the event of system reset with incompatible driver/firmware, compatibility can be recovered + by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void); + +#if 0 +NMI_API sint8 m2m_ota_test(void); +#endif + /**@}*/ +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_periph.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_periph.h new file mode 100644 index 0000000..6e109dd --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_periph.h @@ -0,0 +1,310 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherals Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + INCLUDES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + MACROS + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + DATA TYPES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @struct \ + tstrPerphInitParam + + @brief + Peripheral module initialization parameters. + */ +typedef struct { + void * arg; +} tstrPerphInitParam; + + +/*! + @enum \ + tenuGpioNum + + @brief + A list of GPIO numbers configurable through the m2m_periph module. + */ +typedef enum { + M2M_PERIPH_GPIO3, + M2M_PERIPH_GPIO4, + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + + +/*! + @enum \ + tenuI2cMasterSclMuxOpt + + @brief + Allowed pin multiplexing options for I2C master SCL signal. + */ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is avaiable on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is avaiable on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is avaiable on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is avaiable on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is avaiable on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! + @enum \ + tenuI2cMasterSdaMuxOpt + + @brief + Allowed pin multiplexing options for I2C master SDA signal. + */ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK , /*!< I2C master SDA is avaiable on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is avaiable on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is avaiable on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is avaiable on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is avaiable on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + + +/*! + @struct \ + tstrI2cMasterInitParam + + @brief + I2C master configuration parameters. + @sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt + */ +typedef struct { + uint8 enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8 enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8 u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! + @enum \ + tenuI2cMasterFlags + + @brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read + @sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read + */ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! + @enum \ + tenuPullupMask + + @brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. + @sa + m2m_periph_pullup_ctrl + + */ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 8), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_RXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 12), +} tenuPullupEnable1Mask; +typedef enum { + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_GPIO_38 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_39 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_40 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_42 = (1ul << 29), +} tenuPullupEnable2Mask; +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* + FUNCTION PROTOTYPES + *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + /*! + @fn \ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + + @brief + Initialize the NMC1500 peripheral driver module. + + @param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tstrPerphInitParam + */ + NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + + @brief + Configure a specific NMC1500 pad as a GPIO and sets its direction (input or output). + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + + @brief + Set an NMC1500 GPIO output level high or low. + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); + + /*! + @fn \ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + + @brief + Read an NMC1500 GPIO input level. + + @param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + + @param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuGpioNum + */ + NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); + + /*! + @fn \ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + + @brief + Control the programmable pull-up resistor on the chip pads . + + + @param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. + + @param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + + @return + The function SHALL return 0 for success and a negative value otherwise. + + @sa + tenuPullupMask + */ + NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); + +#ifdef __cplusplus +} +#endif + + +#endif /* _M2M_PERIPH_H_ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ssl.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ssl.h new file mode 100644 index 0000000..1f4ed13 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_ssl.h @@ -0,0 +1,175 @@ +/** + * + * \file + * + * \brief WINC3400 SSL Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup SSLAPI SSL +*/ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmdrv.h" +#include "ecc_types.h" +#include "socket/include/socket.h" + +/**@defgroup SSLEnums Enumeration/Typedefs + * @ingroup SSLAPI + * @{*/ + +/*! +@typedef \ + void (*tpfAppSSLCb) (uint8 u8MsgType, void * pvMsg); + +@brief A callback to get SSL notifications. + +@param[in] u8MsgType +@param[in] pvMsg A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb) (uint8 u8MsgType, void * pvMsg); + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SSLFUNCTIONS Functions +* @ingroup SSLAPI +*/ + +/**@{*/ +/*! + @fn \ NMI_API sint8 m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! + @fn \ NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuff + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. The buffer format must match the format of @ref tstrTlsSrvSecHdr + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) + @brief Retrieve the ECDSA certificate to be verified from the WINC + @param [out] pu16CurveType + Pointer to the certificate curve type. + @param [out] pu8Hash + Pointer to the certificate hash. + @param [out] pu8Sig + Pointer to the certificate signature. + @param [out] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key); + +/*! + @fn \ NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [out] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz); + +/*! + @fn \ NMI_API void m2m_ssl_stop_processing_certs(void) + @brief Allow ssl driver to tidy up in case application does not read all available certificates. + @warning This API must only be called if some certificates are left unread. + @return None. +*/ +NMI_API void m2m_ssl_stop_processing_certs(void); + +/*! + @fn \ NMI_API void m2m_ssl_ecc_process_done(void) + @brief Allow ssl driver to tidy up after application has finished processing ecc message. + @warning This API must be called after receiving a SSL callback with type @ref M2M_SSL_REQ_ECC + @return None. +*/ +NMI_API void m2m_ssl_ecc_process_done(void); + +/*! +@fn \ + NMI_API sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination, except for combinations involving both RSA + and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + + /**@}*/ +#endif /* __M2M_SSL_H__ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/include/m2m_types.h b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_types.h new file mode 100644 index 0000000..3655a5b --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/include/m2m_types.h @@ -0,0 +1,2214 @@ +/** + * + * \file + * + * \brief WINC3400 IoT Application Interface Internal Types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "common/include/nm_common.h" +#else +#include "m2m_common.h" +#endif +#endif + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup VERSION VERSION + */ +/**@defgroup VERSIONDEF Defines + @ingroup VERSION + */ + +/**@{*/ + +/* + Layout of HIF_LEVEL fields + | x x x x x x | x x x x x x x x | + | 13:8 | 7:0 | + | HIF_MAJOR | HIF_MINOR | + | HIF_LEVEL | + + HIF compatibility (checked by driver after wifi boot). + + Check Firmware HIF_MAJOR + |___ + | Does not match Driver - Recommend either: + | > checking compatibility of Cortus image stored in inactive partition + | (m2m_wifi_check_ota_rb()) then swapping to it using OTA rollback or switch. + | > updating Host with out of band method. + |___ + Matches Driver - All APIs can be attempted. + | - Cortus image can be updated (OTA download) + | - New Host image can be retrieved (socket recv) + | + Check Firmware HIF_MINOR + |___ + | Less than Driver - Driver may refuse to execute some APIs (API would return M2M_ERR_SEND). + | - Recommend updating Cortus image using OTA download to use newer Firmware. + |___ + | Equal to Driver - Driver supports all APIs. + |___ + Greater than Driver - Driver supports all APIs. + - Recommend reviewing potential benefit of updating Host to use newer Driver. + + When an OTA update involving HIF_MAJOR change is required, the following order is recommended: + 1. m2m_ota_start_update() to store new Cortus image in inactive partition. + 2. Socket recv() to retrieve new Host image (including new WINC Driver). + 3. Application code to make Host image available in host flash. + 4. m2m_ota_switch_firmware() to switch active/inactive partition (will take effect after system_reset()). + 5. system_reset() to restart with new WINC Driver / Firmware. + Note that in the event of (unintentional) system reset after step (3), the remaining steps (4) and (5) should still be + run after the reset. +*/ +/* Selection of HIF_INFO +*/ +#define M2M_HIF_INFO_SHIFT (0) +#define M2M_HIF_INFO_MASK (0xffff) +/* Subdivision of HIF_INFO +*/ +#define M2M_HIF_BLOCK_SHIFT (14) +#define M2M_HIF_BLOCK_MASK (0x3) +#define M2M_HIF_LEVEL_SHIFT (0) +#define M2M_HIF_LEVEL_MASK (0x3fff) +/* Subdivision of HIF_LEVEL +*/ +#define M2M_HIF_MAJOR_SHIFT (8) +#define M2M_HIF_MAJOR_MASK (0x3f) +#define M2M_HIF_MINOR_SHIFT (0) +#define M2M_HIF_MINOR_MASK (0xff) + +#define M2M_GET_HIF_INFO(hif_ver) ((uint16)(((hif_ver) >> M2M_HIF_INFO_SHIFT) & M2M_HIF_INFO_MASK)) +#define M2M_GET_HIF_BLOCK(hif_info) ((uint8)(((hif_info) >> M2M_HIF_BLOCK_SHIFT) & M2M_HIF_BLOCK_MASK)) +#define M2M_GET_HIF_LEVEL(hif_info) ((uint16)(((hif_info) >> M2M_HIF_LEVEL_SHIFT) & M2M_HIF_LEVEL_MASK)) +#define M2M_GET_HIF_MAJOR(hif_info) ((uint8)(((hif_info) >> M2M_HIF_MAJOR_SHIFT) & M2M_HIF_MAJOR_MASK)) +#define M2M_GET_HIF_MINOR(hif_info) ((uint8)(((hif_info) >> M2M_HIF_MINOR_SHIFT) & M2M_HIF_MINOR_MASK)) + +#define M2M_MAKE_HIF_INFO(hif_level) ( \ + (((uint16)(hif_level) & M2M_HIF_LEVEL_MASK) << M2M_HIF_LEVEL_SHIFT) | \ + (((uint16)M2M_HIF_BLOCK_VALUE & M2M_HIF_BLOCK_MASK) << M2M_HIF_BLOCK_SHIFT) ) + +/*======*======*======*======* + HIF LEVEL + *======*======*======*======*/ + +#define M2M_HIF_BLOCK_VALUE (2) +/*!< Drv/Fw blocking compatibility check. + */ +#define M2M_HIF_MAJOR_VALUE (1) +/*!< Drv/Fw major compatibility check. +*/ +#define M2M_HIF_MINOR_VALUE (3) +/*!< Drv/Fw minor compatibility check. +*/ +#define M2M_HIF_LEVEL ( \ + ((M2M_HIF_MAJOR_VALUE & M2M_HIF_MAJOR_MASK) << M2M_HIF_MAJOR_SHIFT) | \ + ((M2M_HIF_MINOR_VALUE & M2M_HIF_MINOR_MASK) << M2M_HIF_MINOR_SHIFT) \ + ) +/*!< HIF Level (Major/Minor) for Drv/Fw compatibility. +*/ + +/*======*======*======*======* + DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_DRIVER_VERSION_MAJOR_NO (1) +/*!< Driver Major release version number. +*/ +#define M2M_DRIVER_VERSION_MINOR_NO (0) +/*!< Driver Minor release version number. +*/ +#define M2M_DRIVER_VERSION_PATCH_NO (8) +/*!< Driver patch release version number. +*/ + +/**@}*/ + +/**@defgroup WLANDefines Defines + * @ingroup m2m_wifi + */ +/**@{*/ + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + + +#define M2M_MAC_ADDRES_LEN 6 +/*!< Size of the MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< Offset of the ethernet header within the WLAN Tx Buffer. + */ + + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the ethernet header in bytes. +*/ + + +#define M2M_MAX_SSID_LEN 33 +/*!< Maximum size for the Wi-Fi SSID including the NULL termination. + */ + + +#define M2M_MAX_PSK_LEN 65 +/*!< Maximum size for the WPA PSK including the NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + + +#define M2M_1X_USR_NAME_MAX 21 +/*!< The maximum size of the user name including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + + +#define M2M_1X_PWD_MAX 41 +/*!< The maximum size of the password including the NULL termination. + It is used for RADIUS authentication in case of connecting the device to + an AP secured with WPA-Enterprise. +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< Maximum size for the Information Element. +*/ + + +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the Host configuration commands opcodes. +*/ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the Station mode host commands opcodes. +*/ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. +*/ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. +*/ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. +*/ +#define M2M_SERVER_CMD_BASE 120 +/*!< The base value of all the Power Save mode host commands codes. +*/ + + +#define WEP_40_KEY_STRING_SIZE ((uint8)10) +/*!< Indicates the WEP key size for the 40 bit string passphrase. +*/ + +#define WEP_104_KEY_STRING_SIZE ((uint8)26) +/*!< Indicates the WEP key size for the 104 bit string passphrase. +*/ +#define WEP_KEY_MAX_INDEX ((uint8)4) +/*!< Indicates the maximum key index value for WEP authentication. +*/ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default number of scan slots used by the WINC board. +*/ +#define M2M_SCAN_DEFAULT_SLOT_TIME (20) +/*!< The active scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_PASSIVE_SLOT_TIME (300) +/*!< The passive scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default number of probes per slot. +*/ +#define M2M_FASTCONNECT_DEFAULT_RSSI_THRESH (-45) +/*!< The default threshold RSSI for fast reconnection to an AP. +*/ +#define M2M_SCAN_FAIL ((uint8)1) +/*!< Indicates the WINC board has failed to perform the scan operation. +*/ +#define M2M_JOIN_FAIL ((uint8)2) +/*!< Indicates the WINC board has failed to join the BSS. +*/ +#define M2M_AUTH_FAIL ((uint8)3) +/*!< Indicates the WINC board has failed to authenticate with the AP. +*/ +#define M2M_ASSOC_FAIL ((uint8)4) +/*!< Indicates the WINC board has failed to associate with the AP. +*/ + +#define M2M_SCAN_ERR_WIFI ((sint8)-2) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_IP ((sint8)-3) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_AP ((sint8)-4) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_P2P ((sint8)-5) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_WPS ((sint8)-6) +/*!< Currently not used. +*/ + +/*======*======*======*======* + MONTIORING MODE DEFINITIONS + *======*======*======*======*/ + +#define M2M_WIFI_FRAME_TYPE_ANY 0xFF +/*!< Receive any frame type when configured as Monitor Mode. +*/ +#define M2M_WIFI_FRAME_SUB_TYPE_ANY 0xFF +/*!< Receive frames with any sub type when configured as Monitor Mode. +*/ + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name. +*/ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. +*/ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. +*/ + +/**@}*/ + +/**@defgroup OTADEFINE Defines + * @ingroup OTAAPI + */ + /* @{ */ + +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value in the control structure for a valid image after ROLLBACK. +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value in the control structure for a invalid image after ROLLBACK. +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header. +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + SHA256 digest size in the OTA image. + The SHA256 digest is set at the beginning of image before the OTA header. +*/ + +#define OTA_SUCCESS (0) +/*!< + OTA success status. +*/ +#define OTA_ERR_WORKING_IMAGE_LOAD_FAIL ((sint8)-1) +/*!< + Failure to load the firmware image. +*/ +#define OTA_ERR_INVAILD_CONTROL_SEC ((sint8)-2) +/*!< + Control structure is being corrupted. +*/ +#define M2M_ERR_OTA_SWITCH_FAIL ((sint8)-3) +/*!< + Failure to switch to the updated image, due to this being invalid. +*/ +#define M2M_ERR_OTA_START_UPDATE_FAIL ((sint8)-4) +/*!< + Failure to start the OTA update. + This could be due to a connection failure or a problem with the integrity of the image. +*/ +#define M2M_ERR_OTA_ROLLBACK_FAIL ((sint8)-5) +/*!< + Invalid roll-back image. +*/ +#define M2M_ERR_OTA_INVAILD_FLASH_SIZE ((sint8)-6) +/*!< + The OTA Support requires 8MB flash size. This error indicates the current flash is less than 8M. +*/ +#define M2M_ERR_OTA_INVAILD_ARG ((sint8)-7) +/*!< + Invalid argument in any OTA Function +*/ +/**@}*/ + +/** +* @addtogroup WlanEnums +*/ + /**@{*/ + +/*! +@enum \ + tenuM2mReqGroup + +@brief +*/ +typedef enum{ + M2M_REQ_GROUP_MAIN = 0, + M2M_REQ_GROUP_WIFI, + M2M_REQ_GROUP_IP, + M2M_REQ_GROUP_HIF, + M2M_REQ_GROUP_OTA, + M2M_REQ_GROUP_SSL, + M2M_REQ_GROUP_SIGMA +}tenuM2mReqGroup; + +/*! +@enum \ + tenuM2mReqpkt + +@brief +*/ +typedef enum{ + M2M_REQ_CONFIG_PKT, + M2M_REQ_DATA_PKT = 0x80 /*BIT7*/ +}tenuM2mReqpkt; + +/*! +@enum \ + tenuM2mWepKeyIndex + +@brief + +*/ +typedef enum { + M2M_WIFI_WEP_KEY_INDEX_1 = ((uint8) 1), + /*!< Index 1 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_2, + /*!< Index 2 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_3, + /*!< Index 3 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_4, + /*!< Index 4 for WEP key Authentication */ +}tenuM2mWepKeyIndex; + +/*! +@enum \ + tenuM2mDefaultConnErrcode + +@brief + +*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((sint8)-23), + /*!< Failure response due to another connection being already in progress */ + M2M_DEFAULT_CONN_FAIL, + /*!< Failure to connect to the cached network */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< Failure to find any of the cached networks in the scan results. */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< Failure due to empty network list. */ +}tenuM2mDefaultConnErrcode; + + +/*! +@enum \ + tenuM2mConnChangedErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_SCAN_FAIL = ((uint8)1), + /*!< Failure to perform the scan operation. */ + M2M_ERR_JOIN_FAIL, + /*!< Failure to join the BSS. */ + M2M_ERR_AUTH_FAIL, + /*!< Failure to authenticate with the AP. */ + M2M_ERR_ASSOC_FAIL, + /*!< Failure to associate with the AP. */ + M2M_ERR_CONN_INPROGRESS, + /*!< Failure due to another connection being in progress. */ +}tenuM2mConnChangedErrcode; + + +/*! +@enum \ + tenuM2mSetGainsErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_GAIN_TABLE_INVALID = ((sint8)-10), + /*!< Failure response due to trying to use an invalid table */ + M2M_ERR_READ_GAIN_TABLE, + /*!< Failure to read gains from flash */ +}tenuM2mSetGainsErrcode; + +/*! +@enum \ + tenuM2mPwrMode + +@brief + +*/ +typedef enum { + PWR_AUTO = ((uint8) 1), + /*!< Automatic power mode. */ + PWR_LOW1, + /*!< Low power mode #1. RX current 60mA.*/ + PWR_LOW2, + /*!< Low power mode #2, RX current 55mA, sensitivity is less by 3dBm*/ + PWR_HIGH, + /*!< High power mode: RX current 100mA.*/ +}tenuM2mPwrMode; + +/*! +@enum \ + tenuM2mTxPwrLevel + +@brief + +*/ +typedef enum { + TX_PWR_HIGH = ((uint8) 1), + /*!< PPA Gain 6dbm PA Gain 18dbm */ + TX_PWR_MED, + /*!< PPA Gain 6dbm PA Gain 12dbm */ + TX_PWR_LOW, + /*!< PPA Gain 6dbm PA Gain 6dbm */ +}tenuM2mTxPwrLevel; + +/*! +@enum \ + tenuM2mConfigCmd + +@brief + This enum contains all the host commands used to configure the WINC board. + +*/ +typedef enum { + M2M_WIFI_REQ_RESTART = M2M_CONFIG_CMD_BASE, + /*!< Restart the WINC MAC layer, it's doesn't restart the IP layer. */ + M2M_WIFI_REQ_SET_MAC_ADDRESS, + /*!< Set the WINC mac address (not possible for production effused boards). */ + M2M_WIFI_REQ_CURRENT_RSSI, + /*!< Request the current connected AP RSSI. */ + M2M_WIFI_RESP_CURRENT_RSSI, + /*!< Response to M2M_WIFI_REQ_CURRENT_RSSI with the RSSI value. */ + M2M_WIFI_REQ_RESTRICT_BLE, + /*!< Request restrict ble. */ + M2M_WIFI_REQ_UNRESTRICT_BLE, + /*!< Request unrestrict ble. */ + M2M_WIFI_REQ_GET_CONN_INFO, + /*!< Request connection information. */ + M2M_WIFI_RESP_CONN_INFO, + /*!< Response to M2M_WIFI_REQ_GET_CONN_INFO with the connection information. */ + M2M_WIFI_REQ_SET_DEVICE_NAME, + /*!< Request to set WINC device name property. */ + M2M_WIFI_REQ_START_PROVISION_MODE, + /*!< Request to start provisioning mode. */ + M2M_WIFI_RESP_PROVISION_INFO, + /*!< Response to the host with the provisioning information.*/ + M2M_WIFI_REQ_STOP_PROVISION_MODE, + /*!< Request to stop provision mode. */ + M2M_WIFI_REQ_SET_SYS_TIME, + /*!< Request to set system time. */ + M2M_WIFI_REQ_ENABLE_SNTP_CLIENT, + /*!< Request to enable the simple network time protocol to get the + time from the Internet. This is required for security purposes. */ + M2M_WIFI_REQ_DISABLE_SNTP_CLIENT, + /*!< Request to disable the simple network time protocol for applications that + do not need it. */ + M2M_WIFI_RESP_MEMORY_RECOVER, + /*!< Reserved for debuging */ + M2M_WIFI_REQ_CUST_INFO_ELEMENT, + /*!< Request to add custom information to the Beacons IE. */ + M2M_WIFI_REQ_SCAN, + /*!< Request scan command. */ + M2M_WIFI_RESP_SCAN_DONE, + /*!< Response to notify scan complete. */ + M2M_WIFI_REQ_SCAN_RESULT, + /*!< Request for scan results. */ + M2M_WIFI_RESP_SCAN_RESULT, + /*!< Response to provide the scan results. */ + M2M_WIFI_REQ_SET_SCAN_OPTION, + /*!< Request to set scan options "slot time, slot number .. etc". */ + M2M_WIFI_REQ_SET_SCAN_REGION, + /*!< Request to set scan region. */ + M2M_WIFI_REQ_SET_POWER_PROFILE, + /*!< Request to set the Power Profile. */ + M2M_WIFI_REQ_SET_TX_POWER, + /*!< Request to set the TX Power. */ + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + /*!< Request to set the Battery Voltage. */ + M2M_WIFI_REQ_SET_ENABLE_LOGS, + /*!< Request to enable logs. */ + M2M_WIFI_REQ_GET_SYS_TIME, + /*!< Request to get system time. */ + M2M_WIFI_RESP_GET_SYS_TIME, + /*!< Response to retrieve the system time. */ + M2M_WIFI_REQ_SEND_ETHERNET_PACKET, + /*!< Request to send Ethernet packet in bypass mode. */ + M2M_WIFI_RESP_ETHERNET_RX_PACKET, + /*!< Response to receive an Ethernet packet in bypass mode. */ + M2M_WIFI_REQ_SET_MAC_MCAST, + /*!< Request to set multicast filters. */ + M2M_WIFI_REQ_BLE_API_SEND, + /*!< Request to send an Encapsulated BLE API MSG */ + M2M_WIFI_RESP_BLE_API_RECV, + /*!< Response to receive an Encapsulated BLE API MSG */ + M2M_WIFI_REQ_SET_GAIN_TABLE, + /*!< Request to use Gain table from Flash */ + M2M_WIFI_RESP_SET_GAIN_TABLE, + /*!< Response to fail to use Gain table from Flash */ + M2M_WIFI_REQ_PASSIVE_SCAN, + /*!< Request a passive scan. + */ + M2M_WIFI_MAX_CONFIG_ALL +}tenuM2mConfigCmd; + +/*! +@enum \ + tenuM2mStaCmd + +@brief + This enum contains all the WINC commands while in Station mode. +*/ +typedef enum { + M2M_WIFI_REQ_CONNECT = M2M_STA_CMD_BASE, + /*!< Request to connect with an specified AP. */ + M2M_WIFI_REQ_DEFAULT_CONNECT, + /*!< Request to connect with a cached AP. */ + M2M_WIFI_RESP_DEFAULT_CONNECT, + /*!< Response for the default connect.*/ + M2M_WIFI_REQ_DISCONNECT, + /*!< Request to disconnect from the AP. */ + M2M_WIFI_RESP_CON_STATE_CHANGED, + /*!< Response to indicate a change in the connection state. */ + M2M_WIFI_REQ_SLEEP, + /*!< Request to sleep. */ + M2M_WIFI_REQ_WPS_SCAN, + /*!< Request to WPS scan. */ + M2M_WIFI_REQ_WPS, + /*!< Request to start WPS. */ + M2M_WIFI_REQ_START_WPS, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_DISABLE_WPS, + /*!< Request to disable WPS. */ + M2M_WIFI_REQ_DHCP_CONF, + /*!< Response to indicate the obtained IP address.*/ + M2M_WIFI_RESP_IP_CONFIGURED, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_RESP_IP_CONFLICT, + /*!< Response to indicate a conflict in obtained IP address. + The user should re attempt the DHCP request. */ + M2M_WIFI_REQ_ENABLE_MONITORING, + /*!< Request to enable monitor mode. */ + M2M_WIFI_REQ_DISABLE_MONITORING, + /*!< Request to disable monitor mode. */ + M2M_WIFI_RESP_WIFI_RX_PACKET, + /*!< Response to indicate a packet was received in monitor mode. */ + M2M_WIFI_REQ_SEND_WIFI_PACKET, + /*!< Request to send a packet in monitor mode. */ + M2M_WIFI_REQ_LSN_INT, + /*!< Request to set the listen interval. */ + M2M_WIFI_REQ_DOZE, + /*!< Request to doze */ + M2M_WIFI_REQ_GET_PRNG, + /*!< Request PRNG. */ + M2M_WIFI_RESP_GET_PRNG, + /*!< Response for PRNG. */ + M2M_WIFI_MAX_STA_ALL, +} tenuM2mStaCmd; + +/*! +@enum \ + tenuM2mApCmd + +@brief + This enum contains all the WINC commands while in AP mode. +*/ +typedef enum { + M2M_WIFI_REQ_ENABLE_AP = M2M_AP_CMD_BASE, + /*!< Request to enable AP mode. */ + M2M_WIFI_REQ_DISABLE_AP, + /*!< Request to disable AP mode. */ + M2M_WIFI_MAX_AP_ALL, +}tenuM2mApCmd; + +/*! +@enum \ + tenuM2mP2pCmd + +@brief + This enum contains all the WINC commands while in P2P mode. +*/ +typedef enum { + M2M_WIFI_REQ_P2P_INT_CONNECT = M2M_P2P_CMD_BASE, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_ENABLE_P2P, + /*!< Request to enable P2P mode.*/ + M2M_WIFI_REQ_DISABLE_P2P, + /*!< Request to disable P2P mode. */ + M2M_WIFI_REQ_P2P_REPOST, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. + */ + M2M_WIFI_MAX_P2P_ALL, +}tenuM2mP2pCmd; + + +/*! +@enum \ + tenuM2mServerCmd + +@brief + These commands are currently not supported. +*/ +typedef enum { + M2M_WIFI_REQ_CLIENT_CTRL = M2M_SERVER_CMD_BASE, + /*!< Currently not supported.*/ + M2M_WIFI_RESP_CLIENT_INFO, + /*!< Currently not supported.*/ + M2M_WIFI_REQ_SERVER_INIT, + /*!< Currently not supported.*/ + M2M_WIFI_MAX_SERVER_ALL +}tenuM2mServerCmd; + + + + +/*! +@enum \ + tenuM2mIpCmd + +@brief + This enum contains all the WINC commands related to IP. +*/ +typedef enum { + M2M_IP_REQ_STATIC_IP_CONF = ((uint8) 10), + /*!< Request to set static IP.*/ + M2M_IP_REQ_ENABLE_DHCP, + /*!< Request to enable DHCP.*/ + M2M_IP_REQ_DISABLE_DHCP + /*!< Request to disable DHCP.*/ +} tenuM2mIpCmd; + +/*! +@enum \ + tenuM2mSigmaCmd + +@brief + This enum contains all the WINC commands related to Sigma. +*/ +typedef enum { + M2M_SIGMA_ENABLE = ((uint8) 3), + /*!< Enable Sigma.*/ + M2M_SIGMA_TA_START, + /*!< Start the traffic agent.*/ + M2M_SIGMA_TA_STATS, + /*!< Get traffic stadistics.*/ + M2M_SIGMA_TA_RECEIVE_STOP, + /*!< Stop receiving from the traffic agent.*/ + M2M_SIGMA_ICMP_ARP, + /*!< Send ARP.*/ + M2M_SIGMA_ICMP_RX, + /*!< Receive ICMP.*/ + M2M_SIGMA_ICMP_TX, + /*!< Transmit ICMP.*/ + M2M_SIGMA_UDP_TX, + /*!< Transmit UDP.*/ + M2M_SIGMA_UDP_TX_DEFER, + /*!< Transmit UDP defer.*/ + M2M_SIGMA_SECURITY_POLICY, + /*!< Set security policy.*/ + M2M_SIGMA_SET_SYSTIME + /*!< Set system time.*/ +} tenuM2mSigmaCmd; + +/*! +@enum \ + tenuM2mSslCmd + +@brief + This enum contains WINC commands related to TLS handshake. +*/ +typedef enum{ + M2M_SSL_REQ_CERT_VERIF, + M2M_SSL_REQ_ECC, + M2M_SSL_RESP_ECC, + M2M_SSL_RSV, + M2M_SSL_REQ_WRITE_OWN_CERTS, + M2M_SSL_REQ_SET_CS_LIST, + M2M_SSL_RESP_SET_CS_LIST, + M2M_SSL_RESP_WRITE_OWN_CERTS +}tenuM2mSslCmd; + + +/*! +@enum \ + tenuM2mConnState + +@brief + This enum contains all the Wi-Fi connection states. +*/ +typedef enum { + M2M_WIFI_DISCONNECTED = 0, + /*!< Wi-Fi state is disconnected. */ + M2M_WIFI_CONNECTED, + /*!< Wi-Fi state is connected. */ + M2M_WIFI_UNDEF = 0xff + /*!< Undefined Wi-Fi State. */ +}tenuM2mConnState; + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi security types. +*/ +typedef enum { + M2M_WIFI_SEC_INVALID = 0, + /*!< Invalid security type. */ + M2M_WIFI_SEC_OPEN, + /*!< Wi-Fi network is not secured. */ + M2M_WIFI_SEC_WPA_PSK, + /*!< Wi-Fi network is secured with WPA/WPA2 personal(PSK). */ + M2M_WIFI_SEC_WEP, + /*!< Security type WEP (40 or 104) OPEN OR SHARED. */ + M2M_WIFI_SEC_802_1X + /*!< Wi-Fi network is secured with WPA/WPA2 Enterprise.IEEE802.1x user-name/password authentication. */ +}tenuM2mSecType; + + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi SSID types. +*/ +typedef enum { + SSID_MODE_VISIBLE = 0, + /*!< SSID is visible to others. */ + SSID_MODE_HIDDEN + /*!< SSID is hidden. */ +}tenuM2mSsidMode; + +/*! +@enum \ + tenuM2mScanCh + +@brief + This enum contains all the Wi-Fi RF channels. +*/ +typedef enum { + M2M_WIFI_CH_1 = ((uint8) 1), + /*!< Channel 1. */ + M2M_WIFI_CH_2, + /*!< Channel 2. */ + M2M_WIFI_CH_3, + /*!< Channel 3. */ + M2M_WIFI_CH_4, + /*!< Channel 4. */ + M2M_WIFI_CH_5, + /*!< Channel 5. */ + M2M_WIFI_CH_6, + /*!< Channel 6. */ + M2M_WIFI_CH_7, + /*!< Channel 7. */ + M2M_WIFI_CH_8, + /*!< Channel 8. */ + M2M_WIFI_CH_9, + /*!< Channel 9. */ + M2M_WIFI_CH_10, + /*!< Channel 10. */ + M2M_WIFI_CH_11, + /*!< Channel 11. */ + M2M_WIFI_CH_12, + /*!< Channel 12. */ + M2M_WIFI_CH_13, + /*!< Channel 13. */ + M2M_WIFI_CH_14, + /*!< Channel 14. */ + M2M_WIFI_CH_ALL = ((uint8) 255) +}tenuM2mScanCh; + +/*! +@enum \ + tenuM2mScanRegion + +@brief + This enum contains all the Wi-Fi channel regions. +*/ +typedef enum { + REG_CH_1 = ((uint16) 1 << 0), + /*!< Region channel 1. */ + REG_CH_2 = ((uint16) 1 << 1), + /*!< Region channel 2. */ + REG_CH_3 = ((uint16) 1 << 2), + /*!< Region channel 3. */ + REG_CH_4 = ((uint16) 1 << 3), + /*!< Region channel 4. */ + REG_CH_5 = ((uint16) 1 << 4), + /*!< Region channel 5. */ + REG_CH_6 = ((uint16) 1 << 5), + /*!< Region channel 6. */ + REG_CH_7 = ((uint16) 1 << 6), + /*!< Region channel 7. */ + REG_CH_8 = ((uint16) 1 << 7), + /*!< Region channel 8. */ + REG_CH_9 = ((uint16) 1 << 8), + /*!< Region channel 9. */ + REG_CH_10 = ((uint16) 1 << 9), + /*!< Region channel 10. */ + REG_CH_11 = ((uint16) 1 << 10), + /*!< Region channel 11. */ + REG_CH_12 = ((uint16) 1 << 11), + /*!< Region channel 12. */ + REG_CH_13 = ((uint16) 1 << 12), + /*!< Region channel 13. */ + REG_CH_14 = ((uint16) 1 << 13), + /*!< Region channel 14. */ + REG_CH_ALL = ((uint16) 0x3FFF), + /*!< Region for all channels. */ + NORTH_AMERICA = ((uint16) 0x7FF), + /*!< North America region with 11 channels*/ + EUROPE = ((uint16) 0x1FFF), + /*!u8Status == M2M_SUCCESS) + { + m2m_wifi_connect((char*)pstrProvInfo->au8SSID, (uint8)strlen(pstrProvInfo->au8SSID), pstrProvInfo->u8SecType, + pstrProvInfo->au8Password, M2M_WIFI_CH_ALL); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8 bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 bEnableHttpRedirect); + +/*! +@fn \ + sint8 m2m_wifi_stop_provision_mode(void); + +@brief + Synchronous API for terminating provisioning mode on the WINC IC. + +@details + This function will terminate any currently active provisioning mode on the WINC IC, returning the + IC to idle. + +@return + The function returns ZERO for success and a negative value otherwise. + +@pre + An active provisioning session must be active before it is terminated through this function. +@see + m2m_wifi_start_provision_mode +*/ +NMI_API sint8 m2m_wifi_stop_provision_mode(void); + +/*! +@fn \ + sint8 m2m_wifi_get_connection_info(void); + +@brief + Asynchronous API for retrieving the WINC IC's connection status. + +@details + Requests the connection status from the WINC IC including information regarding any access + point to which it is currently connected, or any non-AP station that is connected to the WINC. + All information will be returned to the application via the Wi-Fi notifiction callback and the + event @ref M2M_WIFI_RESP_CONN_INFO. + + The connection info can be retrieved using the structure @ref tstrM2MConnInfo which contains: + - Connection Security + - Connection RSSI + - Remote MAC address + - Remote IP address + - SSID of the network (in cases where the WINC is in non-AP mode) + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the initialization + @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the + requested connection info. + +@warning + - In case of WINC AP mode or P2P mode, the SSID field shall be a NULL string. + +@see + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +\section WIFIExample2 Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API sint8 m2m_wifi_get_connection_info(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +@brief + Synchronous API for assigning a MAC address to the WINC IC. + +@details + This function is intended to allow non-production software to assign a MAC address to the WINC IC. + +@param [in] au8MacAddress + MAC Address to be provisioned to the WINC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is intended for development use only and not for use in production software. +*/ +NMI_API sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char * pcPinNumber); + +@brief + Asynchronous API to engage the WINC IC's Wi-Fi Protected Setup (enrolee) function. + +@details + This function can be called to make the WINC enter WPS (Wi-Fi Protected Setup) mode. The result + is passed to the Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + +@param [in] u8TriggerType + WPS Trigger method. This may be: + - [WPS_PIN_TRIGGER](@ref WPS_PIN_TRIGGER) Push button method + - [WPS_PBC_TRIGGER](@ref WPS_PBC_TRIGGER) Pin method + +@param [in] pcPinNumber + Valid only if the u8TriggerType is WPS_PIN_TRIGGER, this parameter contains the PIN number. + The number must follow the format as given in the WSC1.0 specification. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is not supported in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the + [m2m_wifi_init](@ref m2m_wifi_init). + - The event [M2M_WIFI_REQ_WPS](@ref M2M_WIFI_REQ_WPS) must be handled in the callback to receive + the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be + performed. + - The [m2m_wifi_handle_events](@ref m2m_wifi_handle_events) MUST be called to receive the responses + in the callback. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +\section WIFIExample3 Example + The code snippet shows an example of how wifi WPS is triggered . +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch + 1); + + // establish Wi-Fi connection + m2m_wifi_connect((char*)pstrWPS->au8SSID, (uint8)m2m_strlen(pstrWPS->au8SSID), + pstrWPS->u8AuthType, pstrWPS->au8PSK, pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ + + +NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx); +/*! +@fn \ + NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx); + +@brief + Asynchronous API that notifies the WINC with the Gain Table index from Flash that should use to configure the WiFi and BLE gains. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_wps(uint8 u8TriggerType,const char *pcPinNumber); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_wps_disable(void); + +@brief + Synchronous API that disables Wi-Fi Protected Setup mode in the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_wps_disable(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +@brief + Asynchronous API for enabling Wi-Fi Direct (P2P) mode in the WINC IC. + +@param [in] u8Channel + P2P Listen RF channel. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF + must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + - This function is not available in the WINC 3400 + - This function is not allowed in AP or STA modes. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +\section WIFIExample4 Example + The code snippet shows an example of how the p2p mode operates. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? "CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("P2P IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_p2p(uint8 u8Channel); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_p2p_disconnect(void); + +@brief + Synchronous API to disable Wi-Fi Direct (P2P) Mode on the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_p2p +*/ +NMI_API sint8 m2m_wifi_p2p_disconnect(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC IC + +@details + The WINC IC supports the ability to operate as an access point with the limitation that: + - only 1 station may be associated at any one time + - open system and WEP are the only security suites supported. + +@param [in] pstrM2MAPConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the [m2m_wifi_init](@ref m2m_wifi_init). + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +\section WIFIExample5 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8 *pu8IPAddress = (uint8*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[0] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode + +*/ +NMI_API sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_disable_ap(void); + +@brief + Synchronous API to disable access point mode on the WINC IC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_enable_ap +*/ +NMI_API sint8 m2m_wifi_disable_ap(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@brief + Synchronous API to manually assign a (static) IP address to the WINC IC. + +@details + Typically an infrastructure access point will be able to provide an IP address to all clients + after they associate. The WINC will request configuration via DHCP automatically after + successfully connecting to an access point. This function should only be called in the event + that the network has no DHCP server and the application knows the specifics of the network. + +@param [in] pstrStaticIPConf + Pointer to a structure holding the static IP Configurations (IP, Gateway, subnet mask and + DNS address). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + The application must first call @ref m2m_wifi_enable_dhcp to request that DHCP functionality is + disabled prior to calling this function. + +@warning + Exercise caution using this function. DHCP is the preferred method for configuring IP addresses. + +@see + tstrM2MIPConfig +*/ +NMI_API sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +@brief + Legacy (deprecated) Asynchronous API for starting a DHCP client on the WINC IC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC IC. + +@return + This function always returns @ref M2M_SUCCESS. + +@warning + - This function has been deprecated. DHCP is used automatically when the WINC IC connects. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_client(void); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +@brief + Legacy (deprecated) Asynchronous function to start a DHCP client on the WINC IC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC IC. + +@param [in] addr The address to issue to a connected client (only one client is supported) + +@return + This function always returns @ref M2M_SUCCESS. + +@warning + - This function has been deprecated. DHCP is used automatically when the WINC IC connects. +*/ +NMI_API sint8 m2m_wifi_request_dhcp_server(uint8* addr); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + +@brief + Asynchronous function to control the DHCP client functionality within the WINC IC. + +@details + This function allows the application to control the behaviour of the DHCP client function within + the WINC IC once it has associated with an access point. DHCP client functionality is enabled by + default. + +@param [in] u8DhcpEn + The state of the DHCP client feature after successful association with an access point: + - 0: DHCP client will be disabled after connection. + - 1: DHCP client will be enabled after connection. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@warning + - DHCP client is enabled by default + - This Function should be called to disable DHCP client operation before using @ref m2m_wifi_set_static_ip + +@see + m2m_wifi_set_static_ip() +*/ +NMI_API sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ); + + +/*! +@fn \ + sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) + +@brief + Synchronous API for configuring the behaviour of the WINC IC's network scanning functions. + +@details + This function allows the application to tune the scanning behaviour of the WINC IC using the + parameters described in @ref tstrM2MScanOption. + +@param [in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption +*/ +NMI_API sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption); + +/*! +@fn \ + sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) + +@brief + Synchronous API for configuring the regulatory restrictions that may affect the WINC ICs + scanning behaviour. + +@details + This function sets a property called the scan region, a parameter that affects the range of + channels that the WINC IC may legally scan given a geographic region. + +@param [in] ScanRegion + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tenuM2mScanRegion + m2m_wifi_request_scan + +*/ +NMI_API sint8 m2m_wifi_set_scan_region(uint16 ScanRegion); + +/*! +@fn \ + NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +@brief + Asynchronous API to request the WINC IC perform a scan for networks. + +@details + Scan statuses are delivered to the application via the Wi-Fi event callback (@ref tpfAppWifiCb) in + three stages. The first step involves the event @ref M2M_WIFI_RESP_SCAN_DONE which, if successful, + provides the number of detected networks (access points). The application must then read the list + of access points via multiple calls to the asynchronous @ref m2m_wifi_req_scan_result API. For + each call to this function, the application will receive (step three) the event + @ref M2M_WIFI_RESP_SCAN_RESULT. + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This API is valid only for STA mode, it may be called regardless of connection state (connected + or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registration of the callback is done via @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in + the (tpfAppWifiCb) callback. + - The @ref m2m_wifi_handle_events function must be called to receive the responses in the + callback. + +@see M2M_WIFI_RESP_SCAN_DONE +@see M2M_WIFI_RESP_SCAN_RESULT +@see tpfAppWifiCb +@see tstrM2mWifiscanResult +@see tenuM2mScanCh +@see m2m_wifi_init +@see m2m_wifi_handle_events +@see m2m_wifi_req_scan_result + +\section WIFIExample6 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_request_scan(uint8 ch); + +/*! +@fn \ + sint8 m2m_wifi_request_scan_passive(uint8 ch); + +@param [in] ch + RF Channel ID for SCAN operation. It should be set according to tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see m2m_wifi_request_scan +@see M2M_WIFI_RESP_SCAN_DONE +@see M2M_WIFI_RESP_SCAN_RESULT +@see tpfAppWifiCb +@see tstrM2MScanOption +@see tstrM2mWifiscanResult +@see tenuM2mScanCh +@see m2m_wifi_init +@see m2m_wifi_handle_events +@see m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +sint8 m2m_wifi_request_scan_passive(uint8 ch); + +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +@brief + Synchronous API to retrieve the number of AP's found during the last scan operation. + +@details + This function allows the application to recover the number of access points discovered during + the most recent scan activity. This is achieved via a global variable in the WINC driver that + is populated when receiving the M2M_WIFI_RESP_SCAN_DONE event. + +@return + Return the number of AP's found in the last Scan Request. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + +@pre + - m2m_wifi_request_scan must be called first to ensure up to date results are available. + +@warning + - This function must be called only in the wi-fi callback function when the events + @ref M2M_WIFI_RESP_SCAN_DONE or @ref M2M_WIFI_RESP_SCAN_RESULT are received. Calling this + function in any other place may result in undefined/outdated numbers. + +\section WIFIExample7 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +NMI_API uint8 m2m_wifi_get_num_ap_found(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); + +@brief + Asynchronous API to request the information of an access point discovered via scanning. + +@details + This function allows the information of any discovered access point to be retrieved. When a + scan is completed, the application is informed of the number of networks (access points) + discovered. Calling this function with an index, N, will return the information for the Nth + access point. The information will be returned to the application via a + @ref M2M_WIFI_RESP_SCAN_RESULT event, and the response data may be obtained through casting + the pointer (pvMsg) to @ref tstrM2mWifiscanResult. + +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre + - @ref m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb must be implemented and registered + in order to receive scan data after calling this function. Registration of the callback + is done via the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the + requested connection information. + +@warning + - This API is valid only for STA mode, it may be called regardless of connection state (connected + or disconnected). + - Calling this function without first issuing a scan request may lead to stale data being + recovered. + - Application code should refrain from introducing significant delays between issuing the scan + request and scan result requests. + +\section WIFIExample8 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8 u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); + +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); + +@brief + Asynchronous API to request the current Receive Signal Strength (RSSI) of the current connection. + +@details + This function will result in the application receiving the RSSI via a + @ref M2M_WIFI_RESP_CURRENT_RSSI event. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback. + +\section WIFIExample9 Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of event received in the callback. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8 u8WiFiEvent, void * pvMsg) + { + static uint8 u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + sint8 *rssi = (sint8*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } + +@endcode +*/ +NMI_API sint8 m2m_wifi_req_curr_rssi(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_restrict_ble(void); + +@brief + Asynchronous API to request restricting of BLE functionality by placing the BLE processor in a low power state. + It is recommended to do this if it is know that BLE functionality will not be used for any significant length of time. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + +*/ +NMI_API sint8 m2m_wifi_req_restrict_ble(void); + +/*! +@fn NMI_API sint8 m2m_wifi_req_unrestrict_ble(void); + +@brief + Asynchronous API to request un-restricting of BLE functionality by reverting the BLE processor to full power mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + +*/ +NMI_API sint8 m2m_wifi_req_unrestrict_ble(void); + +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +@brief + Synchronous API to query the MAC address programmed into the WINC ICs OTP memory + +@details + This function attempts to read the device's MAC address from the One Time Programmable (OTP) + memory on the IC. The presence (yes or no) of a MAC address in the OTP memory and, in the case + of it being present, its value are returned via RAM pointed to by the input arguments. + +@param [out] pu8MacAddr + Output MAC address buffer 6 bytes in size. This is valid only if *pu8Valid equals 1. + +@param [out] pu8IsValid + A boolean value set by the callee to indicate the validity of pu8MacAddr in OTP. If no MAC has + been programmed in the OTP the value of this parameter will be zero; otherwise it will be + non-zero. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_get_mac_address + +*/ +NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) + +@brief + Synchronous API to retrieve the MAC address currently in use on the device. + +@details + This function obtains the MAC address that is currently in use by the device. If the function + returns with @ref M2M_SUCCESS then the content of the memory referenced by pu8MacAddr will be + populated with the 6 byte MAC address; otherwise, that memory will be left unchanged. + +@param [out] pu8MacAddr + Pointer to a buffer in memory containing a 6-byte MAC address (provided function returns + MEM_SUCCESS) + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + m2m_wifi_get_otp_mac_address +*/ +NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr); + +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); + +@brief + Synchronous API to set the power-save mode of the WINC IC. + +@param [in] PsTyp + Desired power saving mode. Supported types are defined in @ref tenuPowerSaveModes. + +@param [in] BcastEn + Broadcast reception enable flag. + - If set to 1, the WINC IC will wake for each DTIM beacon to ensure broadcast traffic can be + received. + - If set to 0, the WINC IC will not wakeup at the DTIM beacon, instead it will wake every N + beacon periods as per the negotiated Listen Interval. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + tenuPowerSaveModes + m2m_wifi_get_sleep_mode +*/ +NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); + +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); + +@brief + Asynchronous API to place the WINC IC into sleep mode for a specified period of time. + +@details + This function allows a WINC IC that is running in M2M_PS_MANUAL mode to be placed into sleep + state for a specified period of time (measured in milliseconds). + +@param [in] u32SlpReqTime + The time in ms that the WINC IC should sleep for + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + - This API is currently unsupported on the WINC3400 + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +NMI_API sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime); + +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); + +@brief + Synchronous API to retrieve the current power save mode of the WINC IC. + +@return + The current operating power saving mode. The value will be one of those from the enumerated type + @ref tenuPowerSaveModes. + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +NMI_API uint8 m2m_wifi_get_sleep_mode(void); + +#if 0 +/* + * These two functions are for a mode in which two WINC ICs communicate with each other + * via probe request and probe response frames. This mode is not supported in WINC fw. + */ +NMI_API sint8 m2m_wifi_req_client_ctrl(uint8 cmd); +NMI_API sint8 m2m_wifi_req_server_init(uint8 ch); +#endif + +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); + +@brief + Asynchronous API to set the Wi-Fi Direct "Device Name" of the WINC IC + +@param [in] pu8DeviceName + Buffer holding the device name. + +@param [in] u8DeviceNameLength + Length of the device name. Should not exceed the maximum device name's length M2M_DEVICE_NAME_MAX. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); + +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@brief + Asynchronous API to set Wi-Fi listen interval for power save operation. + +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + The function @ref m2m_wifi_set_sleep_mode shall be called first + +@see + - tstrM2mLsnInt + - m2m_wifi_set_sleep_mode +*/ +NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8 *, uint16 , uint16); + +@brief + Asynchronous call to enable Wi-Fi monitoring (promiscuous receive) mode. + +@details + This function places the reciver into a mode where all frames (or those matching a set of filter + criteria) received on air are passed to the application. + + A dedicated callback function, @ref tpfAppMonCb, must be registered to handle frames received in + promiscuous mode. This is done via an instance of a @ref tstrWifiInitParam structure and a call to + the @ref m2m_wifi_init function. + +@param [in] pstrMtrCtrl + Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the Filtering parameters. + +@param [in] pu8PayloadBuffer + Pointer to a Buffer allocated by the application. The buffer SHALL hold the Data field of + the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + be discarded by the monitoring driver. + +@param [in] u16BufferSize + The total size of the pu8PayloadBuffer in bytes. + +@param [in] u16DataOffset + Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + in reading specific information from the received packet. It must assign the offset to the starting + position of it relative to the DATA payload start.\n + \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ + \e packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This mode available as sniffer ONLY, you can not be connected in any modes (Station, Access Point, + or P2P). + + @see + - tstrM2MWifiMonitorModeCtrl + - tstrM2MWifiRxPacketInfo + - tstrWifiInitParam + - tenuM2mScanCh + - m2m_wifi_disable_monitoring_mode + +\section WIFIExample10 Example + The example demonstrates the main function where-by the monitoring enable function is called after + the initialization of the driver and the packets are handled in the callback function. + +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + //Declare receive buffer + uint8 gmgmt[1600]; + + //Callback functions + void wifi_cb(uint8 u8WiFiEvent, void * pvMsg) + { + ; + } + + void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8 *pu8Payload, uint16 u16PayloadSize) + { + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } + } + + int main() + { + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; + } +@endcode +*/ +NMI_API sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset); + +/*! +@fn NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + +@brief + Asynchronous API to disable Wi-Fi monitoring (promiscuous receive) mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + */ +NMI_API sint8 m2m_wifi_disable_monitoring_mode(void); + +/*! +@fn NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *, uint16, uint16); + +@brief + Asynchronous API to queue a raw Wi-Fi packet for transmission by the WINC IC. + +@param [in] pu8WlanPacket + Pointer to a buffer holding the whole WIFI frame. + +@param [in] u16WlanHeaderLength + The size of the WIFI packet header ONLY. + +@param [in] u16WlanPktSize + The size of the whole bytes in packet. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_monitoring_mode + - m2m_wifi_disable_monitoring_mode + +@warning + This function is only available in builds supporting monitoring mode. +*/ +NMI_API sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize); + +/*! +@fn NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) + +@brief + Asynchronous API to queue an Ethernet packet for transmission by the WINC IC. + +@param [in] pu8Packet + Pointer to a buffer holding the whole Ethernet frame. + +@param [in] u16PacketSize + The size of the whole bytes in packet. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_monitoring_mode + - m2m_wifi_disable_monitoring_mode + +@warning + This function is only available in builds supporting monitoring mode. +*/ +NMI_API sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_sntp(uint8); + +@brief + Asynchronous API to enable or disable the SNTP client running on the WINC IC. + +@details + The SNTP client is enabled by default during chip initialisation. This function can be used to + disable or subsequently re-enable the service. + + The service is capable of syncrhonising the WINC's system clock to the UTC time from a well-known + (and trusted) time server, for example "time.nist.gov". By default the SNTP client will update the + system time once every 24 hours. The ability to track the time accurately is important for various + applications such as checking expiry of X509 certificates during TLS session establishment. + + It is highly recommended to leave SNTP enabled if there is no alternative source of timing + information. For systems including an RTC device, SNTP may not be needed and the WINC IC's time + may be set using the @ref m2m_wifi_set_sytem_time function. + +@param [in] bEnable + Enables or disables the SNTP service + - '0' : disable SNTP + - '1' : enable SNTP + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see m2m_wifi_set_sytem_time + */ +NMI_API sint8 m2m_wifi_enable_sntp(uint8 bEnable); + +/*! +@fn NMI_API sint8 m2m_wifi_set_sytem_time(uint32); + +@brief + Asynchronous function for setting the system time within the WINC IC. + +@param [in] u32UTCSeconds + UTC value in seconds. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@see + - m2m_wifi_enable_sntp + - tstrSystemTime + +@note + If there is an RTC on the host MCU, the SNTP may be disabled and the host may set the system + time within the firmware using the API @ref m2m_wifi_set_sytem_time. + */ +NMI_API sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds); + +/*! +@fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + +@brief + Asynchronous API to obtain the system time in use by the WINC IC. + +@details + This function will request that the WINC IC send it's current system time to the application. The + information will arrive at the application via the @ref tpfAppWifiCb and event @ref + M2M_WIFI_RESP_GET_SYS_TIME. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the + [m2m_wifi_init](@ref m2m_wifi_init) API. + - The event @ref M2M_WIFI_RESP_GET_SYS_TIME must be handled in the callback. + +@see + - m2m_wifi_enable_sntp + - tstrSystemTime + */ +NMI_API sint8 m2m_wifi_get_sytem_time(void); + +/*! +@fn NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8*); + +@brief + Asynchronous API to add or remove a user-defined Information Element + +@details + This function allows the application to provide a custom Information Element to the WINC IC that will + be included in all beacon and probe response frames. + +@param [in] pau8M2mCustInfoElement + Pointer to Buffer containing the IE to be used. If null, this removes any current custom IE. If + non-null, the pointer must reference data in the following format: + +@verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- ---------------------- + | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- --------|-----------|------------------| + | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- ---------------------- +@endverbatim + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + - Size of All elements combined must not exceed 255 byte.\n + - Used in Access Point Mode \n + +\section WIFIExample11 Example + The example demonstrates how the information elements are set using this function. +@code + char elementData[21]; + static char state = 0; // To Add, Append, and Delete + if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; + } else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; + } else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; + } + m2m_wifi_set_cust_InfoElement(elementData); +@endcode + */ +NMI_API sint8 m2m_wifi_set_cust_InfoElement(uint8* pau8M2mCustInfoElement); + +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); + +@brief Change the power profile mode + +@param [in] u8PwrMode + Change the WINC power profile to one of the modes: PWR_LOW1, PWR_LOW2, PWR_HIGH, PWR_AUTO. + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mPwrMode + +@warning + May only be called after initialization, before any connection request, and may not be used to change + the power mode thereafter. +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); + +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); + +@brief set the TX power tenuM2mTxPwrLevel + +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@sa tenuM2mTxPwrLevel +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); + +@brief + Enable or Disable logs in run time (Disable Firmware logs will enhance the firmware start-up time + and performance) + +@param [in] u8Enable + Set 1 to enable the logs 0 for disable + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint8 u8BattVolt) + +@brief + Set the battery voltage to update the firmware calculations + +@param [in] dbBattVolt + Battery Voltage + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); + +/*! +@fn NMI_API sint8 m2m_wifi_ble_api_send(const uint8* const msg, const uint32 len); + +@brief + Asynchronous API to send an encapsulated Atmel BLE message over the Wifi Host Interface + +@param [in] msg + Pointer to the start of the BLE message to transfer down to the WINC + +@param [in] len + The length of the message in octets + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + */ +NMI_API sint8 m2m_wifi_ble_api_send(uint8* msg, uint32 len); + + +/*! +@fn NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8 *, uint8); + +@brief + Asynchronous API to add or remove MAC addresses in the multicast filter + +@details + This function allows the application to configure the capability of the WINC IC to receive multicast + packets when operating in bypass mode. + +@param [in] pu8MulticastMacAddress + Pointer to MAC address + +@param [in] u8AddRemove + A flag to add or remove the MAC ADDRESS, based on the following values: + - 0 : remove MAC address + - 1 : add MAC address + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@note + Maximum number of MAC addresses that could be added is 8. + +@warning + This functionality is not supported by current WINC firmware. + */ +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove); + +/*! +@fn NMI_API sint8 m2m_wifi_set_receive_buffer(void *, uint16); + +@brief + Asynchronous API to set or change the size of the WINC IC's receive buffer + +@param [in] pvBuffer + Pointer to Buffer to receive data. A NULL pointer causes a negative error @ref M2M_ERR_FAIL. + +@param [in] u16BufferLen + Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + defined as @ref SOCKET_BUFFER_MAX_LENGTH + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@warning + This functionality is not supported by current WINC firmware. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +/**@}*/ + +/**@defgroup VERSIONAPI Functions + @ingroup VERSION + */ +/**@{*/ + + +/*! +@fn uint32 m2m_wifi_get_chipId(void) + +@brief + Synchronous API to obtain the firmware WINC chip ID + +@return + The function SHALL return chipID > 0 or 0 for failure. +*/ +uint32 m2m_wifi_get_chipId(void); +/*! +@fn sint8 m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +sint8 m2m_wifi_check_ota_rb(void); +/*! +@fn sint8 m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +/**@}*/ + +/*! + * @fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PRNGBuff,uint16 u16PRNGSize) + * @param [in] pu8PrngBuff + * Pointer to Buffer to receive data. + * Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + * causes a negative error @ref M2M_ERR_FAIL. + * @param [in] u16PrngSize + request size in bytes + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ + diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ate_mode.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ate_mode.c new file mode 100644 index 0000000..0f2964a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ate_mode.c @@ -0,0 +1,771 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherials Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef _M2M_ATE_FW_ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_ate_mode.h" +#include "driver/source/nmasic.h" +#include "driver/source/nmdrv.h" +#include "m2m_hif.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define rInterrupt_CORTUS_0 (0x10a8) +#define rInterrupt_CORTUS_1 (0x10ac) +#define rInterrupt_CORTUS_2 (0x10b0) + +#define rBurstTx_NMI_TX_RATE (0x161d00) +#define rBurstTx_NMI_NUM_TX_FRAMES (0x161d04) +#define rBurstTx_NMI_TX_FRAME_LEN (0x161d08) +#define rBurstTx_NMI_TX_CW_PARAM (0x161d0c) +#define rBurstTx_NMI_TX_GAIN (0x161d10) +#define rBurstTx_NMI_TX_DPD_CTRL (0x161d14) +#define rBurstTx_NMI_USE_PMU (0x161d18) +#define rBurstTx_NMI_TEST_CH (0x161d1c) +#define rBurstTx_NMI_TX_PHY_CONT (0x161d20) +#define rBurstTx_NMI_TX_CW_MODE (0x161d24) +#define rBurstTx_NMI_TEST_XO_OFF (0x161d28) +#define rBurstTx_NMI_USE_EFUSE_XO_OFF (0x161d2c) + +#define rBurstTx_NMI_MAC_FILTER_ENABLE_DA (0x161d30) +#define rBurstTx_NMI_MAC_ADDR_LO_PEER (0x161d34) +#define rBurstTx_NMI_MAC_ADDR_LO_SELF (0x161d38) +#define rBurstTx_NMI_MAC_ADDR_HI_PEER (0x161d3c) +#define rBurstTx_NMI_MAC_ADDR_HI_SELF (0x161d40) +#define rBurstTx_NMI_RX_PKT_CNT_SUCCESS (0x161d44) +#define rBurstTx_NMI_RX_PKT_CNT_FAIL (0x161d48) +#define rBurstTx_NMI_SET_SELF_MAC_ADDR (0x161d4c) +#define rBurstTx_NMI_MAC_ADDR_LO_SA (0x161d50) +#define rBurstTx_NMI_MAC_ADDR_HI_SA (0x161d54) +#define rBurstTx_NMI_MAC_FILTER_ENABLE_SA (0x161d58) + +#define rBurstRx_NMI_RX_ALL_PKTS_CONT (0x9898) +#define rBurstRx_NMI_RX_ERR_PKTS_CONT (0x988c) + +#define TX_DGAIN_MAX_NUM_REGS (4) +#define TX_DGAIN_REG_BASE_ADDRESS (0x1240) +#define TX_GAIN_CODE_MAX_NUM_REGS (3) +#define TX_GAIN_CODE_BASE_ADDRESS (0x1250) +#define TX_PA_MAX_NUM_REGS (3) +#define TX_PA_BASE_ADDRESS (0x1e58) +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +VARIABLES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +volatile static uint8 gu8AteIsRunning = 0; /*!< ATE firmware status, 1 means ATE is running otherwise stopped */ +volatile static uint8 gu8RxState = 0; /*!< RX status, 1 means Rx is running otherwise stopped */ +volatile static uint8 gu8TxState = 0; /*!< TX status, 1 means Tx is running otherwise stopped */ +volatile static uint32 gaAteFwTxRates[M2M_ATE_MAX_NUM_OF_RATES] = +{ + 0x01, 0x02, 0x05, 0x0B, /*B-Rats*/ + 0x06, 0x09, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x36, /*G-Rats*/ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 /*N-Rats*/ +}; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static void m2m_ate_set_rx_status(uint8 u8Value) +{ + gu8RxState = u8Value; +} + +static void m2m_ate_set_tx_status(uint8 u8Value) +{ + gu8TxState = u8Value; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/*! +@fn \ + sint8 m2m_ate_init(void); + +@brief + This function used to download ATE firmware from flash and start it + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_init(uint32 req_serial_number) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8WifiMode = M2M_WIFI_MODE_CONFIG; + + s8Ret = nm_drv_init(&u8WifiMode, req_serial_number); + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_deinit(void); + +@brief + De-Initialization of ATE firmware mode + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_deinit(void) +{ + return nm_drv_deinit(NULL); +} + +/*! +@fn \ + sint8 m2m_ate_set_fw_state(uint8); + +@brief + This function used to change ATE firmware status from running to stopped or vice versa. + +@param [in] u8State + Required state of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init +*/ +sint8 m2m_ate_set_fw_state(uint8 u8State) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32_t u32Val = 0; + + if((M2M_ATE_FW_STATE_STOP == u8State) && (M2M_ATE_FW_STATE_STOP != gu8AteIsRunning)) + { + u32Val = nm_read_reg(rNMI_GLB_RESET); + u32Val &= ~(1 << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + gu8AteIsRunning = M2M_ATE_FW_STATE_STOP; + } + else if((M2M_ATE_FW_STATE_RUN == u8State) && (M2M_ATE_FW_STATE_RUN != gu8AteIsRunning)) + { + /* 0x1118[0]=0 at power-on-reset: pad-based control. */ + /* Switch cortus reset register to register control. 0x1118[0]=1. */ + u32Val = nm_read_reg(rNMI_BOOT_RESET_MUX); + u32Val |= (1 << 0); + s8Ret = nm_write_reg(rNMI_BOOT_RESET_MUX, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + /** + Write the firmware download complete magic value 0x10ADD09E at + location 0xFFFF000C (Cortus map) or C000C (AHB map). + This will let the boot-rom code execute from RAM. + **/ + s8Ret = nm_write_reg(0xc0000, 0x71); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + + u32Val = nm_read_reg(rNMI_GLB_RESET); + if((u32Val & (1ul << 10)) == (1ul << 10)) + { + u32Val &= ~(1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + } + + u32Val |= (1ul << 10); + s8Ret = nm_write_reg(rNMI_GLB_RESET, u32Val); + if(M2M_SUCCESS != s8Ret) + { + goto __EXIT; + } + gu8AteIsRunning = M2M_ATE_FW_STATE_RUN; + } + else + { + s8Ret = M2M_ATE_ERR_UNHANDLED_CASE; + } + +__EXIT: + if((M2M_SUCCESS == s8Ret) && (M2M_ATE_FW_STATE_RUN == gu8AteIsRunning)) + { + nm_bsp_sleep(500); /*wait for ATE firmware start up*/ + } + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_fw_state(uint8); + +@brief + This function used to return status of ATE firmware. + +@return + The function SHALL return status of ATE firmware, one of \ref tenuM2mAteFwState enumeration values. +\sa + m2m_ate_init, m2m_ate_set_fw_state +*/ +sint8 m2m_ate_get_fw_state(void) +{ + return gu8AteIsRunning; +} + +/*! +@fn \ + uint32 m2m_ate_get_tx_rate(uint8); + +@brief + This function used to return value of TX rate required by application developer. + +@param [in] u8Index + Index of required rate , one of \ref tenuM2mAteTxIndexOfRates enumeration values. +@return + The function SHALL return 0 for in case of failure otherwise selected rate value. +\sa + tenuM2mAteTxIndexOfRates +*/ +uint32 m2m_ate_get_tx_rate(uint8 u8Index) +{ + if(M2M_ATE_MAX_NUM_OF_RATES <= u8Index) + { + return 0; + } + return gaAteFwTxRates[u8Index]; +} + +/*! +@fn \ + sint8 m2m_ate_get_tx_status(void); + +@brief + This function used to return status of TX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if TX is running otherwise 0. +\sa + m2m_ate_start_tx, m2m_ate_stop_tx +*/ +sint8 m2m_ate_get_tx_status(void) +{ + return gu8TxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_tx(tstrM2mAteTx *) + +@brief + This function used to start TX test case. + +@param [in] strM2mAteTx + Type of \ref tstrM2mAteTx, with the values required to enable TX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_start_tx(tstrM2mAteTx * strM2mAteTx) +{ + sint8 s8Ret = M2M_SUCCESS; + uint8 u8LoopCntr = 0; + uint32_t val32; + + + if(NULL == strM2mAteTx) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if(0 != m2m_ate_get_rx_status()) + { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if( (strM2mAteTx->channel_num < M2M_ATE_CHANNEL_1) || + (strM2mAteTx->channel_num > M2M_ATE_CHANNEL_14) || + (strM2mAteTx->tx_gain_sel < M2M_ATE_TX_GAIN_DYNAMIC) || + (strM2mAteTx->tx_gain_sel > M2M_ATE_TX_GAIN_TELEC) || + (strM2mAteTx->frame_len > M2M_ATE_MAX_FRAME_LENGTH) || + (strM2mAteTx->frame_len < M2M_ATE_MIN_FRAME_LENGTH) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if( (strM2mAteTx->duty_cycle < M2M_ATE_TX_DUTY_MAX_VALUE /*1*/) || + (strM2mAteTx->duty_cycle > M2M_ATE_TX_DUTY_MIN_VALUE /*10*/ ) || + (strM2mAteTx->dpd_ctrl < M2M_ATE_TX_DPD_DYNAMIC) || + (strM2mAteTx->dpd_ctrl > M2M_ATE_TX_DPD_ENABLED) || + (strM2mAteTx->use_pmu < M2M_ATE_PMU_DISBLE) || + (strM2mAteTx->use_pmu > M2M_ATE_PMU_ENABLE) || + (strM2mAteTx->phy_burst_tx < M2M_ATE_TX_SRC_MAC) || + (strM2mAteTx->phy_burst_tx > M2M_ATE_TX_SRC_PHY) || + (strM2mAteTx->cw_tx < M2M_ATE_TX_MODE_NORM) || + (strM2mAteTx->cw_tx > M2M_ATE_TX_MODE_CW) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + for(u8LoopCntr=0; u8LoopCntrdata_rate) + { + break; + } + } + + if(M2M_ATE_MAX_NUM_OF_RATES == u8LoopCntr) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + + + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteTx->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_PHY_CONT, strM2mAteTx->phy_burst_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_NUM_TX_FRAMES, strM2mAteTx->num_frames); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_GAIN, strM2mAteTx->tx_gain_sel); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteTx->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_FRAME_LEN, strM2mAteTx->frame_len); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_PARAM, strM2mAteTx->duty_cycle); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_DPD_CTRL, strM2mAteTx->dpd_ctrl); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_RATE, strM2mAteTx->data_rate); + s8Ret += nm_write_reg(rBurstTx_NMI_TX_CW_MODE, strM2mAteTx->cw_tx); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteTx->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteTx->use_efuse_xo_offset); + + val32 = strM2mAteTx->peer_mac_addr[5] << 0; + val32 |= strM2mAteTx->peer_mac_addr[4] << 8; + val32 |= strM2mAteTx->peer_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_PEER, val32 ); + + val32 = strM2mAteTx->peer_mac_addr[2] << 0; + val32 |= strM2mAteTx->peer_mac_addr[1] << 8; + val32 |= strM2mAteTx->peer_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_PEER, val32 ); + + if(M2M_SUCCESS == s8Ret) + { + s8Ret += nm_write_reg(rInterrupt_CORTUS_0, 1); /*Interrupt Cortus*/ + m2m_ate_set_tx_status(1); + nm_bsp_sleep(200); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_tx(void) + +@brief + This function used to stop TX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_tx, m2m_ate_get_tx_status +*/ +sint8 m2m_ate_stop_tx(void) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = nm_write_reg(rInterrupt_CORTUS_1, 1); + if(M2M_SUCCESS == s8Ret) + { + m2m_ate_set_tx_status(0); + } + + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_get_rx_status(uint8); + +@brief + This function used to return status of RX test case either running or stopped. + +@return + The function SHALL return status of ATE firmware, 1 if RX is running otherwise 0. +\sa + m2m_ate_start_rx, m2m_ate_stop_rx +*/ +sint8 m2m_ate_get_rx_status(void) +{ + return gu8RxState; +} + +/*! +@fn \ + sint8 m2m_ate_start_rx(tstrM2mAteRx *) + +@brief + This function used to start RX test case. + +@param [in] strM2mAteRx + Type of \ref tstrM2mAteRx, with the values required to enable RX test case. You must use \ref m2m_ate_init first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_stop_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_start_rx(tstrM2mAteRx * strM2mAteRxStr) +{ + sint8 s8Ret = M2M_SUCCESS; + uint32 val32; + if(NULL == strM2mAteRxStr) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if(0 != m2m_ate_get_rx_status()) + { + s8Ret = M2M_ATE_ERR_RX_ALREADY_RUNNING; + goto __EXIT; + } + + if( (strM2mAteRxStr->channel_num < M2M_ATE_CHANNEL_1) || + (strM2mAteRxStr->channel_num > M2M_ATE_CHANNEL_14)|| + (strM2mAteRxStr->use_pmu < M2M_ATE_PMU_DISBLE) || + (strM2mAteRxStr->use_pmu > M2M_ATE_PMU_ENABLE) + ) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_CH, strM2mAteRxStr->channel_num); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_PMU, strM2mAteRxStr->use_pmu); + s8Ret += nm_write_reg(rBurstTx_NMI_TEST_XO_OFF, strM2mAteRxStr->xo_offset_x1000); + s8Ret += nm_write_reg(rBurstTx_NMI_USE_EFUSE_XO_OFF, strM2mAteRxStr->use_efuse_xo_offset); + + if(strM2mAteRxStr->override_self_mac_addr) + { + val32 = strM2mAteRxStr->self_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SELF, val32 ); + + val32 = strM2mAteRxStr->self_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->self_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->self_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SELF, val32 ); + } + + if(strM2mAteRxStr->mac_filter_en_sa) + { + val32 = strM2mAteRxStr->sa_mac_addr[5] << 0; + val32 |= strM2mAteRxStr->sa_mac_addr[4] << 8; + val32 |= strM2mAteRxStr->sa_mac_addr[3] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_LO_SA, val32 ); + + val32 = strM2mAteRxStr->sa_mac_addr[2] << 0; + val32 |= strM2mAteRxStr->sa_mac_addr[1] << 8; + val32 |= strM2mAteRxStr->sa_mac_addr[0] << 16; + nm_write_reg(rBurstTx_NMI_MAC_ADDR_HI_SA, val32 ); + } + + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA, strM2mAteRxStr->mac_filter_en_da); + nm_write_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA, strM2mAteRxStr->mac_filter_en_sa); + nm_write_reg(rBurstTx_NMI_SET_SELF_MAC_ADDR, strM2mAteRxStr->override_self_mac_addr); + + if(M2M_SUCCESS == s8Ret) + { + s8Ret += nm_write_reg(rInterrupt_CORTUS_2, 1); /*Interrupt Cortus*/ + m2m_ate_set_rx_status(1); + nm_bsp_sleep(10); /*Recommended*/ + } + +__EXIT: + return s8Ret; +} + +/*! +@fn \ + sint8 m2m_ate_stop_rx(void) + +@brief + This function used to stop RX test case. + +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx, m2m_ate_get_rx_status +*/ +sint8 m2m_ate_stop_rx(void) +{ + m2m_ate_set_rx_status(0); + nm_bsp_sleep(200); /*Recommended*/ + return M2M_SUCCESS; +} + +/*! +@fn \ + sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *) + +@brief + This function used to read RX statistics from ATE firmware. + +@param [out] strM2mAteRxStatus + Type of \ref tstrM2mAteRxStatus used to save statistics of RX test case. You must use \ref m2m_ate_start_rx first. +@return + The function SHALL return 0 for success and a negative value otherwise. +\sa + m2m_ate_init, m2m_ate_start_rx +*/ +sint8 m2m_ate_read_rx_status(tstrM2mAteRxStatus *strM2mAteRxStatus) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(NULL == strM2mAteRxStatus) + { + s8Ret = M2M_ATE_ERR_VALIDATE; + goto __EXIT; + } + + if(0 != m2m_ate_get_tx_status()) + { + s8Ret = M2M_ATE_ERR_TX_ALREADY_RUNNING; + goto __EXIT; + } + + if (nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_DA) || nm_read_reg(rBurstTx_NMI_MAC_FILTER_ENABLE_SA)) + { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS) + nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + strM2mAteRxStatus->num_good_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_SUCCESS); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstTx_NMI_RX_PKT_CNT_FAIL); + } + else + { + strM2mAteRxStatus->num_rx_pkts = nm_read_reg(rBurstRx_NMI_RX_ALL_PKTS_CONT) + nm_read_reg(0x989c); + strM2mAteRxStatus->num_err_pkts = nm_read_reg(rBurstRx_NMI_RX_ERR_PKTS_CONT); + strM2mAteRxStatus->num_good_pkts = strM2mAteRxStatus->num_rx_pkts - strM2mAteRxStatus->num_err_pkts; + } + +__EXIT: + return s8Ret; +} +/*! +@fn \ + sint8 m2m_ate_set_dig_gain(double dGaindB) + +@brief + This function is used to set the digital gain + +@param [in] double dGaindB + The digital gain value required to be set. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_set_dig_gain(double dGaindB) +{ + uint32_t dGain, val32; + dGain = (uint32_t)(pow(10, dGaindB/20.0) * 1024.0); + + val32 = nm_read_reg(0x160cd0); + val32 &= ~(0x1ffful << 0); + val32 |= (((uint32_t)dGain) << 0); + nm_write_reg(0x160cd0, val32); + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_dig_gain(double * pdGaindB) + +@brief + This function is used to get the digital gain + +@param [out] double * pdGaindB + The retrieved digital gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_dig_gain(double * pdGaindB) +{ + uint32 dGain, val32; + + if(!pdGaindB) return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x160cd0); + + dGain = (val32 >> 0) & 0x1ffful; + *pdGaindB = 20.0*log10((double)dGain / 1024.0); + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_pa_gain(uint32 *paGain) + +@brief + This function is used to get the pa gain + +@param [out] uint32 *paGain + The retrieved pa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_pa_gain(uint32 *paGain) +{ + uint32 val32; + + if(!paGain) + return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1e9c); + + * paGain = (val32 >> 8) & 0x3f; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) + +@brief + This function is used to get the ppa gain + +@param [out] uint32 * ppaGain + The retrieved ppa gain value obtained from HW registers. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_ppa_gain(uint32 * ppaGain) +{ + uint32 val32; + + if(!ppaGain) return M2M_ERR_INVALID_ARG; + + val32 = nm_read_reg(0x1ea0); + + * ppaGain = (val32 >> 5) & 0x7; + + return M2M_SUCCESS; +} +/*! +@fn \ + sint8 m2m_ate_get_tot_gain(double * pTotGaindB) + +@brief + This function is used to calculate the total gain + +@param [out] double * pTotGaindB + The retrieved total gain value obtained from calculations made based on the digital gain, pa and ppa gain values. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +sint8 m2m_ate_get_tot_gain(double * pTotGaindB) +{ + double totGaindB, dGaindB; + uint32 paGain,ppaGain,m_cmbPAGainStep,m_cmbPPAGainStep; + + + m2m_ate_get_pa_gain(&paGain); + m2m_ate_get_ppa_gain(&ppaGain); + m2m_ate_get_dig_gain(&dGaindB); + + switch(paGain){ + case 0x1: + m_cmbPAGainStep = 5; + break; + case 0x3: + m_cmbPAGainStep = 4; + break; + case 0x7: + m_cmbPAGainStep = 3; + break; + case 0xf: + m_cmbPAGainStep = 2; + break; + case 0x1f: + m_cmbPAGainStep = 1; + break; + case 0x3f: + m_cmbPAGainStep = 0; + break; + default: + m_cmbPAGainStep = 0; + break; + } + + + switch(ppaGain){ + case 0x1: + m_cmbPPAGainStep = 2; + break; + case 0x3: + m_cmbPPAGainStep = 1; + break; + case 0x7: + m_cmbPPAGainStep = 0; + break; + default: + m_cmbPPAGainStep = 3; + break; + } + + totGaindB = dGaindB + 18 - m_cmbPAGainStep*3; + totGaindB += 9 - m_cmbPPAGainStep*3; + + *pTotGaindB = totGaindB; + + return M2M_SUCCESS; +} +#endif //_M2M_ATE_FW_ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_crypto.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_crypto.c new file mode 100644 index 0000000..620d6ee --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_crypto.c @@ -0,0 +1,686 @@ +/** + * + * \file m2m_crypto.c + * + * \brief WINC Crypto module. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_crypto.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmasic.h" + +#ifdef CONF_CRYPTO + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*======*======*======*======*======*=======* +* WINC SHA256 HW Engine Register Definition * +*======*======*======*======*======*========*/ + +#define SHA_BLOCK_SIZE (64) + +#define SHARED_MEM_BASE (0xd0000) + + +#define SHA256_MEM_BASE (0x180000UL) +#define SHA256_ENGINE_ADDR (0x180000ul) + +/* SHA256 Registers */ +#define SHA256_CTRL (SHA256_MEM_BASE+0x00) +#define SHA256_CTRL_START_CALC_MASK (NBIT0) +#define SHA256_CTRL_START_CALC_SHIFT (0) +#define SHA256_CTRL_PREPROCESS_MASK (NBIT1) +#define SHA256_CTRL_PREPROCESS_SHIFT (1) +#define SHA256_CTRL_HASH_HASH_MASK (NBIT2) +#define SHA256_CTRL_HASH_HASH_SHIFT (2) +#define SHA256_CTRL_INIT_SHA256_STATE_MASK (NBIT3) +#define SHA256_CTRL_INIT_SHA256_STATE_SHIFT (3) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_MASK (NBIT4) +#define SHA256_CTRL_WR_BACK_HASH_VALUE_SHIFT (4) +#define SHA256_CTRL_FORCE_SHA256_QUIT_MASK (NBIT5) +#define SHA256_CTRL_FORCE_SHA256_QUIT_SHIFT (5) + +#define SHA256_REGS_SHA256_CTRL_AHB_BYTE_REV_EN (NBIT6) +#define SHA256_REGS_SHA256_CTRL_RESERVED (NBIT7) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO (NBIT8+ NBIT9+ NBIT10) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_MASK (NBIT2+ NBIT1+ NBIT0) +#define SHA256_REGS_SHA256_CTRL_CORE_TO_AHB_CLK_RATIO_SHIFT (8) +#define SHA256_REGS_SHA256_CTRL_RESERVED_11 (NBIT11) +#define SHA256_REGS_SHA256_CTRL_SHA1_CALC (NBIT12) +#define SHA256_REGS_SHA256_CTRL_PBKDF2_SHA1_CALC (NBIT13) + + +#define SHA256_START_RD_ADDR (SHA256_MEM_BASE+0x04UL) +#define SHA256_DATA_LENGTH (SHA256_MEM_BASE+0x08UL) +#define SHA256_START_WR_ADDR (SHA256_MEM_BASE+0x0cUL) +#define SHA256_COND_CHK_CTRL (SHA256_MEM_BASE+0x10) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_MASK (NBIT1 | NBIT0) +#define SHA256_COND_CHK_CTRL_HASH_VAL_COND_CHK_SHIFT (0) +#define SHA256_COND_CHK_CTRL_STEP_VAL_MASK (NBIT6 | NBIT5 | NBIT4 | NBIT3 | NBIT2) +#define SHA256_COND_CHK_CTRL_STEP_VAL_SHIFT (2) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_MASK (NBIT7) +#define SHA256_COND_CHK_CTRL_COND_CHK_RESULT_SHIFT (7) + +#define SHA256_MOD_DATA_RANGE (SHA256_MEM_BASE+0x14) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_MASK (NBIT24-1) +#define SHA256_MOD_DATA_RANGE_ST_BYTE_2_ADD_STP_SHIFT (0) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_MASK (NBIT24 | NBIT25| NBIT26) +#define SHA256_MOD_DATA_RANGE_MOD_DATA_LEN_SHIFT (24) + + +#define SHA256_COND_CHK_STS_1 (SHA256_MEM_BASE+0x18) +#define SHA256_COND_CHK_STS_2 (SHA256_MEM_BASE+0x1c) +#define SHA256_DONE_INTR_ENABLE (SHA256_MEM_BASE+0x20) +#define SHA256_DONE_INTR_STS (SHA256_MEM_BASE+0x24) +#define SHA256_TARGET_HASH_H1 (SHA256_MEM_BASE+0x28) +#define SHA256_TARGET_HASH_H2 (SHA256_MEM_BASE+0x2c) +#define SHA256_TARGET_HASH_H3 (SHA256_MEM_BASE+0x30) +#define SHA256_TARGET_HASH_H4 (SHA256_MEM_BASE+0x34) +#define SHA256_TARGET_HASH_H5 (SHA256_MEM_BASE+0x38) +#define SHA256_TARGET_HASH_H6 (SHA256_MEM_BASE+0x3c) +#define SHA256_TARGET_HASH_H7 (SHA256_MEM_BASE+0x40) +#define SHA256_TARGET_HASH_H8 (SHA256_MEM_BASE+0x44) + +/*======*======*======*======*======*=======* +* WINC BIGINT HW Engine Register Definition * +*======*======*======*======*======*========*/ + + +#define BIGINT_ENGINE_ADDR (0x180080ul) +#define BIGINT_VERSION (BIGINT_ENGINE_ADDR + 0x00) + +#define BIGINT_MISC_CTRL (BIGINT_ENGINE_ADDR + 0x04) +#define BIGINT_MISC_CTRL_CTL_START (NBIT0) +#define BIGINT_MISC_CTRL_CTL_RESET (NBIT1) +#define BIGINT_MISC_CTRL_CTL_MSW_FIRST (NBIT2) +#define BIGINT_MISC_CTRL_CTL_SWAP_BYTE_ORDER (NBIT3) +#define BIGINT_MISC_CTRL_CTL_FORCE_BARRETT (NBIT4) +#define BIGINT_MISC_CTRL_CTL_M_PRIME_VALID (NBIT5) + +#define BIGINT_M_PRIME (BIGINT_ENGINE_ADDR + 0x08) + +#define BIGINT_STATUS (BIGINT_ENGINE_ADDR + 0x0C) +#define BIGINT_STATUS_STS_DONE (NBIT0) + +#define BIGINT_CLK_COUNT (BIGINT_ENGINE_ADDR + 0x10) +#define BIGINT_ADDR_X (BIGINT_ENGINE_ADDR + 0x14) +#define BIGINT_ADDR_E (BIGINT_ENGINE_ADDR + 0x18) +#define BIGINT_ADDR_M (BIGINT_ENGINE_ADDR + 0x1C) +#define BIGINT_ADDR_R (BIGINT_ENGINE_ADDR + 0x20) +#define BIGINT_LENGTH (BIGINT_ENGINE_ADDR + 0x24) + +#define BIGINT_IRQ_STS (BIGINT_ENGINE_ADDR + 0x28) +#define BIGINT_IRQ_STS_DONE (NBIT0) +#define BIGINT_IRQ_STS_CHOOSE_MONT (NBIT1) +#define BIGINT_IRQ_STS_M_READ (NBIT2) +#define BIGINT_IRQ_STS_X_READ (NBIT3) +#define BIGINT_IRQ_STS_START (NBIT4) +#define BIGINT_IRQ_STS_PRECOMP_FINISH (NBIT5) + +#define BIGINT_IRQ_MASK (BIGINT_ENGINE_ADDR + 0x2C) +#define BIGINT_IRQ_MASK_CTL_IRQ_MASK_START (NBIT4) + +#define ENABLE_FLIPPING 1 + + + + +#define GET_UINT32(BUF,OFFSET) (((uint32)((BUF)[OFFSET])) | ((uint32)(((BUF)[OFFSET + 1]) << 8)) | \ +((uint32)(((BUF)[OFFSET + 2]) << 16)) | ((uint32)(((BUF)[OFFSET + 3]) << 24))) + +#define PUTU32(VAL32,BUF,OFFSET) \ +do \ +{ \ + (BUF)[OFFSET ] = BYTE_3((VAL32)); \ + (BUF)[OFFSET +1 ] = BYTE_2((VAL32)); \ + (BUF)[OFFSET +2 ] = BYTE_1((VAL32)); \ + (BUF)[OFFSET +3 ] = BYTE_0((VAL32)); \ +}while(0) + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrHashContext + +@brief +*/ +typedef struct{ + uint32 au32HashState[M2M_SHA256_DIGEST_LEN/4]; + uint8 au8CurrentBlock[64]; + uint32 u32TotalLength; + uint8 u8InitHashFlag; +}tstrSHA256HashCtxt; + + + +/*======*======*======*======*======*=======* +* SHA256 IMPLEMENTATION * +*======*======*======*======*======*========*/ + +sint8 m2m_sha256_hash_init(tstrM2mSha256Ctxt *pstrSha256Ctxt) +{ + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + m2m_memset((uint8*)pstrSha256Ctxt, 0, sizeof(tstrM2mSha256Ctxt)); + pstrSHA256->u8InitHashFlag = 1; + } + return 0; +} + +sint8 m2m_sha256_hash_update(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Data, uint16 u16DataLength) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint32 u32ResidualBytes; + uint32 u32NBlocks; + uint32 u32Offset; + uint32 u32CurrentBlock = 0; + uint8 u8IsDone = 0; + + /* Get the remaining bytes from the previous update (if the length is not block aligned). */ + u32ResidualBytes = pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE; + + /* Update the total data length. */ + pstrSHA256->u32TotalLength += u16DataLength; + + if(u32ResidualBytes != 0) + { + if((u32ResidualBytes + u16DataLength) >= SHA_BLOCK_SIZE) + { + u32Offset = SHA_BLOCK_SIZE - u32ResidualBytes; + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u32Offset); + pu8Data += u32Offset; + u16DataLength -= u32Offset; + + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + u32CurrentBlock = 1; + } + else + { + m2m_memcpy(&pstrSHA256->au8CurrentBlock[u32ResidualBytes], pu8Data, u16DataLength); + u16DataLength = 0; + } + } + + /* Get the number of HASH BLOCKs and the residual bytes. */ + u32NBlocks = u16DataLength / SHA_BLOCK_SIZE; + u32ResidualBytes = u16DataLength % SHA_BLOCK_SIZE; + + if(u32NBlocks != 0) + { + nm_write_block(u32Addr, pu8Data, (uint16)(u32NBlocks * SHA_BLOCK_SIZE)); + pu8Data += (u32NBlocks * SHA_BLOCK_SIZE); + } + + u32NBlocks += u32CurrentBlock; + if(u32NBlocks != 0) + { + uint32 u32RegVal = 0; + + nm_write_reg(SHA256_CTRL, u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL, u32RegVal); + + if(pstrSHA256->u8InitHashFlag) + { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + u32ReadAddr = u32WriteAddr + (u32NBlocks * SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u32NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + + u32RegVal &= ~(0x7 << 8); + u32RegVal |= (2 << 8); + + nm_write_reg(SHA256_CTRL, u32RegVal); + + /* 5. Wait for done_intr */ + while(!u8IsDone) + { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + } + if(u32ResidualBytes != 0) + { + m2m_memcpy(pstrSHA256->au8CurrentBlock, pu8Data, u32ResidualBytes); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + + +sint8 m2m_sha256_hash_finish(tstrM2mSha256Ctxt *pstrSha256Ctxt, uint8 *pu8Sha256Digest) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrSHA256HashCtxt *pstrSHA256 = (tstrSHA256HashCtxt*)pstrSha256Ctxt; + if(pstrSHA256 != NULL) + { + uint32 u32ReadAddr; + uint32 u32WriteAddr = SHARED_MEM_BASE; + uint32 u32Addr = u32WriteAddr; + uint16 u16Offset; + uint16 u16PaddingLength; + uint16 u16NBlocks = 1; + uint32 u32RegVal = 0; + uint32 u32Idx,u32ByteIdx; + uint32 au32Digest[M2M_SHA256_DIGEST_LEN / 4]; + uint8 u8IsDone = 0; + + nm_write_reg(SHA256_CTRL,u32RegVal); + u32RegVal |= SHA256_CTRL_FORCE_SHA256_QUIT_MASK; + nm_write_reg(SHA256_CTRL,u32RegVal); + + if(pstrSHA256->u8InitHashFlag) + { + pstrSHA256->u8InitHashFlag = 0; + u32RegVal |= SHA256_CTRL_INIT_SHA256_STATE_MASK; + } + + /* Calculate the offset of the last data byte in the current block. */ + u16Offset = (uint16)(pstrSHA256->u32TotalLength % SHA_BLOCK_SIZE); + + /* Add the padding byte 0x80. */ + pstrSHA256->au8CurrentBlock[u16Offset ++] = 0x80; + + /* Calculate the required padding to complete + one Hash Block Size. + */ + u16PaddingLength = SHA_BLOCK_SIZE - u16Offset; + m2m_memset(&pstrSHA256->au8CurrentBlock[u16Offset], 0, u16PaddingLength); + + /* If the padding count is not enough to hold 64-bit representation of + the total input message length, one padding block is required. + */ + if(u16PaddingLength < 8) + { + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + u32Addr += SHA_BLOCK_SIZE; + m2m_memset(pstrSHA256->au8CurrentBlock, 0, SHA_BLOCK_SIZE); + u16NBlocks ++; + } + + /* pack the length at the end of the padding block */ + PUTU32(pstrSHA256->u32TotalLength << 3, pstrSHA256->au8CurrentBlock, (SHA_BLOCK_SIZE - 4)); + + u32ReadAddr = u32WriteAddr + (u16NBlocks * SHA_BLOCK_SIZE); + nm_write_block(u32Addr, pstrSHA256->au8CurrentBlock, SHA_BLOCK_SIZE); + nm_write_reg(SHA256_DATA_LENGTH, (u16NBlocks * SHA_BLOCK_SIZE)); + nm_write_reg(SHA256_START_RD_ADDR, u32WriteAddr); + nm_write_reg(SHA256_START_WR_ADDR, u32ReadAddr); + + u32RegVal |= SHA256_CTRL_START_CALC_MASK; + u32RegVal |= SHA256_CTRL_WR_BACK_HASH_VALUE_MASK; + u32RegVal &= ~(0x7UL << 8); + u32RegVal |= (0x2UL << 8); + + nm_write_reg(SHA256_CTRL,u32RegVal); + + + /* 5. Wait for done_intr */ + while(!u8IsDone) + { + u32RegVal = nm_read_reg(SHA256_DONE_INTR_STS); + u8IsDone = u32RegVal & NBIT0; + } + nm_read_block(u32ReadAddr, (uint8*)au32Digest, 32); + + /* Convert the output words to an array of bytes. + */ + u32ByteIdx = 0; + for(u32Idx = 0; u32Idx < (M2M_SHA256_DIGEST_LEN / 4); u32Idx ++) + { + pu8Sha256Digest[u32ByteIdx ++] = BYTE_3(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_2(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_1(au32Digest[u32Idx]); + pu8Sha256Digest[u32ByteIdx ++] = BYTE_0(au32Digest[u32Idx]); + } + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + + +/*======*======*======*======*======*=======* +* RSA IMPLEMENTATION * +*======*======*======*======*======*========*/ + +static void FlipBuffer(uint8 *pu8InBuffer, uint8 *pu8OutBuffer, uint16 u16BufferSize) +{ + uint16 u16Idx; + for(u16Idx = 0; u16Idx < u16BufferSize; u16Idx ++) + { +#if ENABLE_FLIPPING == 1 + pu8OutBuffer[u16Idx] = pu8InBuffer[u16BufferSize - u16Idx - 1]; +#else + pu8OutBuffer[u16Idx] = pu8InBuffer[u16Idx]; +#endif + } +} + +void BigInt_ModExp +( + uint8 *pu8X, uint16 u16XSize, + uint8 *pu8E, uint16 u16ESize, + uint8 *pu8M, uint16 u16MSize, + uint8 *pu8R, uint16 u16RSize + ) +{ + uint32 u32Reg; + uint8 au8Tmp[780] = {0}; + uint32 u32XAddr = SHARED_MEM_BASE; + uint32 u32MAddr; + uint32 u32EAddr; + uint32 u32RAddr; + uint8 u8EMswBits = 32; + uint32 u32Mprime = 0x7F; + uint16 u16XSizeWords,u16ESizeWords; + uint32 u32Exponent; + + u16XSizeWords = (u16XSize + 3) / 4; + u16ESizeWords = (u16ESize + 3) / 4; + + u32MAddr = u32XAddr + (u16XSizeWords * 4); + u32EAddr = u32MAddr + (u16XSizeWords * 4); + u32RAddr = u32EAddr + (u16ESizeWords * 4); + + /* Reset the core. + */ + u32Reg = 0; + u32Reg |= BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg &= ~BIGINT_MISC_CTRL_CTL_RESET; + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + + nm_write_block(u32RAddr,au8Tmp, u16RSize); + + /* Write Input Operands to Chip Memory. + */ + /*------- X -------*/ + FlipBuffer(pu8X,au8Tmp,u16XSize); + nm_write_block(u32XAddr,au8Tmp,u16XSizeWords * 4); + + /*------- E -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8E, au8Tmp, u16ESize); + nm_write_block(u32EAddr, au8Tmp, u16ESizeWords * 4); + u32Exponent = GET_UINT32(au8Tmp, (u16ESizeWords * 4) - 4); + while((u32Exponent & NBIT31)== 0) + { + u32Exponent <<= 1; + u8EMswBits --; + } + + /*------- M -------*/ + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + FlipBuffer(pu8M, au8Tmp, u16XSize); + nm_write_block(u32MAddr, au8Tmp, u16XSizeWords * 4); + + /* Program the addresses of the input operands. + */ + nm_write_reg(BIGINT_ADDR_X, u32XAddr); + nm_write_reg(BIGINT_ADDR_E, u32EAddr); + nm_write_reg(BIGINT_ADDR_M, u32MAddr); + nm_write_reg(BIGINT_ADDR_R, u32RAddr); + + /* Mprime. + */ + nm_write_reg(BIGINT_M_PRIME,u32Mprime); + + /* Length. + */ + u32Reg = (u16XSizeWords & 0xFF); + u32Reg += ((u16ESizeWords & 0xFF) << 8); + u32Reg += (u8EMswBits << 16); + nm_write_reg(BIGINT_LENGTH,u32Reg); + + /* CTRL Register. + */ + u32Reg = nm_read_reg(BIGINT_MISC_CTRL); + u32Reg ^= BIGINT_MISC_CTRL_CTL_START; + u32Reg |= BIGINT_MISC_CTRL_CTL_FORCE_BARRETT; + //u32Reg |= BIGINT_MISC_CTRL_CTL_M_PRIME_VALID; +#if ENABLE_FLIPPING == 0 + u32Reg |= BIGINT_MISC_CTRL_CTL_MSW_FIRST; +#endif + nm_write_reg(BIGINT_MISC_CTRL,u32Reg); + + /* Wait for computation to complete. */ + while(1) + { + u32Reg = nm_read_reg(BIGINT_IRQ_STS); + if(u32Reg & BIGINT_IRQ_STS_DONE) + { + break; + } + } + nm_write_reg(BIGINT_IRQ_STS,0); + m2m_memset(au8Tmp, 0, sizeof(au8Tmp)); + nm_read_block(u32RAddr, au8Tmp, u16RSize); + FlipBuffer(au8Tmp, pu8R, u16RSize); +} + + + +#define MD5_DIGEST_SIZE (16) +#define SHA1_DIGEST_SIZE (20) + +static const uint8 au8TEncodingMD5[] = +{ + 0x30, 0x20, 0x30, 0x0C, 0x06, 0x08, 0x2A, 0x86, + 0x48, 0x86, 0xF7, 0x0D, 0x02, 0x05, 0x05, 0x00, + 0x04 +}; +/*!< Fixed part of the Encoding T for the MD5 hash algorithm. +*/ + + +static const uint8 au8TEncodingSHA1[] = +{ + 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x0E, + 0x03, 0x02, 0x1A, 0x05, 0x00, 0x04 +}; +/*!< Fixed part of the Encoding T for the SHA-1 hash algorithm. +*/ + + +static const uint8 au8TEncodingSHA2[] = +{ + 0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, + 0x00, 0x04 +}; +/*!< Fixed part of the Encoding T for the SHA-2 hash algorithm. +*/ + + +sint8 m2m_rsa_sign_verify(uint8 *pu8N, uint16 u16NSize, uint8 *pu8E, uint16 u16ESize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if((pu8N != NULL) && (pu8E != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) + { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if(u16HashLength == MD5_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } + else if(u16HashLength == SHA1_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } + else + { + pu8T = (uint8*)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if(u16NSize >= (u16TLength + 11)) + { + uint32 u32PSLength,u32Idx = 0; + + /* + RSA verification + */ + BigInt_ModExp(pu8RsaSignature, u16NSize, pu8E, u16ESize, pu8N, u16NSize, au8EM, u16NSize); + + u32PSLength = u16NSize - u16TLength - 3; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + if((au8EM[0] == 0x00) && (au8EM[1] == 0x01)) + { + for(u32Idx = 2; au8EM[u32Idx] == 0xFF; u32Idx ++); + if(u32Idx == (u32PSLength + 2)) + { + if(au8EM[u32Idx ++] == 0x00) + { + if(!m2m_memcmp(&au8EM[u32Idx], pu8T, u16TEncodingLength)) + { + u32Idx += u16TEncodingLength; + if(au8EM[u32Idx ++] == u16HashLength) + s8Ret = m2m_memcmp(&au8EM[u32Idx], pu8SignedMsgHash, u16HashLength); + } + } + } + } + } + } + return s8Ret; +} + + +sint8 m2m_rsa_sign_gen(uint8 *pu8N, uint16 u16NSize, uint8 *pu8d, uint16 u16dSize, uint8 *pu8SignedMsgHash, + uint16 u16HashLength, uint8 *pu8RsaSignature) +{ + sint8 s8Ret = M2M_RSA_SIGN_FAIL; + + if((pu8N != NULL) && (pu8d != NULL) && (pu8RsaSignature != NULL) && (pu8SignedMsgHash != NULL)) + { + uint16 u16TLength, u16TEncodingLength; + uint8 *pu8T; + uint8 au8EM[512]; + + /* Selection of correct T Encoding based on the hash size. + */ + if(u16HashLength == MD5_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingMD5; + u16TEncodingLength = sizeof(au8TEncodingMD5); + } + else if(u16HashLength == SHA1_DIGEST_SIZE) + { + pu8T = (uint8*)au8TEncodingSHA1; + u16TEncodingLength = sizeof(au8TEncodingSHA1); + } + else + { + pu8T = (uint8*)au8TEncodingSHA2; + u16TEncodingLength = sizeof(au8TEncodingSHA2); + } + u16TLength = u16TEncodingLength + 1 + u16HashLength; + + /* If emLen < tLen + 11. + */ + if(u16NSize >= (u16TLength + 11)) + { + uint16 u16PSLength = 0; + uint16 u16Offset = 0; + + /* + The calculated EM must match the following pattern. + *======*======*======*======*======* + * 0x00 || 0x01 || PS || 0x00 || T * + *======*======*======*======*======* + Where PS is all 0xFF + T is defined based on the hash algorithm. + */ + au8EM[u16Offset ++] = 0; + au8EM[u16Offset ++] = 1; + u16PSLength = u16NSize - u16TLength - 3; + m2m_memset(&au8EM[u16Offset], 0xFF, u16PSLength); + u16Offset += u16PSLength; + au8EM[u16Offset ++] = 0; + m2m_memcpy(&au8EM[u16Offset], pu8T, u16TEncodingLength); + u16Offset += u16TEncodingLength; + au8EM[u16Offset ++] = u16HashLength; + m2m_memcpy(&au8EM[u16Offset], pu8SignedMsgHash, u16HashLength); + + /* + RSA Signature Generation + */ + BigInt_ModExp(au8EM, u16NSize, pu8d, u16dSize, pu8N, u16NSize, pu8RsaSignature, u16NSize); + s8Ret = M2M_RSA_SIGN_OK; + } + } + return s8Ret; +} + +#endif /* CONF_CRYPTO */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_flash.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_flash.c new file mode 100644 index 0000000..e3ff7ea --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_flash.c @@ -0,0 +1,550 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_flash.h" +#include "driver/include/m2m_wifi.h" +#include "driver/source/nmflash.h" +#include "driver/source/m2m_hif.h" +#include "spi_flash/include/spi_flash.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfDataAccessFn gpfAppFn = NULL; +static uint8 gau8ItemIdentifier[20] = {0}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static sint8 transfer_init(void) +{ + sint8 ret = FLASH_RETURN_OK; + + /* Check module was initialized. */ + if (gu8Init == 0) + ret = FLASH_ERR_UNINIT; + return ret; +} +static sint8 init_access(void) +{ + sint8 ret = FLASH_RETURN_OK; + + gu8Reset = 0; + if (m2m_wifi_reinit_hold() != M2M_SUCCESS) + ret = FLASH_ERR_WINC_ACCESS; + + return ret; +} +static sint8 commit_access(tstrFlashAccess *pstrFlashAccess) +{ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_ERR_FAIL; + tstrFlashAccessPersistent *pstrPersistentInfo = &pstrFlashAccess->strPersistentInfo; + + /* + * To begin with, flash is unchanged. Later, when first flash erase/write occurs, this flag + * will be cleared. + */ + pstrPersistentInfo->u8ModeFlags |= FLASH_MODE_FLAGS_UNCHANGED; + if (pstrPersistentInfo->u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + { + uint8 target = 0; + if (image_get_target(&target) != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + if (target > 0) + pstrPersistentInfo->u8ModeFlags |= FLASH_MODE_FLAGS_CS_SWITCH_TARGET; + } + + status = spi_flash_read((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + if (status == M2M_SUCCESS) + { + if ((pstrPersistentInfo->u32Signature != FLASH_SIGNATURE) || (pstrPersistentInfo->enuTransferStatus != FLASH_STATUS_EMPTY)) + status = spi_flash_erase(HOST_CONTROL_FLASH_OFFSET, HOST_CONTROL_FLASH_SZ); + } + if (status == M2M_SUCCESS) + { + pstrPersistentInfo->u32Signature = FLASH_SIGNATURE; + pstrPersistentInfo->enuTransferStatus = FLASH_STATUS_NOT_ACTIVE; + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + if (status == M2M_SUCCESS) + { + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + if (status == M2M_SUCCESS) + { + pstrPersistentInfo->enuTransferStatus = FLASH_STATUS_ACTIVE; + status = winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + gu16LastAccessId = pstrPersistentInfo->u16AppId; + gu8Success = 0; + gu8Changed = 0; + } + } + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + ret = transfer_run(pstrFlashAccess); +ERR: + return ret; +} +static sint8 register_app_fn(tpfDataAccessFn pfFn) +{ + sint8 ret = FLASH_RETURN_OK; + if (pfFn == NULL) + ret = FLASH_ERR_PARAM; + gpfAppFn = pfFn; + return ret; +} +static sint8 app_data_access(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + tstrDataAccessInitParamsApp init_params_app; + tstrDataAccessParamsApp params_app; + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + init_params_app.u32TotalSize = init_params->u32TotalSize; + if (init_params->u8Flags & FLASH_FN_FLAGS_READ) + init_params_app.enuRW = FLASH_DATA_FN_READ; + else if (init_params->u8Flags & FLASH_FN_FLAGS_WRITE) + init_params_app.enuRW = FLASH_DATA_FN_WRITE; + pvStr = &init_params_app; + } + break; + case FLASH_DATA_FN_DATA: + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + params_app.pu8Data = params->pu8Buf + params->u32DataOffset; + params_app.u32DataSize = params->u32DataSize; + pvStr = ¶ms_app; + } + break; + case FLASH_DATA_FN_COMPLETE: + case FLASH_DATA_FN_TERMINATE: + break; + } + return gpfAppFn(enuCtl, pvStr); +} +sint8 m2m_flash_readimage(uint8 enuImageId, uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize) +{ + sint8 ret = FLASH_RETURN_OK; + + M2M_INFO("FA RdImage %d\n", enuImageId); + ret = transfer_init(); + if (ret < 0) + goto ERR; + ret = register_app_fn(pfDestFn); + if (ret < 0) + goto ERR; + if (u32DestSize < OTA_IMAGE_SIZE) + { + ret = FLASH_ERR_SIZE; + goto ERR; + } + if (enuImageId > FLASH_IMAGE_INACTIVE) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer. */ + tstrFlashAccess strFlashAccess; + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + + strFlashAccess.pfDestinationFn = app_data_access; + switch (enuImageId) + { + case FLASH_IMAGE_ACTIVE: + set_internal_info(&strFlashAccess.pfSourceFn, MEM_ID_WINC_ACTIVE); + break; + case FLASH_IMAGE_INACTIVE: + set_internal_info(&strFlashAccess.pfSourceFn, MEM_ID_WINC_INACTIVE); + break; + } + strFlashAccess.u32Size = OTA_IMAGE_SIZE; + + ret = commit_access(&strFlashAccess); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} + +sint8 m2m_flash_updateimage(uint8 u8Options, uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize) +{ + sint8 ret = FLASH_RETURN_OK; + + M2M_INFO("FA Image %d\n", u8Options); + ret = transfer_init(); + if (ret < 0) + goto ERR; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_UPDATE) + { + uint8 au8ImageStart[4]; + uint8 au8ImageCheck[] = {'N','M','I','S'}; + tstrDataAccessInitParams init_params = {sizeof(au8ImageStart), FLASH_FN_FLAGS_READ}; + sint8 status = M2M_SUCCESS; + + /* Check input parameters. */ + ret = register_app_fn(pfSourceFn); + if (ret < 0) + goto ERR; + if (u32SourceSize != OTA_IMAGE_SIZE) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + status = app_data_access(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + { + tstrDataAccessParams params = {au8ImageStart, sizeof(au8ImageStart), 0, sizeof(au8ImageStart)}; + status = app_data_access(FLASH_DATA_FN_DATA, ¶ms); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + goto ERR; + } + if (m2m_memcmp(au8ImageStart, au8ImageCheck, sizeof(au8ImageStart))) + { + ret = FLASH_ERR_WINC_CONFLICT; + goto ERR; + } + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer. */ + tstrFlashAccess strFlashAccess; + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_UPDATE) + { + strFlashAccess.strPersistentInfo.u8AccessFlags = FLASH_ACCESS_WINC_MASK | FLASH_ACCESS_OPTION_ERASE_FIRST; + + strFlashAccess.pfSourceFn = app_data_access; + set_internal_info(&strFlashAccess.pfDestinationFn, MEM_ID_WINC_INACTIVE); + strFlashAccess.u32Size = OTA_IMAGE_SIZE; + } + else + strFlashAccess.u32Size = 0; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_VALIDATE) + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE; + if (u8Options & FLASH_UPDATEIMAGE_OPTION_SWITCH) + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS_SWITCH; + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_CS; + + ret = commit_access(&strFlashAccess); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} + +static sint8 m2m_flash_rootcert_access(tenuFlashAccessItemMode enuMode, uint8 u8ModeOptions, uint8 u8AccessOptions, uint16 u16Id, tpfDataAccessFn pfFn, uint32 u32Size) +{ + sint8 ret = FLASH_RETURN_OK; + tstrRootCertEntryHeader strRootCertEntry; + uint16 u16EntrySz = 0; + + M2M_INFO("FA Rootcert %d\n", enuMode); + ret = transfer_init(); + if (ret < 0) + goto ERR; + + switch (enuMode) + { + case FLASH_ITEM_ADD: + { + sint8 status = M2M_SUCCESS; + tstrDataAccessInitParams init_params = {sizeof(strRootCertEntry), FLASH_FN_FLAGS_READ}; + + // Read the entry header + if (u32Size < sizeof(strRootCertEntry)) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + { + tstrDataAccessParams params = {(uint8*)&strRootCertEntry, sizeof(strRootCertEntry), 0, sizeof(strRootCertEntry)}; + status = pfFn(FLASH_DATA_FN_DATA, ¶ms); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + goto ERR; + } + // Check source size matches size calculated from entry header. + status = rootcert_get_size(&strRootCertEntry, &u16EntrySz); + if ((status != M2M_SUCCESS) || (u32Size != u16EntrySz)) + { + ret = FLASH_ERR_PARAM; + goto ERR; + } + } + break; + case FLASH_ITEM_READ: + case FLASH_ITEM_REMOVE: + m2m_memcpy(strRootCertEntry.au8SHA1NameHash, gau8ItemIdentifier, sizeof(gau8ItemIdentifier)); + m2m_memset(gau8ItemIdentifier, 0, sizeof(gau8ItemIdentifier)); + break; + case FLASH_ITEM_READIDX: + // Hack strRootCertEntry to carry the index from u8ModeOptions. + *(uint32*)&strRootCertEntry = u8ModeOptions; + break; + default: + /* No other item modes supported. */ + ret = FLASH_ERR_PARAM; + goto ERR; + break; + } + + ret = init_access(); + if (ret == FLASH_RETURN_OK) + { + /* Now we can access the items in flash. */ + uint8 *pu8Buff = malloc(M2M_TLS_ROOTCER_FLASH_SZ); + uint32 u32Offset = 0; + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto ERR; + } + ret = rootcert_access(enuMode, &strRootCertEntry, &u16EntrySz, pu8Buff, &u32Offset); + if (ret == FLASH_RETURN_OK) + { + /* Set parameters for whole transfer, according to enuMode. */ + sint8 status = M2M_SUCCESS; + tstrDataAccessInitParams init_params = {u16EntrySz, 0}; + tstrDataAccessParams data_params = {pu8Buff + u32Offset, u16EntrySz, 0, u16EntrySz}; + tstrFlashAccess strFlashAccess; + + m2m_memset((uint8*)&strFlashAccess, 0, sizeof(tstrFlashAccess)); + strFlashAccess.strPersistentInfo.u16AppId = u16Id; + strFlashAccess.strPersistentInfo.u8AccessFlags = u8AccessOptions; + + switch (enuMode) + { + case FLASH_ITEM_ADD: + init_params.u8Flags = FLASH_FN_FLAGS_READ; + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + status = pfFn(FLASH_DATA_FN_DATA, &data_params); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + pfFn(FLASH_DATA_FN_TERMINATE, NULL); + break; + } + u32Offset += u16EntrySz; + // intentional fallthrough. + case FLASH_ITEM_REMOVE: + status = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if (status == M2M_SUCCESS) + status = winc_flash_write_verify(pu8Buff, M2M_BACKUP_FLASH_OFFSET, u32Offset); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + set_internal_info(NULL, M2M_TLS_ROOTCER_FLASH_OFFSET); + strFlashAccess.strPersistentInfo.u8ModeFlags |= FLASH_MODE_FLAGS_DATA_IN_BACKUP; + break; + case FLASH_ITEM_READ: + case FLASH_ITEM_READIDX: + // Check source size is sufficient for reading entry. + if (u32Size < u16EntrySz) + { + ret = FLASH_ERR_SIZE; + break; + } + init_params.u8Flags = FLASH_FN_FLAGS_WRITE; + status = pfFn(FLASH_DATA_FN_INITIALIZE, &init_params); + if (status == M2M_SUCCESS) + status = pfFn(FLASH_DATA_FN_DATA, &data_params); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_LOCAL_ACCESS; + pfFn(FLASH_DATA_FN_TERMINATE, NULL); + break; + } + break; + } + if (ret == 0) + { + ret = commit_access(&strFlashAccess); + if (enuMode != FLASH_ITEM_REMOVE) + pfFn(FLASH_DATA_FN_COMPLETE, NULL); + } + } + free(pu8Buff); + } +ERR: + M2M_INFO("FAState:%d\n", ret); + return ret; +} +sint8 m2m_flash_rootcert_add(uint16 u16Id, tpfDataAccessFn pfSourceFn, uint32 u32SourceSize) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfSourceFn); + if (ret == FLASH_RETURN_OK) + ret = m2m_flash_rootcert_access(FLASH_ITEM_ADD, 0, FLASH_ACCESS_OPTION_COMPARE_AFTER, u16Id, app_data_access, u32SourceSize); + return ret; +} +sint8 m2m_flash_rootcert_remove(uint16 u16Id, uint8 *pu8Identifier, uint32 u32IdentifierSz) +{ + sint8 ret = FLASH_ERR_PARAM; + + if ((pu8Identifier != NULL) && (u32IdentifierSz == 20)) + { + m2m_memcpy(gau8ItemIdentifier, pu8Identifier, u32IdentifierSz); + ret = m2m_flash_rootcert_access(FLASH_ITEM_REMOVE, 0, FLASH_ACCESS_OPTION_COMPARE_AFTER, u16Id, NULL, 0); + } + return ret; +} +sint8 m2m_flash_rootcert_read(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 *pu8Identifier, uint32 u32IdentifierSz) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfDestFn); + if (ret == FLASH_RETURN_OK) + { + ret = FLASH_ERR_PARAM; + if ((pu8Identifier != NULL) && (u32IdentifierSz == 20)) + { + m2m_memcpy(gau8ItemIdentifier, pu8Identifier, u32IdentifierSz); + ret = m2m_flash_rootcert_access(FLASH_ITEM_READ, 0, 0, u16Id, app_data_access, u32DestSize); + } + } + return ret; +} +sint8 m2m_flash_rootcert_readidx(uint16 u16Id, tpfDataAccessFn pfDestFn, uint32 u32DestSize, uint8 u8Index) +{ + sint8 ret = FLASH_RETURN_OK; + + ret = register_app_fn(pfDestFn); + if (ret == FLASH_RETURN_OK) + ret = m2m_flash_rootcert_access(FLASH_ITEM_READIDX, u8Index, 0, u16Id, app_data_access, u32DestSize); + return ret; +} + +void m2m_flash_get_state(tstrFlashState *pstrState) +{ + if (gu8Reset == 0) + { + sint8 status = M2M_ERR_FAIL; + tstrFlashAccessPersistent strSavedFlashAccess; + + status = spi_flash_read((uint8*)&strSavedFlashAccess, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + if ((status == M2M_SUCCESS) && (strSavedFlashAccess.u32Signature == FLASH_SIGNATURE)) + { + switch (strSavedFlashAccess.enuTransferStatus) + { + case FLASH_STATUS_ACTIVE: + if (strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + { + // Check to see if switch happened before we were interrupted. If so we had actually completed. + uint8 target; + if (image_get_target(&target) == M2M_SUCCESS) + { + if ((target == 0) && (strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH_TARGET)) + gu8Success = 1; + if ((target > 0) && !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH_TARGET)) + gu8Success = 1; + } + } + gu16LastAccessId = strSavedFlashAccess.u16AppId; + gu8Changed = !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED); + if (gu8Success == 1) + { + strSavedFlashAccess.enuTransferStatus = FLASH_STATUS_DONE; + winc_flash_write_verify((uint8*)&strSavedFlashAccess, HOST_CONTROL_FLASH_OFFSET, FLASH_SIG_STA_SZ); + } + break; + case FLASH_STATUS_DONE: + gu16LastAccessId = strSavedFlashAccess.u16AppId; + gu8Changed = !(strSavedFlashAccess.u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED); + gu8Success = 1; + break; + default: + break; + } + } + } + m2m_memset((uint8*)pstrState, 0, sizeof(tstrFlashState)); + if (gu16LastAccessId) + { + pstrState->u16LastAccessId = gu16LastAccessId; + pstrState->u8Success = gu8Success; + pstrState->u8Changed = gu8Changed; + } + pstrState->u8Init = gu8Init; + pstrState->u8Reset = gu8Reset; +} +sint8 m2m_flash_init(void) +{ + if (gu8Reset == 0) + { + // WINC backup recovery may be needed. + if (recover_backup() == FLASH_RETURN_OK) + { + gu8Init = 1; + gu8Reset = 1; + return M2M_SUCCESS; + } + } + return M2M_ERR_FAIL; +} diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.c new file mode 100644 index 0000000..2c40087 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.c @@ -0,0 +1,878 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "driver/source/nmdrv.h" +#include "bsp/include/nm_bsp.h" +#include "m2m_hif.h" +#include "driver/include/m2m_types.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_periph.h" + +#if (defined NM_EDGE_INTERRUPT)&&(defined NM_LEVEL_INTERRUPT) +#error "only one type of interrupt NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#if !((defined NM_EDGE_INTERRUPT)||(defined NM_LEVEL_INTERRUPT)) +#error "define interrupt type NM_EDGE_INTERRUPT,NM_LEVEL_INTERRUPT" +#endif + +#ifndef CORTUS_APP +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WAKE_VALUE (0x5678) +#define SLEEP_VALUE (0x4321) +#define WAKE_REG (0x1074) + +#define INTERRUPT_CORTUS_0_3000D0 (0x10a8) +#define INTERRUPT_CORTUS_1_3000D0 (0x10ac) +#define INTERRUPT_CORTUS_2_3000D0 (0x10b0) +#define INTERRUPT_CORTUS_3_3000D0 (0x10b4) + + +static volatile uint8 gu8ChipMode = 0; +static volatile uint8 gu8ChipSleep = 0; +static volatile uint8 gu8HifSizeDone = 0; +static volatile uint8 gu8Interrupt = 0; +static volatile uint8 gu8Yield = 0; + +/* + Special codes for managing HIF restriction to OTA rollback/switch only +*/ +#define HIF_OTA_RB_ONLY 0xFFFF +#define HIFCODE_OTA_RB ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_ROLLBACK) +#define HIFCODE_OTA_SW ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_SWITCH_FIRMWARE) +#define HIFCODE_SSL_WRITECERT ((M2M_REQ_GROUP_SSL << 8) | M2M_SSL_REQ_WRITE_OWN_CERTS) +#define HIFCODE_WIFI_PASSIVESCAN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_PASSIVE_SCAN) +/* + List of new HIF messages (since last HIF major increase) + Each entry is formed of ((GroupId << 8) | OpCode) + Additionally, entry 0 used to indicate OTA RB/SW only. +*/ +#define NEW_HIF_LIST HIF_OTA_RB_ONLY, HIFCODE_SSL_WRITECERT, HIFCODE_WIFI_PASSIVESCAN +/* + Array of HIF messages which are not supported by Firmware. + During hif_init() this array is rebased using an offset determined by Firmware HIF level. +*/ +static uint16 gau16HifBlacklist[] = {NEW_HIF_LIST}; +#define HIF_BLACKLIST_SZ (sizeof(gau16HifBlacklist)/sizeof(gau16HifBlacklist[0])) +static uint8 gu8HifBlOffset = 0; + +tpfHifCallBack pfWifiCb = NULL; /*!< pointer to Wi-Fi call back function */ +tpfHifCallBack pfIpCb = NULL; /*!< pointer to Socket call back function */ +tpfHifCallBack pfOtaCb = NULL; /*!< pointer to OTA call back function */ +tpfHifCallBack pfSigmaCb = NULL; +tpfHifCallBack pfHifCb = NULL; +tpfHifCallBack pfSSLCb = NULL; + +static void isr(void) +{ + gu8Interrupt++; +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(0); +#endif +} + +static sint8 hif_set_rx_done(void) +{ + uint32 reg; + sint8 ret = M2M_SUCCESS; +#ifdef NM_EDGE_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif + + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_0_3000D0,1); + if(ret != M2M_SUCCESS)goto ERR1; + } else { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + //reg &= ~(1<<0); + + /* Set RX Done */ + reg |= (1<<1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +#ifdef NM_LEVEL_INTERRUPT + nm_bsp_interrupt_ctrl(1); +#endif +ERR1: + return ret; + +} +/** +* @fn static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @author +* @date +* @version 1.0 +*/ +static void m2m_hif_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + + +} +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief To Wakeup the chip. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + if(gu8ChipSleep == 0) + { + if((gu8ChipMode == M2M_PS_DEEP_AUTOMATIC)||(gu8ChipMode == M2M_PS_MANUAL)) + { + ret = nm_clkless_wake(); + if(ret != M2M_SUCCESS)goto ERR1; + ret = nm_write_reg(WAKE_REG, WAKE_VALUE); + if(ret != M2M_SUCCESS)goto ERR1; + } + else + { + } + } + gu8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8 u8Pstype) +{ + gu8ChipMode = u8Pstype; +} +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8 hif_get_sleep_mode(void) +{ + return gu8ChipMode; +} +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief To make the chip sleep. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_chip_sleep(void) +{ + + sint8 ret = M2M_SUCCESS; + + if(gu8ChipSleep >= 1) + { + gu8ChipSleep--; + } + + if(gu8ChipSleep == 0) + { + if((gu8ChipMode == M2M_PS_DEEP_AUTOMATIC)||(gu8ChipMode == M2M_PS_MANUAL)) + { + uint32 reg = 0; + ret = nm_write_reg(WAKE_REG, SLEEP_VALUE); + if(ret != M2M_SUCCESS)goto ERR1; + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(0x1, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg&0x2) + { + reg &=~(1 << 1); + ret = nm_write_reg(0x1, reg); + } + } + else + { + } + } +ERR1: + return ret; +} +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_init(void * arg) +{ + pfWifiCb = NULL; + pfIpCb = NULL; + + gu8ChipSleep = 0; + gu8ChipMode = M2M_NO_PS; + + gu8Interrupt = 0; + nm_bsp_register_isr(isr); + + gu8HifBlOffset = 0; + hif_register_cb(M2M_REQ_GROUP_HIF,m2m_hif_cb); + + return M2M_SUCCESS; +} +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +sint8 hif_deinit(void * arg) +{ + sint8 ret = M2M_SUCCESS; +#if 0 + uint32 reg = 0, cnt=0; + while (reg != M2M_DISABLE_PS) + { + nm_bsp_sleep(1); + reg = nm_read_reg(STATE_REG); + if(++cnt > 1000) + { + M2M_DBG("failed to stop power save\n"); + break; + } + } +#endif + ret = hif_chip_wake(); + + gu8ChipMode = 0; + gu8ChipSleep = 0; + gu8HifSizeDone = 0; + gu8Interrupt = 0; + + pfWifiCb = NULL; + pfIpCb = NULL; + pfOtaCb = NULL; + pfHifCb = NULL; + + return ret; +} +/** +* @fn sint8 hif_check_compatibility(uint16 u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +sint8 hif_check_compatibility(uint16 u16HifInfo) +{ + sint8 ret = M2M_ERR_FW_VER_MISMATCH; + if((M2M_GET_HIF_BLOCK(u16HifInfo) == M2M_HIF_BLOCK_VALUE) && (M2M_GET_HIF_MAJOR(u16HifInfo) == M2M_HIF_MAJOR_VALUE)) + { + ret = M2M_SUCCESS; + } + return ret; +} +/** +* @fn sint8 hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +sint8 hif_enable_access(void) +{ + sint8 ret = M2M_SUCCESS; + uint16 fw_hif_info = 0; + + ret = nm_get_hif_info(&fw_hif_info, NULL); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(fw_hif_info); + if(ret == M2M_SUCCESS) + { + switch(M2M_GET_HIF_MINOR(fw_hif_info)) + { + case 0: + gu8HifBlOffset = 1; + break; + case 1: + gu8HifBlOffset = 2; + break; + case 2: + gu8HifBlOffset = 2; + break; + case 3: + gu8HifBlOffset = 3; + break; + // Additional case to be added each time hif minor increments. + // All additional cases to be removed in the event of a hif major increment. + // Default catches all cases in which hif minor is greater in Firmware than in Driver. + default: + gu8HifBlOffset = HIF_BLACKLIST_SZ; + break; + } + } + else + { + gu8HifBlOffset = 0; + M2M_ERR("HIF access limited to OTA Switch/Rollback only\n"); + } + } + return ret; +} +/** +* @fn sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode) +{ + uint8 u8BlId; + uint16 u16HifCode = ((uint16)u8Gid<<8) | u8OpCode; + if((u16HifCode == HIFCODE_OTA_RB) || (u16HifCode == HIFCODE_OTA_SW)) + { + return M2M_SUCCESS; + } + if(gu8HifBlOffset == 0) + { + M2M_ERR("HIF OTA rb/sw only\n"); + return M2M_ERR_SEND; + } + for(u8BlId = gu8HifBlOffset; u8BlId < HIF_BLACKLIST_SZ; u8BlId++) + { + if(u16HifCode == gau16HifBlacklist[u8BlId]) + { + M2M_ERR("HIF message unsupported\n"); + return M2M_ERR_SEND; + } + } + return M2M_SUCCESS; +} +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +{ + sint8 ret = M2M_ERR_SEND; + volatile tstrHifHdr strHif; + + strHif.u8Opcode = u8Opcode&(~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + if(pu8DataBuf != NULL) + { + strHif.u16Length += u16DataOffset + u16DataSize; + } + else + { + strHif.u16Length += u16CtrlBufSize; + } + + ret = hif_check_code(strHif.u8Gid, strHif.u8Opcode); + if(ret != M2M_SUCCESS) + { + goto ERR1; + } + + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + volatile uint32 reg, dma_addr = 0; + volatile uint16 cnt = 0; + + reg = 0UL; + reg |= (uint32)u8Gid; + reg |= ((uint32)u8Opcode<<8); + reg |= ((uint32)strHif.u16Length<<16); + ret = nm_write_reg(NMI_STATE_REG,reg); + if(M2M_SUCCESS != ret) goto ERR1; + + reg = 0; + reg |= (1<<1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + + if (ISNMC3400(nmi_get_chipid())) { + + ret = nm_write_reg(INTERRUPT_CORTUS_1_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + + dma_addr = 0; + + //nm_bsp_interrupt_ctrl(0); + + for(cnt = 0; cnt < 1000*5; cnt ++) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2,(uint32 *)®); + if(ret != M2M_SUCCESS) + break; + + if (!(reg & 0x2)) + { + ret = nm_read_reg_with_ret(0x150400,(uint32 *)&dma_addr); + if(ret != M2M_SUCCESS) { + /*in case of read error clear the dma address and return error*/ + dma_addr = 0; + } + /*in case of success break */ + break; + } + //If we are struggling to get a response, start waiting longer + if (cnt>=1000) + nm_bsp_sleep(5); + } + //nm_bsp_interrupt_ctrl(1); + + if (dma_addr != 0) + { + volatile uint32 u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length); + M2M_DBG("Writing into %lx %ld\n", dma_addr, strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8*)&strHif, M2M_HIF_HDR_OFFSET); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if(pu8CtrlBuf != NULL) + { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + u32CurrAddr += (u16DataOffset - u16CtrlBufSize); + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if(M2M_SUCCESS != ret) + goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + + /* MERGEBUG: TODO: Following line of code is to generate the interrupt which + is not needed for 3400, need to check if there are any side effects of keeping it + */ + reg |= (1 << 1); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if(M2M_SUCCESS != ret) + goto ERR1; + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_2_3000D0, 1); + if(M2M_SUCCESS != ret) + goto ERR1; + } + } + else + { + M2M_DBG("Failed to alloc rx size\n"); + ret = M2M_ERR_MEM_ALLOC; + goto ERR1; + } + + } + else + { + M2M_ERR("(HIF)Fail to wakup the chip\n"); + goto ERR1; + } + ret = hif_chip_sleep(); + +ERR1: + return ret; +} +/** +* @fn hif_isr +* @brief Host interface interrupt service routine +* @author M. Abdelmawla +* @date 15 July 2012 +* @return 1 in case of interrupt received else 0 will be returned +* @version 1.0 +*/ +static sint8 hif_isr(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg; + volatile tstrHifHdr strHif; + + + //if(ret == M2M_SUCCESS) + { + ret = nm_read_reg_with_ret(0x1070, ®); + if(M2M_SUCCESS == ret) + { + if(reg & 0x1) /* New interrupt has been received */ + { + uint16 size; + + nm_bsp_interrupt_ctrl(0); + /*Clearing RX interrupt*/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + reg &= ~(1<<0); + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0,reg); + if(ret != M2M_SUCCESS)goto ERR1; + /* read the rx size */ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_0 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + gu8HifSizeDone = 0; + size = (uint16)((reg >> 2) & 0xfff); + if (size > 0) { + uint32 address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + ret = nm_read_block(address, (uint8*)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) address bus fail\n"); + nm_bsp_interrupt_ctrl(1); + goto ERR1; + } + if(strHif.u16Length != size) + { + if((size - strHif.u16Length) > 4) + { + M2M_ERR("(hif) Corrupted packet Size = %u \n", + size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode); + nm_bsp_interrupt_ctrl(1); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + + if(M2M_REQ_GROUP_WIFI == strHif.u8Gid) + { + if(pfWifiCb) + pfWifiCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + + } + else if(M2M_REQ_GROUP_IP == strHif.u8Gid) + { + if(pfIpCb) + pfIpCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_OTA == strHif.u8Gid) + { + if(pfOtaCb) + pfOtaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid) + { + if(pfSigmaCb) + pfSigmaCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else if(M2M_REQ_GROUP_SSL == strHif.u8Gid) + { + if(pfSSLCb) + pfSSLCb(strHif.u8Opcode,strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + } + else + { + M2M_ERR("(hif) invalid group ID\n"); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + #ifndef ENABLE_UNO_BOARD + if(!gu8HifSizeDone) + { + M2M_ERR("(hif) host app didn't set RX Done\n"); + ret = hif_set_rx_done(); + } + #endif + } + else + { + ret = M2M_ERR_RCV; + M2M_ERR("(hif) Wrong Size\n"); + goto ERR1; + } + } + else + { +#ifndef WIN32 + M2M_ERR("(hif) False interrupt %lx",reg); +#endif + } + } + else + { + M2M_ERR("(hif) Fail to Read interrupt reg\n"); + } + } + +ERR1: + return ret; +} + +/** +* @fn hif_handle_isr(void) +* @brief Handle interrupt received from NMC1500 firmware. +* @return The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_yield(void) +{ + gu8Yield = 1; +} + +sint8 hif_handle_isr(void) +{ + sint8 ret = M2M_SUCCESS; + + if (gu8Interrupt) { + ret = hif_chip_wake(); +// Sleep(10); + if(ret == M2M_SUCCESS) + { + gu8Yield = 0; + while (gu8Interrupt && !gu8Yield) { + /*must be at that place because of the race of interrupt increment and that decrement*/ + /*when the interrupt enabled*/ + gu8Interrupt--; + while(1) + { + ret = hif_isr(); + if(ret == M2M_SUCCESS/* || gu8Interrupt == 0*/) { //JFM: WTF un while(1)!!!!! + /*we will try forever until we get that interrupt*/ + /*Fail return errors here due to bus errors (reading expected values)*/ + break; + } else { + M2M_ERR("(HIF) Fail to handle interrupt %d try Again..\n",ret); + } + } + } + ret = hif_chip_sleep(); + } + else { + M2M_ERR("(hif) FAIL to wakeup the chip\n"); + } + } + return ret; +} +/* +* @fn hif_receive +* @brief Host interface interrupt service routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone) +{ + uint32 address, reg; + uint16 size; + sint8 ret = M2M_SUCCESS; + + if(u32Addr == 0 || pu8Buf == NULL || u16Sz == 0) + { + if(isDone) + { + gu8HifSizeDone = 1; + + /* set RX done */ + ret = hif_set_rx_done(); + + if((u32Addr == 0) && (pu8Buf == NULL) && (u16Sz == 0)) + return M2M_SUCCESS; + } + + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\n"); + goto ERR1; + } + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0,®); + if(ret != M2M_SUCCESS)goto ERR1; + + + size = (uint16)((reg >> 2) & 0xfff); + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1,&address); + if(ret != M2M_SUCCESS)goto ERR1; + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if(ret != M2M_SUCCESS)goto ERR1; + + if(u16Sz > size) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the recived buffer size <%d><%d>\n",u16Sz, size); + goto ERR1; + } + if((u32Addr < address)||((u32Addr + u16Sz)>(address+size))) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the recived buffer address and length\n"); + goto ERR1; + } + + /* check if this is the last packet */ + if(isDone || (((address+size) - (u32Addr+u16Sz)) == 0) || + ((4 - ((u32Addr+u16Sz) & 3)) == ((address+size) - (u32Addr+u16Sz)))) /* Length in the RCV CTRL 0 register is rounded off to 4 by the firmware, + but length inside the HIF header is not, Hence consider done if number + of rounding bytes equal to length left to read */ + { + gu8HifSizeDone = 1; + + /* set RX done */ + ret = hif_set_rx_done(); + } + + + +ERR1: + return ret; +} + +/** +* @fn hif_register_cb +* @brief To set Callback function for every component +* @param [in] u8Grp +* Group to which the Callback function should be set. +* @param [in] fn +* function to be set +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +sint8 hif_register_cb(uint8 u8Grp,tpfHifCallBack fn) +{ + sint8 ret = M2M_SUCCESS; + switch(u8Grp) + { + case M2M_REQ_GROUP_IP: + pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + pfHifCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + pfSSLCb = fn; + break; + default: + M2M_ERR("GRp ? %d\n",u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.h b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.h new file mode 100644 index 0000000..5095005 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_hif.h @@ -0,0 +1,270 @@ +/** + * + * \file + * + * \brief This module contains M2M host interface APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "common/include/nm_common.h" +/*!< Include depends on UNO Board is used or not*/ +#ifdef ENABLE_UNO_BOARD +#include "m2m_uno_hif.h" +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. +*/ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + + +/** +* @struct tstrHifHdr +* @brief Structure to hold HIF header +*/ +typedef struct +{ + uint8 u8Gid; /*!< Group ID */ + uint8 u8Opcode; /*!< OP code */ + uint16 u16Length; /*!< Payload length */ +}tstrHifHdr; + +#ifdef __cplusplus + extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr); +/** +* @fn NMI_API sint8 hif_init(void * arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_init(void * arg); +/** +* @fn NMI_API sint8 hif_deinit(void * arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_deinit(void * arg); +/** +* @fn sint8 hif_check_compatibility(uint16 u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +sint8 hif_check_compatibility(uint16 u16HifInfo); +/** +* @fn sint8 hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +sint8 hif_enable_access(void); +/** +* @fn sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +sint8 hif_check_code(uint8 u8Gid, uint8 u8OpCode); +/** +* @fn NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_send(uint8 u8Gid,uint8 u8Opcode,uint8 *pu8CtrlBuf,uint16 u16CtrlBufSize, + uint8 *pu8DataBuf,uint16 u16DataSize, uint16 u16DataOffset); +/** +* @fn hif_receive +* @brief Host interface interrupt serviece routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_receive(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz, uint8 isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_register_cb(uint8 u8Grp,tpfHifCallBack fn); +/** +* @fn NMI_API sint8 hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 hif_chip_sleep(void); +/** +* @fn NMI_API sint8 hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +NMI_API sint8 hif_chip_wake(void); +/*! +@fn \ + NMI_API void hif_set_sleep_mode(uint8 u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API void hif_set_sleep_mode(uint8 u8Pstype); +/*! +@fn \ + NMI_API uint8 hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +NMI_API uint8 hif_get_sleep_mode(void); + +#ifdef CORTUS_APP +/** +* @fn hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize) +* @brief + Response handler for HIF layer. + +* @param [in] pu8Buffer + Pointer to the buffer. + +* @param [in] u16BufferSize + Buffer size. + +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_Resp_handler(uint8 *pu8Buffer, uint16 u16BufferSize); +#endif + +/** +* @fn hif_yield(void) +* @brief + Yields control from interrupt event handler. +*/ +NMI_API void hif_yield(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from NMC1500 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ota.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ota.c new file mode 100644 index 0000000..d9f0b0a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ota.c @@ -0,0 +1,357 @@ +/** + * + * \file + * + * \brief WINC3400 IoT OTA Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" +#include "driver/include/m2m_ota.h" +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; +static tpfOtaNotifCb gpfOtaNotifCb = NULL; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** +* @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +* @author +* @date +* @version 1.0 +*/ +static void m2m_ota_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 ret = M2M_SUCCESS; + if(u8OpCode == M2M_OTA_RESP_NOTIF_UPDATE_INFO) + { + tstrOtaUpdateInfo strOtaUpdateInfo; + m2m_memset((uint8*)&strOtaUpdateInfo,0,sizeof(tstrOtaUpdateInfo)); + ret = hif_receive(u32Addr,(uint8*)&strOtaUpdateInfo,sizeof(tstrOtaUpdateInfo),0); + if(ret == M2M_SUCCESS) + { + if(gpfOtaNotifCb) + gpfOtaNotifCb(&strOtaUpdateInfo); + } + } + else if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) + { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + m2m_memset((uint8*)&strOtaUpdateStatusResp,0,sizeof(tstrOtaUpdateStatusResp)); + ret = hif_receive(u32Addr, (uint8*) &strOtaUpdateStatusResp,sizeof(tstrOtaUpdateStatusResp), 0); + if(ret == M2M_SUCCESS) + { + if(gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType,strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } + else + { + M2M_ERR("Invaild OTA resp %d ?\n",u8OpCode); + } + +} +/*! +@fn \ + NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb); + +@brief + Initialize the OTA layer. + +@param [in] pfOtaUpdateCb + OTA Update callback function + +@param [in] pfOtaNotifCb + OTA notify callback function + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb, tpfOtaNotifCb pfOtaNotifCb) +{ + sint8 ret = M2M_SUCCESS; + + if(pfOtaUpdateCb){ + gpfOtaUpdateCb = pfOtaUpdateCb; + }else{ + M2M_ERR("Invaild Ota update cb\n"); + } + if(pfOtaNotifCb){ + gpfOtaNotifCb = pfOtaNotifCb; + }else{ + M2M_ERR("Invaild Ota notify cb\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA,m2m_ota_cb); + + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url); + +@brief + Set the OTA url + +@param [in] u8Url + The url server address + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_set_url(uint8 * u8Url) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16UrlSize = m2m_strlen(u8Url) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_START_UPDATE,u8Url,u16UrlSize,NULL,0,0); + return ret; + +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_check_for_update(void); + +@brief + check for ota update + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_check_for_update(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE,NULL,0,NULL,0,0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period); + +@brief + Schedule OTA update + +@param [in] u32Period + Period in days + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_notif_sched(uint32 u32Period) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_NOTIF_CHECK_FOR_UPDATE,NULL,0,NULL,0,0); + return ret; +} + +/*! +@fn \ + NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl); + +@brief + Request OTA start update using the downloaded url + +@param [in] u8DownloadUrl + The download firmware url, you get it from device info + +@return + The function SHALL return 0 for success and a negative value otherwise. + +*/ +NMI_API sint8 m2m_ota_start_update(uint8 * u8DownloadUrl) +{ + sint8 ret = M2M_SUCCESS; + uint16 u16DurlSize = m2m_strlen(u8DownloadUrl) + 1; + /*Todo: we may change it to data pkt but we need to give it higer priority + but the priorty is not implemnted yet in data pkt + */ + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_START_UPDATE,u8DownloadUrl,u16DurlSize,NULL,0,0); + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_rollback(void); + +@brief + Request OTA Rollback image + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_rollback(void) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_ROLLBACK,NULL,0,NULL,0,0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_abort(void); + +@brief + Request OTA Abort + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_abort(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_ABORT,NULL,0,NULL,0,0); + return ret; +} + + +/*! +@fn \ + NMI_API sint8 m2m_ota_switch_firmware(void); + +@brief + Switch to the upgraded Firmware + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_switch_firmware(void) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_SWITCH_FIRMWARE,NULL,0,NULL,0,0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} +#if 0 +#define M2M_OTA_FILE "../../../m2m_ota.dat" +NMI_API sint8 m2m_ota_test(void) +{ + uint32 page = 0; + uint8 buffer[1500]; + uint32 u32Sz = 0; + sint8 ret = M2M_SUCCESS; + FILE *fp =NULL; + fp = fopen(M2M_OTA_FILE,"rb"); + if(fp) + { + fseek(fp, 0L, SEEK_END); + u32Sz = ftell(fp); + fseek(fp, 0L, SEEK_SET); + + while(u32Sz > 0) + { + { + page = (rand()%1400); + + if((page<100)||(page>1400)) page = 1400; + } + + if(u32Sz>page) + { + u32Sz-=page; + } + else + { + page = u32Sz; + u32Sz = 0; + } + printf("page %d\n", (int)page); + fread(buffer,page,1,fp); + ret = hif_send(M2M_REQ_GROUP_OTA,M2M_OTA_REQ_TEST|M2M_REQ_DATA_PKT,NULL,0,(uint8*)&buffer,page,0); + if(ret != M2M_SUCCESS) + { + M2M_ERR("\n"); + } + nm_bsp_sleep(1); + } + + } + else + { + M2M_ERR("nO err\n"); + } + return ret; +} +#endif + diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_periph.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_periph.c new file mode 100644 index 0000000..3adb31f --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_periph.c @@ -0,0 +1,143 @@ +/** + * + * \file + * + * \brief WINC3400 Peripherials Application Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_periph.h" +#include "driver/source/nmasic.h" +#include "m2m_hif.h" + +#ifdef CONF_PERIPH + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static sint8 get_gpio_idx(uint8 u8GpioNum) +{ + if(u8GpioNum >= M2M_PERIPH_GPIO_MAX) return -1; + if(u8GpioNum == M2M_PERIPH_GPIO3) + { + return 3; + } + else if(u8GpioNum == M2M_PERIPH_GPIO4) + { + return 4; + } + else if(u8GpioNum == M2M_PERIPH_GPIO15) + { + return 15; + } + else if(u8GpioNum == M2M_PERIPH_GPIO16) + { + return 16; + } + else if(u8GpioNum == M2M_PERIPH_GPIO18) + { + return 18; + } + else + { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static sint8 gpio_ioctl(uint8 op, uint8 u8GpioNum, uint8 u8InVal, uint8 * pu8OutVal) +{ + sint8 ret, gpio; + + ret = hif_chip_wake(); + if(ret != M2M_SUCCESS) goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if(gpio < 0) goto _EXIT1; + + if(op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8)gpio, u8InVal); + } else if(op == GPIO_OP_SET) { + ret = set_gpio_val((uint8)gpio, u8InVal); + } else if(op == GPIO_OP_GET) { + ret = get_gpio_val((uint8)gpio, pu8OutVal); + } + if(ret != M2M_SUCCESS) goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +sint8 m2m_periph_init(tstrPerphInitParam * param) +{ + return M2M_SUCCESS; +} + +sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable) +{ + return pullup_ctrl(pinmask, enable); +} +#endif /* CONF_PERIPH */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ssl.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ssl.c new file mode 100644 index 0000000..cb53396 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_ssl.c @@ -0,0 +1,406 @@ +/** + * + * \file + * + * \brief WINC SSL Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_ssl.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" +#include + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32 gu32HIFAddr = 0; +static tenuTlsFlashStatus genuStatus = TLS_FLASH_ERR_UNKNOWN; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! + @fn \ m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) + @brief SSL callback function + @param [in] u8OpCode + HIF Opcode type. + @param [in] u16DataSize + HIF data length. + @param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + sint8 s8tmp = M2M_SUCCESS; + switch(u8OpCode) + { + case M2M_SSL_REQ_ECC: + { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8*)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if(s8tmp == M2M_SUCCESS) + { + if (gpfAppSSLCb) + { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } + break; + case M2M_SSL_RESP_SET_CS_LIST: + { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8*)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if(s8tmp == M2M_SUCCESS) + { + if (gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } + break; + case M2M_SSL_RESP_WRITE_OWN_CERTS: + { + tstrTlsSrvChunkHdr strTlsSrvChunkRsp; + uint8 bCallApp = 1; + + s8tmp = hif_receive(u32Addr, (uint8*)&strTlsSrvChunkRsp, sizeof(tstrTlsSrvChunkHdr), 0); + if(s8tmp == M2M_SUCCESS) + { + uint16 offset = strTlsSrvChunkRsp.u16Offset32; + uint16 chunk_size = strTlsSrvChunkRsp.u16Size32; + uint16 total_size = strTlsSrvChunkRsp.u16TotalSize32; + tenuTlsFlashStatus status = (tenuTlsFlashStatus)(strTlsSrvChunkRsp.u16Sig); + + /* If first chunk, reset status. */ + if (offset == 0) + genuStatus = TLS_FLASH_OK_NO_CHANGE; + /* Only send status to app when processing last chunk. */ + if (offset + chunk_size != total_size) + bCallApp = 0; + + switch (status) + { + case TLS_FLASH_OK: + // Good flash write. Update status if no errors yet. + if (genuStatus == TLS_FLASH_OK_NO_CHANGE) + genuStatus = status; + break; + case TLS_FLASH_OK_NO_CHANGE: + // No change, don't update status. + break; + case TLS_FLASH_ERR_CORRUPT: + // Corrupt. Always update status. + genuStatus = status; + break; + case TLS_FLASH_ERR_NO_CHANGE: + // Failed flash write. Update status if no more serious error. + if ((genuStatus != TLS_FLASH_ERR_CORRUPT) && (genuStatus != TLS_FLASH_ERR_UNKNOWN)) + genuStatus = status; + break; + default: + // Don't expect any other case. Ensure we don't mask a previous corrupt error. + if (genuStatus != TLS_FLASH_ERR_CORRUPT) + genuStatus = TLS_FLASH_ERR_UNKNOWN; + break; + } + } + if (bCallApp && gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_WRITE_OWN_CERTS, &genuStatus); + } + break; + } + if(s8tmp != M2M_SUCCESS) + { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + + +/*! + @fn \ m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) + @brief Sends ECC responses to the WINC + @param [in] strECCResp + ECC Response struct. + @param [in] pu8RspDataBuffe + Pointer of the response data to be sent. + @param [in] u16RspDataSz + Response data size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8* pu8RspDataBuff, uint16 u16RspDataSz) +{ + sint8 s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), (uint8*)strECCResp, sizeof(tstrEccReqInfo), pu8RspDataBuff, u16RspDataSz, sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_send_certs_to_winc(uint8* sector_buffer, uint32 sector_size) + @brief Sends certificates to the WINC + @param [in] pu8Buffer + Pointer to the certificates. + @param [in] u32BufferSz + Size of the certificates. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_send_certs_to_winc(uint8* pu8Buffer, uint32 u32BufferSz) +{ + sint8 s8Ret = M2M_SUCCESS; + #define TXLIMIT (256 * 6) + + if(u32BufferSz <= TXLIMIT) + { + // set chunk header for one chunk + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)pu8Buffer; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = (u32BufferSz + 3) >> 2; + pchkhdr->u16Offset32 = 0; + pchkhdr->u16Size32 = (u32BufferSz + 3) >> 2; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + M2M_INFO("Transferred %u bytes of cert data NON-CHUNKED\n", u32BufferSz); + } + else + { + // chunk it + // We are sneaking in a header - tstrTlsSrvChunkHdr + #define CHUNKHDRSZ (sizeof(tstrTlsSrvChunkHdr)) + #define CHUNKSZ (TXLIMIT - 256) // divisible by 4 + uint8 saveblob[CHUNKHDRSZ]; + uint32 ofs = 0; + uint32 thischunksz = 0; + + // first is special - over writing our header + m2m_memcpy(saveblob, &pu8Buffer[ofs], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ,u32BufferSz-ofs); // no need to round up to quad words this time + + tstrTlsSrvChunkHdr* pchkhdr = (tstrTlsSrvChunkHdr*)&pu8Buffer[ofs]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs], thischunksz, 0); + M2M_INFO("Transferred %u bytes of cert data CHUNKED to offset %u total %u\n", thischunksz, ofs, u32BufferSz); + m2m_memcpy(&pu8Buffer[ofs], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + + while (ofs < u32BufferSz) + { + // Subsequent chunks write header before and send a little more + m2m_memcpy(saveblob, &pu8Buffer[ofs-CHUNKHDRSZ], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ,u32BufferSz-ofs); + thischunksz = (thischunksz + 3) & 0xFFFFFFFC; // needs to round up to quad word length + pchkhdr = (tstrTlsSrvChunkHdr*)&pu8Buffer[ofs - CHUNKHDRSZ]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs - CHUNKHDRSZ], thischunksz + CHUNKHDRSZ, 0); + M2M_INFO("Transferred %u bytes of cert data CHUNKED to offset %u total %u\n", thischunksz, ofs, u32BufferSz); + m2m_memcpy(&pu8Buffer[ofs - CHUNKHDRSZ], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + } + } + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_cert(uint32 u32ReadAddr, uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) + @brief Retrieve the certificate to be verified from the WINC + @param [in] pu16CurveType + Pointer to the certificate curve type. + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] pu8Sig + Pointer to the certificate signature. + @param [in] pu8Key + Pointer to the certificate Key. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_cert(uint16* pu16CurveType, uint8* pu8Hash, uint8* pu8Sig, tstrECPoint* pu8Key) +{ + uint8 bSetRxDone = 1; + uint16 u16HashSz, u16SigSz, u16KeySz; + sint8 s8Ret = M2M_SUCCESS; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(hif_receive(gu32HIFAddr, (uint8*)pu16CurveType, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16HashSz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8*)&u16SigSz, 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += 2; + + (*pu16CurveType)= _htons((*pu16CurveType)); + pu8Key->u16Size = _htons(u16KeySz); + u16HashSz = _htons(u16HashSz); + u16SigSz = _htons(u16SigSz); + + if(hif_receive(gu32HIFAddr, pu8Key->X, pu8Key->u16Size * 2, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += (pu8Key->u16Size * 2); + + if(hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16HashSz; + + if(hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16SigSz; + + bSetRxDone = 0; + +__ERR: + if(bSetRxDone) + { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_retrieve_hash(uint32 u32ReadAddr, uint8* pu8Hash, uint16 u16HashSz) + @brief Retrieve the certificate hash + @param [in] pu8Hash + Pointer to the certificate hash. + @param [in] u16HashSz + Hash size. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_retrieve_hash(uint8* pu8Hash, uint16 u16HashSz) +{ + uint8 bSetRxDone = 1; + sint8 s8Ret = M2M_SUCCESS; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(hif_receive(gu32HIFAddr, pu8Hash, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + + bSetRxDone = 0; + +__ERR: + if(bSetRxDone) + { + s8Ret = M2M_ERR_FAIL; + hif_receive(0, NULL, 0, 1); + } + return s8Ret; +} + +/*! + @fn \ m2m_ssl_stop_processing_certs(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_stop_processing_certs(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! + @fn \ m2m_ssl_ecc_process_done(void) + @brief Stops receiving from the HIF +*/ +NMI_API void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn \ + m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP); + Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination, except for combinations involving both RSA + and ECC; if any RSA ciphersuite is enabled, then firmware will disable all ECC ciphersuites. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + be changed. + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +sint8 m2m_ssl_set_active_ciphersuites(uint32 u32SslCsBMP) +{ + sint8 s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8*)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +/*! + @fn \ m2m_ssl_init(tpfAppSslCb pfAppSslCb); + @brief Initializes the SSL layer. + @param [in] pfAppSslCb + Application SSL callback function. + @return The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + sint8 s8Ret = M2M_SUCCESS; + + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + genuStatus = TLS_FLASH_ERR_UNKNOWN; + + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL,m2m_ssl_cb); + if (s8Ret != M2M_SUCCESS) + { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/m2m_wifi.c b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_wifi.c new file mode 100644 index 0000000..6e63116 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/m2m_wifi.c @@ -0,0 +1,1482 @@ +/** + * + * \file + * + * \brief This module contains M2M Wi-Fi APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "driver/include/m2m_wifi.h" +#include "driver/source/m2m_hif.h" +#include "driver/source/nmasic.h" +#include + +static volatile uint8 gu8ChNum; +static tpfAppWifiCb gpfAppWifiCb = NULL; + + +#ifdef ETH_MODE +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8* gau8ethRcvBuf=NULL; +static uint16 gu16ethRcvBufSize ; +#endif + +//#define CONF_MGMT + +#ifdef CONF_MGMT +static tpfAppMonCb gpfAppMonCb = NULL; +static struct _tstrMgmtCtrl +{ + uint8* pu8Buf; + uint16 u16Offset; + uint16 u16Sz; +} +gstrMgmtCtrl = {NULL, 0 , 0}; +#endif +/** +* @fn m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr, uint8 grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +* @author +* @date +* @version 1.0 +*/ +static void m2m_wifi_cb(uint8 u8OpCode, uint16 u16DataSize, uint32 u32Addr) +{ + uint8 rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) + { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8*) &strState,sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) + { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8*) &strSysTime,sizeof(tstrSystemTime), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } + else if(u8OpCode == M2M_WIFI_RESP_CONN_INFO) + { + tstrM2MConnInfo strConnInfo; + if(hif_receive(u32Addr, (uint8*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) + { +#if 0 + if (hif_receive(u32Addr, rx_buf, 4, 1) == M2M_SUCCESS) + { + tstrM2mWifiStateChanged strState; + m2m_memcpy((uint8*) &strState, rx_buf,sizeof(tstrM2mWifiStateChanged)); + if (app_wifi_recover_cb) + app_wifi_recover_cb(strState.u8CurrState); + } +#endif + } + else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) + { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8 *)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8 *)&strIpConfig); + } + } + else if (u8OpCode == M2M_WIFI_REQ_WPS) + { + tstrM2MWPSInfo strWps; + m2m_memset((uint8*)&strWps,0,sizeof(tstrM2MWPSInfo)); + if(hif_receive(u32Addr, (uint8*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } + else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) + { + uint32 u32ConflictedIP; + if(hif_receive(u32Addr, (uint8 *)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) + { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \" \n", + BYTE_0(u32ConflictedIP),BYTE_1(u32ConflictedIP),BYTE_2(u32ConflictedIP),BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) + { + tstrM2mScanDone strState; + if(hif_receive(u32Addr, (uint8*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) + { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) + { + tstrM2mWifiscanResult strScanResult; + if(hif_receive(u32Addr, (uint8*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } + else if(u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) + { + tstrM2MProvisionInfo strProvInfo; + if(hif_receive(u32Addr, (uint8*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } + else if(u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) + { + tstrM2MDefaultConnResp strResp; + if(hif_receive(u32Addr, (uint8*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_BLE_API_RECV) + { + //Read the length + if(hif_receive(u32Addr, rx_buf, 2, 0) == M2M_SUCCESS) + { + uint16 u16BleMsgLen = (rx_buf[1] << 8) + rx_buf[0]; + tstrM2mBleApiMsg* bleRx = (tstrM2mBleApiMsg*)malloc(u16BleMsgLen + sizeof(tstrM2mBleApiMsg)); + + if(bleRx != NULL) + { + bleRx->u16Len = u16BleMsgLen; + + //Read the rest of the message + if (hif_receive(u32Addr+2, bleRx->data, bleRx->u16Len, 1)== M2M_SUCCESS) + { + if(gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_BLE_API_RECV, bleRx); + } + free(bleRx); + } + } + } + else if(u8OpCode == M2M_WIFI_RESP_GET_PRNG) + { + tstrPrng strPrng; + if(hif_receive(u32Addr, (uint8*)&strPrng,sizeof(tstrPrng), 0) == M2M_SUCCESS) + { + if(hif_receive(u32Addr + sizeof(tstrPrng),strPrng.pu8RngBuff,strPrng.u16PrngSize, 1) == M2M_SUCCESS) + { + if(gpfAppWifiCb) { + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG,&strPrng); + } + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_SET_GAIN_TABLE) + { + tstrM2MGainTableRsp strGainRsp; + if (hif_receive(u32Addr, (uint8*) &strGainRsp,sizeof(tstrM2MGainTableRsp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SET_GAIN_TABLE, &strGainRsp); + } + } +#ifdef ETH_MODE + else if(u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) + { + if(hif_receive(u32Addr, rx_buf ,sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) + { + tstrM2mIpRsvdPkt * pstrM2MIpRxPkt = (tstrM2mIpRsvdPkt*)rx_buf; + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16 u16Offset = pstrM2MIpRxPkt->u16PktOffset; + + strM2mIpCtrlBuf.u16RemainigDataSize = pstrM2MIpRxPkt->u16PktSz; + if((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) + { + while (strM2mIpCtrlBuf.u16RemainigDataSize > 0) + { + if(strM2mIpCtrlBuf.u16RemainigDataSize > gu16ethRcvBufSize) + { + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; + } + else + { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainigDataSize; + } + if(hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) + { + strM2mIpCtrlBuf.u16RemainigDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } + else + { + break; + } + } + } + } + } +#endif + +#ifdef CONF_MGMT + else if(u8OpCode == M2M_WIFI_RESP_WIFI_RX_PACKET) + { + tstrM2MWifiRxPacketInfo strRxPacketInfo; + if(u16DataSize >= sizeof(tstrM2MWifiRxPacketInfo)) { + if(hif_receive(u32Addr, (uint8*)&strRxPacketInfo, sizeof(tstrM2MWifiRxPacketInfo), 0) == M2M_SUCCESS) + { + u16DataSize -= sizeof(tstrM2MWifiRxPacketInfo); + if(u16DataSize > 0 && gstrMgmtCtrl.pu8Buf != NULL) + { + if(u16DataSize > (gstrMgmtCtrl.u16Sz + gstrMgmtCtrl.u16Offset)) + { + u16DataSize = gstrMgmtCtrl.u16Sz; + } + u32Addr += sizeof(tstrM2MWifiRxPacketInfo) + gstrMgmtCtrl.u16Offset; + if(hif_receive(u32Addr , gstrMgmtCtrl.pu8Buf, u16DataSize, 1) != M2M_SUCCESS) + { + u16DataSize = 0; + } + } + if(gpfAppMonCb) + gpfAppMonCb(&strRxPacketInfo, gstrMgmtCtrl.pu8Buf,u16DataSize); + } + } else { + M2M_ERR("Incorrect mon data size %u\n", u16DataSize); + } + } +#endif + else + { + M2M_ERR("REQ Not defined %d\n",u8OpCode); + } +} + +sint8 m2m_wifi_download_mode() +{ + sint8 ret = M2M_SUCCESS; + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(0); + if(ret != M2M_SUCCESS) goto _EXIT0; + + + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static sint8 m2m_validate_ap_parameters(CONST tstrM2MAPConfig* pstrM2MAPConfig) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if(pstrM2MAPConfig == NULL) + { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if((m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8SSID) >= M2M_MAX_SSID_LEN)) + { + M2M_ERR("INVALID SSID\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if(pstrM2MAPConfig->u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPConfig->u8ListenChannel < M2M_WIFI_CH_1) + { + M2M_ERR("INVALID CH\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if(!(pstrM2MAPConfig->au8DHCPServerIP[0] || pstrM2MAPConfig->au8DHCPServerIP[1])) + { + if(!(pstrM2MAPConfig->au8DHCPServerIP[2])) + { + M2M_ERR("INVALID DHCP SERVER IP\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_OPEN) + { + goto ERR1; + } + else if(pstrM2MAPConfig->u8SecType == M2M_WIFI_SEC_WEP) + { + /* Check for WEP Key index */ + if((pstrM2MAPConfig->u8KeyIndx <= 0) || (pstrM2MAPConfig->u8KeyIndx > WEP_KEY_MAX_INDEX)) + { + M2M_ERR("INVALID KEY INDEX\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if( (pstrM2MAPConfig->u8KeySz != WEP_40_KEY_STRING_SIZE) && + (pstrM2MAPConfig->u8KeySz != WEP_104_KEY_STRING_SIZE) + ) + { + M2M_ERR("INVALID KEY SIZE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key */ + if((pstrM2MAPConfig->au8WepKey == NULL) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) <= 0) || (m2m_strlen((uint8 *)pstrM2MAPConfig->au8WepKey) > WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID WEP KEY\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + else + { + M2M_ERR("INVALID AUTHENTICATION MODE\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} +static sint8 m2m_validate_scan_options(tstrM2MScanOption* ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if(ptstrM2MScanOption == NULL) + { + M2M_ERR("INVALID POINTER\n"); + s8Ret = M2M_ERR_FAIL; + } + else + { + /* Check for valid No of slots */ + if(ptstrM2MScanOption->u8NumOfSlot == 0) + { + M2M_ERR("INVALID No of scan slots!\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid time of slots */ + if((ptstrM2MScanOption->u8SlotTime < 10) || (ptstrM2MScanOption->u8SlotTime > 250)) + { + M2M_ERR("INVALID scan slot time!\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid No of probe requests per slot */ + if((ptstrM2MScanOption->u8ProbesPerSlot == 0) || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) + { + M2M_ERR("INVALID No of probe requests per scan slot\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid RSSI threshold */ + if(ptstrM2MScanOption->s8RssiThresh >= 0) + { + M2M_ERR("INVALID RSSI threshold %d \n",ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + } + return s8Ret; +} + +NMI_API sint8 m2m_wifi_ble_set_gain_table(uint8 table_idx) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MGainTable strGainTable = {0}; + + strGainTable.u8GainTable = table_idx; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_GAIN_TABLE, (uint8 *)&strGainTable, sizeof(tstrM2MGainTable), NULL, 0, 0); + return s8Ret; +} + + +sint8 m2m_wifi_init_hold(void) +{ + sint8 ret = M2M_ERR_FAIL; + + /* Apply device specific initialization. */ + ret = nm_drv_init_hold(0); + + return ret; +} +sint8 m2m_wifi_init_start(tstrWifiInitParam * param) +{ + tstrM2mRev strtmp; + sint8 ret = M2M_SUCCESS; + + if(param == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = param->pfAppWifiCb; + +#ifdef ETH_MODE + gpfAppEthCb = param->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = param->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = param->strEthInitParam.u16ethRcvBufSize; +#endif + +#ifdef CONF_MGMT + gpfAppMonCb = param->pfAppMonCb; +#endif + + /* Apply device specific initialization. */ + ret = nm_drv_init_start(NULL); + if(ret != M2M_SUCCESS) goto _EXIT0; + /* Initialize host interface module */ + ret = hif_init(NULL); + if(ret != M2M_SUCCESS) goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI,m2m_wifi_cb); + + M2M_INFO("Curr driver ver: %u.%u.%u\n", M2M_DRIVER_VERSION_MAJOR_NO, M2M_DRIVER_VERSION_MINOR_NO, M2M_DRIVER_VERSION_PATCH_NO); + M2M_INFO("Curr driver HIF Level: (%u) %u.%u\n", M2M_HIF_BLOCK_VALUE, M2M_HIF_MAJOR_VALUE, M2M_HIF_MINOR_VALUE); + ret = m2m_wifi_get_firmware_version(&strtmp); + m2m_ota_get_firmware_version(&strtmp); + + if(ret == M2M_SUCCESS) + { + ret = hif_enable_access(); + if(ret == M2M_SUCCESS) + { + m2m_wifi_ble_set_gain_table(param->GainTableIndex); + } + } + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); +_EXIT0: + return ret; +} +sint8 m2m_wifi_init(tstrWifiInitParam * param) +{ + sint8 ret = M2M_SUCCESS; + + ret = m2m_wifi_init_hold(); + if (ret == M2M_SUCCESS) + { + ret = m2m_wifi_init_start(param); + } + return ret; +} +sint8 m2m_wifi_deinit(void * arg) +{ + + hif_deinit(NULL); + + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} +sint8 m2m_wifi_reinit_hold(void) +{ + m2m_wifi_deinit(NULL); + return m2m_wifi_init_hold(); +} +sint8 m2m_wifi_reinit_start(tstrWifiInitParam * param) +{ + return m2m_wifi_init_start(param); +} +sint8 m2m_wifi_reinit(tstrWifiInitParam * param) +{ + sint8 ret = M2M_ERR_FAIL; + ret = m2m_wifi_reinit_hold(); + if(ret == M2M_SUCCESS) { + ret = m2m_wifi_reinit_start(param); + } + return ret; +} + +void m2m_wifi_yield(void) +{ + hif_yield(); +} + +sint8 m2m_wifi_handle_events(void * arg) +{ + return hif_handle_isr(); +} + +sint8 m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0,NULL, 0,0); +} + +sint8 m2m_wifi_connect(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch,0); +} +sint8 m2m_wifi_connect_sc(char *pcSsid, uint8 u8SsidLen, uint8 u8SecType, void *pvAuthInfo, uint16 u16Ch, uint8 u8NoSaveCred) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mWifiConnect strConnect; + tstrM2MWifiSecInfo *pstrAuthInfo; + + if(u8SecType != M2M_WIFI_SEC_OPEN) + { + if(pvAuthInfo == NULL) + { + M2M_ERR("Key is not valid\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + if((u8SecType == M2M_WIFI_SEC_WPA_PSK) && (m2m_strlen(pvAuthInfo) == (M2M_MAX_PSK_LEN-1))) + { + uint8 i = 0; + uint8* pu8Psk = (uint8*)pvAuthInfo; + while(i < (M2M_MAX_PSK_LEN-1)) + { + if(pu8Psk[i]<'0' || (pu8Psk[i]>'9' && pu8Psk[i] < 'A')|| (pu8Psk[i]>'F' && pu8Psk[i] < 'a') || pu8Psk[i] > 'f') + { + M2M_ERR("Invalid Key\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + i++; + } + } + } + if((u8SsidLen<=0)||(u8SsidLen>=M2M_MAX_SSID_LEN)) + { + M2M_ERR("SSID LEN INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + if(u16Ch < M2M_WIFI_CH_1 || u16Ch > M2M_WIFI_CH_14) + { + if(u16Ch!=M2M_WIFI_CH_ALL) + { + M2M_ERR("CH INVALID\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + } + + m2m_memcpy(strConnect.au8SSID, (uint8*)pcSsid, u8SsidLen); + strConnect.au8SSID[u8SsidLen] = 0; + strConnect.u16Ch = NM_BSP_B_L_16(u16Ch); + /* Credentials will be Not be saved if u8NoSaveCred is set */ + strConnect.u8NoSaveCred = u8NoSaveCred ? 1:0; + pstrAuthInfo = &strConnect.strSec; + pstrAuthInfo->u8SecType = u8SecType; + + if(u8SecType == M2M_WIFI_SEC_WEP) + { + tstrM2mWifiWepParams * pstrWepParams = (tstrM2mWifiWepParams*)pvAuthInfo; + tstrM2mWifiWepParams *pstrWep = &pstrAuthInfo->uniAuth.strWepInfo; + pstrWep->u8KeyIndx =pstrWepParams->u8KeyIndx-1; + + if(pstrWep->u8KeyIndx >= WEP_KEY_MAX_INDEX) + { + M2M_ERR("Invalid Wep key index %d\n", pstrWep->u8KeyIndx); + ret = M2M_ERR_FAIL; + goto ERR1; + } + pstrWep->u8KeySz = pstrWepParams->u8KeySz-1; + if ((pstrWep->u8KeySz != WEP_40_KEY_STRING_SIZE)&& (pstrWep->u8KeySz != WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("Invalid Wep key length %d\n", pstrWep->u8KeySz); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy((uint8*)pstrWep->au8WepKey,(uint8*)pstrWepParams->au8WepKey, pstrWepParams->u8KeySz); + pstrWep->au8WepKey[pstrWepParams->u8KeySz] = 0; + + } + + + else if(u8SecType == M2M_WIFI_SEC_WPA_PSK) + { + uint16 u16KeyLen = m2m_strlen((uint8*)pvAuthInfo); + if((u16KeyLen <= 0)||(u16KeyLen >= M2M_MAX_PSK_LEN)) + { + M2M_ERR("Incorrect PSK key length\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + m2m_memcpy(pstrAuthInfo->uniAuth.au8PSK, (uint8*)pvAuthInfo, u16KeyLen + 1); + } + else if(u8SecType == M2M_WIFI_SEC_802_1X) + { + m2m_memcpy((uint8*)&pstrAuthInfo->uniAuth.strCred1x, (uint8*)pvAuthInfo, sizeof(tstr1xAuthCredentials)); + } + else if(u8SecType == M2M_WIFI_SEC_OPEN) + { + + } + else + { + M2M_ERR("undefined sec type\n"); + ret = M2M_ERR_FAIL; + goto ERR1; + } + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, (uint8*)&strConnect, sizeof(tstrM2mWifiConnect),NULL, 0,0); + +ERR1: + return ret; +} + +sint8 m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0,0); +} +sint8 m2m_wifi_set_mac_address(uint8 au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + m2m_memcpy((uint8*) strTmp.au8Mac, (uint8*) au8MacAddress, 6); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, + (uint8*) &strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0,0); +} + +sint8 m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32( + pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32( + pstrStaticIPConf->u32SubnetMask); + return hif_send(M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, + (uint8*) pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0,0); +} + +sint8 m2m_wifi_request_dhcp_client(void) +{ + /*legacy API should be removed */ + return 0; +} +sint8 m2m_wifi_request_dhcp_server(uint8* addr) +{ + /*legacy API should be removed */ + return 0; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); +@brief Set the Wi-Fi listen interval for power save operation. It is represented in units + of AP Beacon periods. +@param [in] pstrM2mLsnInt + Structure holding the listen interval configurations. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tstrM2mLsnInt , m2m_wifi_set_sleep_mode +@pre m2m_wifi_set_sleep_mode shall be called first +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_enable_dhcp(uint8 u8DhcpEn ) +{ + + uint8 u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); + + +} + +sint8 m2m_wifi_set_lsn_int(tstrM2mLsnInt* pstrM2mLsnInt) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8*)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +sint8 m2m_wifi_set_cust_InfoElement(uint8* pau8M2mCustInfoElement) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CUST_INFO_ELEMENT, (uint8*)pau8M2mCustInfoElement, pau8M2mCustInfoElement[0]+1, NULL, 0, 0); +} + +sint8 m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if(m2m_validate_scan_options (ptstrM2MScanOption) == M2M_SUCCESS) + { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_OPTION, (uint8*)ptstrM2MScanOption, sizeof(tstrM2MScanOption),NULL, 0,0); + } + return s8Ret; +} +sint8 m2m_wifi_set_scan_region(uint16 ScanRegion) +{ + sint8 s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_REGION, (uint8*)&strScanRegion, sizeof(tstrM2MScanRegion),NULL, 0,0); + return s8Ret; +} +sint8 m2m_wifi_request_scan(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +sint8 m2m_wifi_request_scan_passive(uint8 ch) +{ + sint8 s8Ret = M2M_SUCCESS; + + if(((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8*)&strtmp, sizeof(tstrM2MScan),NULL, 0,0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} +sint8 m2m_wifi_wps(uint8 u8TriggerType,const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + m2m_memcpy ((uint8*)strtmp.acPinNumber,(uint8*) pcPinNumber,8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8*)&strtmp,sizeof(tstrM2MWPSConnect), NULL, 0,0); +} + +sint8 m2m_wifi_wps_disable(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL,0, NULL, 0, 0); + return ret; +} + +#if 0 +/* + * These two functions m2m_wifi_req_client_ctrl and m2m_wifi_req_server_init are for a mode in which two WINC ICs + * communicate with each other via probe request and probe response frames. This mode is not supported in WINC fw. + */ +sint8 m2m_wifi_req_client_ctrl(uint8 u8Cmd) +{ + + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2Mservercmd strCmd; + strCmd.u8cmd = u8Cmd; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CLIENT_CTRL, (uint8*)&strCmd, sizeof(tstrM2Mservercmd), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +sint8 m2m_wifi_req_server_init(uint8 ch) +{ + sint8 ret = M2M_SUCCESS; +#ifdef _PS_SERVER_ + tstrM2mServerInit strServer; + strServer.u8Channel = ch; + ret = hif_send(M2M_REQ_GROUP_WIFI,M2M_WIFI_REQ_SERVER_INIT, (uint8*)&strServer, sizeof(tstrM2mServerInit), NULL, 0, 0); +#else + M2M_ERR("_PS_SERVER_ is not defined\n"); +#endif + return ret; +} +#endif + +sint8 m2m_wifi_p2p(uint8 u8Channel) +{ + sint8 ret = M2M_SUCCESS; + if((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) + { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8*)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0,0); + } + else + { + M2M_ERR("Listen channel should only be 1, 6 or 11\n"); + ret = M2M_ERR_FAIL; + } + return ret; +} +sint8 m2m_wifi_p2p_disconnect(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +sint8 m2m_wifi_enable_ap(CONST tstrM2MAPConfig* pstrM2MAPConfig) +{ + sint8 ret = M2M_ERR_FAIL; + if(M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPConfig)) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8 *)pstrM2MAPConfig, sizeof(tstrM2MAPConfig), NULL, 0, 0); + } + return ret; +} +sint8 m2m_wifi_disable_ap(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_req_curr_rssi(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL,0, 0); + return ret; +} + +sint8 m2m_wifi_req_restrict_ble(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_RESTRICT_BLE,NULL, 0, NULL, 0, 0); + return ret; +} + +sint8 m2m_wifi_req_unrestrict_ble(void) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_UNRESTRICT_BLE,NULL, 0, NULL, 0, 0); + return ret; +} + +sint8 m2m_wifi_send_ethernet_pkt(uint8* pu8Packet,uint16 u16PacketSize) +{ + sint8 s8Ret = -1; + if((pu8Packet != NULL)&&(u16PacketSize>0)) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8Packet, u16PacketSize, M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_otp_mac_address(uint8 *pu8MacAddr, uint8* pu8IsValid) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + if(ret == M2M_SUCCESS) + { + ret = hif_chip_sleep(); + } + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +sint8 m2m_wifi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nmi_get_mac_address(pu8MacAddr); + if(ret == M2M_SUCCESS) + { + ret = hif_chip_sleep(); + } + } + + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_req_scan_result(uint8 index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +sint8 m2m_wifi_req_scan_result(uint8 index) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_RESULT, (uint8*) &strReqScanRlt, sizeof(tstrM2mReqScanResult), NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8 m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} +/*! +@fn NMI_API uint8 m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8 m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn); +@brief Set the power saving mode for the WINC3400. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC3400 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC3400 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +sint8 m2m_wifi_set_sleep_mode(uint8 PsTyp, uint8 BcastEn) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8*) &strPs,sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\n",PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_request_sleep(void) +@brief Request from WINC3400 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning This API is currently unsupported on the WINC3400 +*/ +sint8 m2m_wifi_request_sleep(uint32 u32SlpReqTime) +{ + sint8 ret = M2M_SUCCESS; + uint8 psType; + psType = hif_get_sleep_mode(); + if(psType == M2M_PS_MANUAL) + { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8*) &strPs,sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength); +@brief Set the WINC3400 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +sint8 m2m_wifi_set_device_name(uint8 *pu8DeviceName, uint8 u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if(u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) + { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + //pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength ++; + m2m_memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8*)&strDeviceName, sizeof(tstrM2MDeviceNameConfig), NULL, 0,0); +} +/*! +@fn \ + uint32 m2m_wifi_get_chipId(void) + +@brief + Get the WINC Chip ID. + +@return + The function SHALL return chipID >0 or 0 for failure. +*/ +uint32 m2m_wifi_get_chipId(void) +{ + return nmi_get_chipid(); +} +/*! +@fn sint8 m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +sint8 m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +/*! +@fn sint8 m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +sint8 m2m_wifi_check_ota_rb(void) +{ + sint8 ret = M2M_SUCCESS; + uint16 ota_hif_info = 0; + + ret = nm_get_hif_info(NULL, &ota_hif_info); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(ota_hif_info); + } + return ret; +} +/*! +@fn \ + NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_ota_get_firmware_version(tstrM2mRev * pstrRev) +{ + sint8 ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} +#ifdef CONF_MGMT +sint8 m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8 *pu8PayloadBuffer, + uint16 u16BufferSize, uint16 u16DataOffset) +{ + sint8 s8Ret = -1; + if((pstrMtrCtrl->u8ChannelID >= M2M_WIFI_CH_1) && (pstrMtrCtrl->u8ChannelID <= M2M_WIFI_CH_14)) + { + gstrMgmtCtrl.pu8Buf = pu8PayloadBuffer; + gstrMgmtCtrl.u16Sz = u16BufferSize; + gstrMgmtCtrl.u16Offset = u16DataOffset; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_MONITORING, + (uint8*)pstrMtrCtrl, sizeof(tstrM2MWifiMonitorModeCtrl), NULL, 0,0); + } + return s8Ret; +} +sint8 m2m_wifi_disable_monitoring_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_MONITORING, NULL, 0, NULL, 0,0); +} + +sint8 m2m_wifi_send_wlan_pkt(uint8 *pu8WlanPacket, uint16 u16WlanHeaderLength, uint16 u16WlanPktSize) +{ + sint8 s8Ret = -1; + if(pu8WlanPacket != NULL) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16WlanPktSize; + strTxPkt.u16HeaderLength = u16WlanHeaderLength; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_WIFI_PACKET | M2M_REQ_DATA_PKT, + (uint8*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8WlanPacket, u16WlanPktSize, sizeof(tstrM2MWifiTxPacketInfo)); + } + return s8Ret; +} +#endif + +sint8 m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8 bEnableHttpRedirect) +{ + sint8 s8Ret = M2M_ERR_FAIL; + + if((pstrAPConfig != NULL)) + { + tstrM2MProvisionModeConfig strProvConfig; + if(M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPConfig)) + { + m2m_memcpy((uint8*)&strProvConfig.strApConfig, (uint8*)pstrAPConfig, sizeof(tstrM2MAPConfig)); + if((m2m_strlen((uint8 *)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) + { + M2M_ERR("INVALID DOMAIN NAME\n"); + goto ERR1; + } + m2m_memcpy((uint8*)strProvConfig.acHttpServerDomainName, (uint8*)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); + } + else + { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +sint8 m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +sint8 m2m_wifi_set_sytem_time(uint32 u32UTCSeconds) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8*)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} +/*! + * @fn NMI_API sint8 m2m_wifi_get_sytem_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_sytem_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 m2m_wifi_get_sytem_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL,0, NULL, 0, 0); +} + +sint8 m2m_wifi_enable_sntp(uint8 bEnable) +{ + uint8 u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} +/*! +@fn NMI_API sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode); +@brief Change the power profile mode +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +sint8 m2m_wifi_set_power_profile(uint8 u8PwrMode) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_POWER_PROFILE, (uint8*)&strM2mPwrMode,sizeof(tstrM2mPwrMode), NULL, 0, 0); + return ret; +} +/*! +@fn NMI_API sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_tx_power(uint8 u8TxPwrLevel) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_TX_POWER, (uint8*)&strM2mTxPwrLevel,sizeof(tstrM2mTxPwrLevel), NULL, 0, 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_enable_firmware_logs(uint8 u8Enable) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_ENABLE_LOGS, (uint8*)&strM2mEnableLogs,sizeof(tstrM2mEnableLogs), NULL, 0, 0); + return ret; +} + +/*! +@fn NMI_API sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +sint8 m2m_wifi_set_battery_voltage(uint16 u16BattVoltx100) +{ + sint8 ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, (uint8*)&strM2mBattVol,sizeof(tstrM2mBatteryVoltage), NULL, 0, 0); + return ret; +} +/*! +@fn sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESE for success and a negative value otherwise. +*/ +sint8 m2m_wifi_prng_get_random_bytes(uint8 * pu8PrngBuff,uint16 u16PrngSize) +{ + sint8 ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)))&&(pu8PrngBuff != NULL)) + { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_PRNG|M2M_REQ_DATA_PKT,(uint8 *)&strRng, sizeof(tstrPrng),NULL,0, 0); + } + else + { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\n",u16PrngSize); + } + return ret; +} +#ifdef ETH_MODE +/*! +@fn \ + NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +NMI_API sint8 m2m_wifi_enable_mac_mcast(uint8* pu8MulticastMacAddress, uint8 u8AddRemove) +{ + sint8 s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if(pu8MulticastMacAddress != NULL ) + { + strMulticastMac.u8AddRemove = u8AddRemove; + m2m_memcpy(strMulticastMac.au8macaddress,pu8MulticastMacAddress,M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n",strMulticastMac.au8macaddress[0],strMulticastMac.au8macaddress[1],strMulticastMac.au8macaddress[2],strMulticastMac.au8macaddress[3],strMulticastMac.au8macaddress[4],strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_MCAST, (uint8 *)&strMulticastMac,sizeof(tstrM2MMulticastMac),NULL,0,0); + } + + return s8ret; + +} + +/*! +@fn \ + NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen); + +@brief + set the ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_set_receive_buffer(void* pvBuffer,uint16 u16BufferLen) +{ + sint8 s8ret = M2M_SUCCESS; + if(pvBuffer != NULL) + { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize= u16BufferLen; + } + else + { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} +#endif + +/*! +@fn \ + NMI_API sint8 m2m_wifi_ble_api_send(const uint8* const msg, const uint32 len); + +@brief + Send an encapsulated Atmel BLE API message + +@param [in] msg + Pointer to the Atmel BLE API message raw bytes +@param [in] len + Length of the msg + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +NMI_API sint8 m2m_wifi_ble_api_send(uint8* msg, uint32 len) +{ + tstrM2mBleApiMsg bleTx; + bleTx.u16Len = len; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_BLE_API_SEND | M2M_REQ_DATA_PKT, + (uint8*)&bleTx, sizeof(tstrM2mBleApiMsg), msg, len, sizeof(tstrM2mBleApiMsg)); +} diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.c new file mode 100644 index 0000000..7a6c4a6 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.c @@ -0,0 +1,741 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 ASIC specific internal APIs. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmasic.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32)X[1+Y]<<8) + ((uint32)X[2+Y]<<16) +((uint32)X[3+Y]<<24)) + + + + +#define TIMEOUT (2000) +#define M2M_DISABLE_PS 0xD0UL + +/* Assume initially we're dealing with D0 - we will try other addresses if this + * fails - the addresses are as follows: + * 0x13 - for D0 + * 0x0F - for B0 + * 0x0E - for A0 + */ +static uint32 clk_status_reg_adr = 0x13; + +sint8 chip_apply_conf(uint32 u32Conf) +{ + sint8 ret = M2M_SUCCESS; + uint32 val32 = u32Conf; + +#ifdef __ENABLE_PMU__ + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if(val32 != 0) { + uint32 reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if(ret == M2M_SUCCESS) { + if(reg == val32) + break; + } + } else { + break; + } + } while(1); + + return M2M_SUCCESS; +} +/** +* @fn nm_clkless_wake +* @brief Wakeup the chip using clockless registers +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 06 June 2014 +* @version 1.0 +*/ +sint8 nm_clkless_wake(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg, clk_status_reg,trials = 0; + uint32 keeptrying = 200; + /* wait 1ms, spi data read */ + nm_bsp_sleep(1); + ret = nm_read_reg_with_ret(0x1, ®); + if(ret != M2M_SUCCESS) { + M2M_ERR("Bus error (1). Wake up failed\n"); + return ret; + } + + /* + * At this point, I am not sure whether it is B0 or A0 + * If B0, then clks_enabled bit exists in register 0xf + * If A0, then clks_enabled bit exists in register 0xe + */ + do + { + /* Set bit 1 */ + nm_write_reg(0x1, reg | (1 << 1)); + + // Search for the correct (clock status) register address + do + { + if (keeptrying) --keeptrying; + + /* wait 1ms, spi data read */ + nm_bsp_sleep(1); + ret = nm_read_reg_with_ret(clk_status_reg_adr, &clk_status_reg); + if (ret != M2M_SUCCESS || (ret == M2M_SUCCESS && clk_status_reg == 0)) { + switch (clk_status_reg_adr) { + case 0x13: clk_status_reg_adr = 0x0F; break; + case 0x0F: clk_status_reg_adr = 0x0E; break; + default: clk_status_reg_adr = 0x00; break; + } + } + else + break; // we have found the correct register, break out of the search + } while (clk_status_reg_adr && keeptrying); + + if (0 == clk_status_reg_adr) { + M2M_ERR("Bus error (2). Wake up failed\n"); + return ret; + } + + // in case of clocks off, wait 2ms, and check it again. + // if still off, wait for another 2ms, for a total wait of 6ms. + // If still off, redo the wake up sequence + trials = 0; + while( ((clk_status_reg & 0x4) == 0) && (((++trials) %3) == 0) && keeptrying) + { + --keeptrying; + + /* Wait for the chip to stabilize*/ + nm_bsp_sleep(2); + + // Make sure chip is awake. This is an extra step that can be removed + // later to avoid the bus access overhead + nm_read_reg_with_ret(clk_status_reg_adr, &clk_status_reg); + + if ((clk_status_reg & 0x4) == 0) + { + M2M_ERR("clocks still OFF. Wake up failed\n"); + } + } + // in case of failure, Reset the wakeup bit to introduce a new edge on the next loop + if((clk_status_reg & 0x4) == 0) + { + // Reset bit 0 + nm_write_reg(0x1, reg | (1 << 1)); + } + } while((clk_status_reg & 0x4) == 0 && keeptrying); + + if (!keeptrying) + { + M2M_ERR("Wake up failed - out of retries\n"); + ret = M2M_ERR_INIT; + } + + return ret; +} +void chip_idle(void) +{ + uint32 reg =0; + nm_read_reg_with_ret(0x1, ®); + if(reg&0x2) + { + reg &=~(1 << 1); + nm_write_reg(0x1, reg); + } +} + +void enable_rf_blocks(void) +{ + nm_write_reg(0x6, 0xdb); + nm_write_reg(0x7, 0x6); + nm_bsp_sleep(10); + nm_write_reg(0x1480, 0); + nm_write_reg(0x1484, 0); + nm_bsp_sleep(10); + + nm_write_reg(0x6, 0x0); + nm_write_reg(0x7, 0x0); +} + +sint8 enable_interrupts(void) +{ + uint32 reg; + sint8 ret; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32) 1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32) 1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + return M2M_SUCCESS; +} + +sint8 cpu_start(void) { + uint32 reg; + sint8 ret; + + /** + reset regs + */ + nm_write_reg(BOOTROM_REG,0); + nm_write_reg(NMI_STATE_REG,0); + nm_write_reg(NMI_REV_REG,0); + + /** + Go... + **/ + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret = nm_write_reg(0x150014, 0x1); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + return ret; +} + +uint32 nmi_get_chipid(void) +{ + static uint32 chipid = 0; + + if (chipid == 0) { + uint32 rfrevid; + + if((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if(chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if(chipid == 0x1002b0) { + if(rfrevid == 3) { /* 1002B0 */ + } else if(rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if(chipid == 0x1000f0) { + /* For 3400, the WiFi chip ID register reads 0x1000f0. + * Therefore using BT chip ID register here which should read 0x3000D0 + */ +#define rBT_CHIP_ID_REG (0x3b0000) + if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if(chipid == 0x3000d0) { + if(rfrevid == 6) { + chipid = 0x3000d1; + } + else if(rfrevid == 2) { + chipid = 0x3000d2; + } + } + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if(chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if((chipid & 0xf00000) == 0x300000) { + if(flashid == 0x1440ef) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } + } else { + if(flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if(flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } + } +#else + /*M2M is by default have SPI flash*/ + if((chipid & 0xf00000) == 0x300000) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } else { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32 nmi_get_rfrevid(void) +{ + uint32 rfrevid; + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + return 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if(REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32 pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); + +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32 val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} +sint8 chip_wake(void) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_clkless_wake(); + if(ret != M2M_SUCCESS) return ret; + +// enable_rf_blocks(); MERGEBUG: TEMPORARILY DISABLING + + return ret; +} +sint8 chip_reset_and_cpu_halt(void) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0; + + ret = chip_wake(); + if(ret != M2M_SUCCESS) { + return ret; + } + chip_reset(); + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } +#if 0 + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); +#endif + nm_write_reg(BOOTROM_REG,0); + nm_write_reg(NMI_STATE_REG,0); + nm_write_reg(NMI_REV_REG,0); + nm_write_reg(NMI_PIN_MUX_0, 0x11111000); + return ret; +} +sint8 chip_reset(void) +{ + sint8 ret = M2M_SUCCESS; + +#if 0 + // MERGEBUG: TODO: This causes serial trace from the chip to be garbled - investigate +#ifndef CONF_WINC_USE_UART + nmi_set_sys_clk_src_to_xo(); +#endif +#endif + + ret += nm_write_reg(NMI_GLB_RESET_0, 0); + nm_bsp_sleep(50); +#ifndef CONF_WINC_USE_UART + restore_pmu_settings_after_global_reset(); +#endif + return ret; +} + +sint8 wait_for_bootrom(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + + reg = 0; + while(1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_bsp_sleep(1); /* TODO: Why bus error if this delay is not here. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if(reg == 0) + { + reg = 0; + while(reg != M2M_FINISH_BOOT_ROM) + { + nm_bsp_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if(++cnt > TIMEOUT) + { + M2M_DBG("failed to load firmware from flash.\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if(2 == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + } else { + /*bypass this step*/ + } + + if(REV(nmi_get_chipid()) == REV_3A0) + { + chip_apply_conf(rHAVE_USE_PMU_BIT); + } + else + { + chip_apply_conf(0); + } + + nm_write_reg(BOOTROM_REG,M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +sint8 wait_for_firmware_start(uint8 arg) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0, cnt = 0; + volatile uint32 regAddress = NMI_STATE_REG; + volatile uint32 checkValue = M2M_FINISH_INIT_STATE; + + if(2 == arg) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) + { + nm_bsp_sleep(2); /* TODO: Why bus error if this delay is not here. */ + M2M_DBG("%x %x %x\n",(unsigned int)nm_read_reg(0x108c),(unsigned int)nm_read_reg(0x108c),(unsigned int)nm_read_reg(0x14A0)); + if (nm_read_reg_with_ret(regAddress, ®) != M2M_SUCCESS) + { + // ensure reg != checkValue + reg = !checkValue; + } + if(++cnt > TIMEOUT) + { + M2M_DBG("Time out for wait firmware Run\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if(M2M_FINISH_INIT_STATE == checkValue) + { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +sint8 chip_deinit(void) +{ + uint32 reg = 0; + sint8 ret; + uint8 timeout = 10; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\n"); + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while writing reg\n"); + return ret; + } + + do { + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while reading reg\n"); + return ret; + } + /*Workaround to ensure that the chip is actually reset*/ + if ((reg & (1 << 10))) { + M2M_DBG("Bit 10 not reset retry %d\n", timeout); + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + timeout--; + } else { + break; + } + + } while (timeout); + + return ret; +} + +#ifdef CONF_PERIPH + +sint8 set_gpio_dir(uint8 gpio, uint8 dir) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +sint8 set_gpio_val(uint8 gpio, uint8 val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +sint8 get_gpio_val(uint8 gpio, uint8* val) +{ + uint32 val32; + sint8 ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + *val = (uint8)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable) +{ + sint8 s8Ret; + uint32 val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if(s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\n"); + goto _EXIT; + } + if(enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if(s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} +#endif /* CONF_PERIPH */ + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if(!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\n"); + m2m_memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\n"); + u32RegValue >>=16; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + m2m_memcpy(pu8MacAddr,mac,6); + if(pu8IsValid) *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if(pu8IsValid) *pu8IsValid = 0; + return ret; +} + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr) +{ + sint8 ret; + uint32 u32RegValue; + uint8 mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &=0x0000ffff; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + m2m_memcpy(pu8MacAddr, mac, 6); + + return ret; + +_EXIT_ERR: + return ret; +} diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.h new file mode 100644 index 0000000..ca32b3a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmasic.h @@ -0,0 +1,141 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 ASIC specific internal APIs. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "common/include/nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define CHIP_ID_3000D (0x3000D0) + +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) (((id & 0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) (((id & 0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3400(id) (((id & 0xfff0f000) == 0x300000) ? 1 : 0) +#define REV(id) ( ((id) & 0x00000fff ) ) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) + +typedef struct{ + uint32 u32Mac_efuse_mib; + uint32 u32Firmware_Ota_rev; +}tstrGpRegs; + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_clkless_wake +* @brief Wakeup the chip using clockless registers +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +*/ +sint8 nm_clkless_wake(void); + +sint8 chip_wake(void); + +void chip_idle(void); + +void enable_rf_blocks(void); + +sint8 enable_interrupts(void); + +sint8 cpu_start(void); + +uint32 nmi_get_chipid(void); + +uint32 nmi_get_rfrevid(void); + +void restore_pmu_settings_after_global_reset(void); + +void nmi_update_pll(void); + +void nmi_set_sys_clk_src_to_xo(void); + +sint8 chip_reset(void); + +sint8 wait_for_bootrom(uint8); + +sint8 wait_for_firmware_start(uint8); + +sint8 chip_deinit(void); + +sint8 chip_reset_and_cpu_halt(void); + +sint8 set_gpio_dir(uint8 gpio, uint8 dir); + +sint8 set_gpio_val(uint8 gpio, uint8 val); + +sint8 get_gpio_val(uint8 gpio, uint8* val); + +sint8 pullup_ctrl(uint32 pinmask, uint8 enable); + +sint8 nmi_get_otp_mac_address(uint8 *pu8MacAddr, uint8 * pu8IsValid); + +sint8 nmi_get_mac_address(uint8 *pu8MacAddr); + +sint8 chip_apply_conf(uint32 u32conf); + +#ifdef __cplusplus + } + #endif + +#endif /*_NMASIC_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.c new file mode 100644 index 0000000..fbecaac --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.c @@ -0,0 +1,275 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef CORTUS_APP + +#include "nmbus.h" +#include "nmi2c.h" +#include "nmspi.h" +#include "nmuart.h" + +#define MAX_TRX_CFG_SZ 8 + +/** +* @fn nm_bus_iface_init +* @brief Initialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_bus_iface_init(uint8 *pvInitVal, uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal, req_serial_number); + + return ret; +} + +/** +* @fn nm_bus_iface_deinit +* @brief Deinitialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 07 April 2014 +* @version 1.0 +*/ +sint8 nm_bus_iface_deinit(void) +{ + sint8 ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** +* @fn nm_bus_iface_reconfigure +* @brief reconfigure bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Viswanathan Murugesan +* @date 22 Oct 2014 +* @version 1.0 +*/ +sint8 nm_bus_iface_reconfigure(void *ptr) +{ + sint8 ret = M2M_SUCCESS; +#ifdef CONF_WINC_USE_UART + if(ptr) + ret = nm_uart_reconfigure(ptr); + else + ret = M2M_ERR_BUS_FAIL; +#endif + return ret; +} +/* +* @fn nm_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_read_reg(uint32 u32Addr) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg(u32Addr); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_reg(u32Addr); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_reg(u32Addr); +#else +#error "Plesae define bus usage" +#endif + +} + +/* +* @fn nm_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_reg_with_ret(u32Addr,pu32RetVal); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_reg_with_ret(u32Addr,pu32RetVal); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_reg_with_ret(u32Addr,pu32RetVal); +#else +#error "Plesae define bus usage" +#endif +} + +/* +* @fn nm_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_reg(u32Addr,u32Val); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_write_reg(u32Addr,u32Val); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_write_reg(u32Addr,u32Val); +#else +#error "Plesae define bus usage" +#endif +} + +static inline sint8 p_nm_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_read_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_read_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_read_block(u32Addr,puBuf,u16Sz); +#else +#error "Plesae define bus usage" +#endif + +} +/* +* @fn nm_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u32Sz +* Number of bytes to read. The buffer size must be >= u32Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } + else + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static inline sint8 p_nm_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ +#ifdef CONF_WINC_USE_UART + return nm_uart_write_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_SPI) + return nm_spi_write_block(u32Addr,puBuf,u16Sz); +#elif defined (CONF_WINC_USE_I2C) + return nm_i2c_write_block(u32Addr,puBuf,u16Sz); +#else +#error "Plesae define bus usage" +#endif + +} +/** +* @fn nm_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u32Sz +* Number of bytes to write. The buffer size must be >= u32Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz) +{ + uint16 u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32 off = 0; + sint8 s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16)u32Sz); + break; + } + else + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +#endif + diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.h new file mode 100644 index 0000000..44d1159 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmbus.h @@ -0,0 +1,132 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + + + +#ifdef __cplusplus +extern "C"{ +#endif +/** +* @fn nm_bus_iface_init +* @brief Initialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_init(uint8 *pvInitVal, uint32 req_serial_number); + + +/** +* @fn nm_bus_iface_deinit +* @brief Deinitialize bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_deinit(void); + +/** +* @fn nm_bus_iface_reconfigure +* @brief reconfigure bus interface +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_bus_iface_reconfigure(void *ptr); + +/** +* @fn nm_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_read_reg(uint32 u32Addr); + +/** +* @fn nm_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u32Sz +* Number of bytes to read. The buffer size must be >= u32Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_read_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + +/** +* @fn nm_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u32Sz +* Number of bytes to write. The buffer size must be >= u32Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_write_block(uint32 u32Addr, uint8 *puBuf, uint32 u32Sz); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.c new file mode 100644 index 0000000..a6afce4 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.c @@ -0,0 +1,416 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 M2M driver APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" +#include "driver/source/nmbus.h" +#include "bsp/include/nm_bsp.h" +#include "driver/source/nmdrv.h" +#include "driver/source/nmasic.h" +#include "driver/include/m2m_types.h" + +#ifdef CONF_WINC_USE_SPI +#include "driver/source/nmspi.h" +#endif + +/** +* @fn nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +* @brief Get Hif info of images in both partitions (Firmware and Ota). +* @param [out] pu16FwHifInfo +* Pointer holding Hif info of image in the active partition. +* @param [out] pu16OtaHifInfo +* Pointer holding Hif info of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo) +{ + sint8 ret = M2M_SUCCESS; + uint32 reg = 0; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + if(ret == M2M_SUCCESS) + { + if(pu16FwHifInfo != NULL) + { + *pu16FwHifInfo = (uint16)reg; + } + if(pu16OtaHifInfo) + { + *pu16OtaHifInfo = (uint16)(reg>>16); + } + } + return ret; +} +/** +* @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters +* @version 1.0 +*/ +sint8 nm_get_firmware_full_info(tstrM2mRev* pstrRev) +{ + uint16 fw_hif_info = 0; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev)); + nm_get_hif_info(&fw_hif_info, NULL); + + M2M_INFO("Fw HIF: %04x\n", fw_hif_info); + if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("Firmware HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("Firmware ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("Firmware Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(fw_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent Firmware Version\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_ERR("Unknown Firmware Version\n"); + } + return ret; +} +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] M2mRev +* pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +* @version 1.0 +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +{ + uint16 ota_hif_info = 0; + uint32 reg = 0; + sint8 ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + m2m_memset((uint8*)pstrRev,0,sizeof(tstrM2mRev)); + nm_get_hif_info(NULL, &ota_hif_info); + + M2M_INFO("Ota HIF: %04x\n", ota_hif_info); + if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)&strgp,sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000,(uint8*)pstrRev,sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("OTA HIF (%u) : %u.%u \n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("OTA ver : %u.%u.%u \n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("OTA Build %s Time %s\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(ota_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent OTA Version\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_INFO("No valid Ota image\n"); + } + return ret; +} + +/* +* @fn nm_drv_init_download_mode +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Generic argument +* @author Viswanathan Murugesan +* @date 10 Oct 2014 +* @version 1.0 +*/ +sint8 nm_drv_init_download_mode(uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL, req_serial_number); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + + +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300,0); + +ERR1: + return ret; +} + +sint8 nm_drv_init_hold(uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL, req_serial_number); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + + ret = chip_wake(); + nm_bsp_sleep(10); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\n"); + goto ERR2; + } + /** + Go... + + **/ + //JFM 2021-02-07 + //chip_reset disbled because it failed. Probably because not RTC installed on the board + //retry when available... + +// ret = chip_reset(); +// if (M2M_SUCCESS != ret) { +// goto ERR2; +// } + + + + + M2M_INFO("Chip ID %lx\n", nmi_get_chipid()); +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); +#endif + /*return power save to default value*/ + chip_idle(); + + return ret; +ERR2: + nm_bus_iface_deinit(); +ERR1: + return ret; +} + +sint8 nm_drv_init_start(void * arg) +{ + sint8 ret = M2M_SUCCESS; + uint8 u8Mode = M2M_WIFI_MODE_NORMAL; + + if(NULL != arg) { + if(M2M_WIFI_MODE_CONFIG == *((uint8 *)arg)) { + u8Mode = M2M_WIFI_MODE_CONFIG; + } else { + /*continue running*/ + } + } else { + /*continue running*/ + } + + ret = cpu_start(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if(M2M_WIFI_MODE_CONFIG == u8Mode) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\n"); + goto ERR2; + } + + return ret; +ERR2: + nm_bus_iface_deinit(); +#ifdef CONF_WINC_USE_SPI + nm_spi_deinit(); +#endif +ERR1: + return ret; +} + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg - Generic argument passed on to nm_drv_init_start +* @author M. Abdelmawla +* @date 15 July 2012 +* @version 1.0 +*/ +sint8 nm_drv_init(void * arg, uint32 req_serial_number) +{ + sint8 ret = M2M_SUCCESS; + + ret = nm_drv_init_hold(req_serial_number); + + if(ret == M2M_SUCCESS) + ret = nm_drv_init_start(arg); + + return ret; +} + +/* +* @fn nm_drv_deinit +* @brief Deinitialize NMC1000 driver +* @author M. Abdelmawla +* @date 17 July 2012 +* @version 1.0 +*/ +sint8 nm_drv_deinit(void * arg) +{ + sint8 ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\n"); + goto ERR1; + } +#ifdef CONF_WINC_USE_SPI + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); +#endif + +ERR1: + return ret; +} + + +/** +* @fn nm_cpu_start(void) +* @brief Start CPU from the WINC module +* @return ZERO in case of success and Negative error code in case of failure +*/ + +sint8 nm_cpu_start(void) +{ + sint8 ret; + + ret = cpu_start(); + return ret; +} \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.h new file mode 100644 index 0000000..089c222 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmdrv.h @@ -0,0 +1,147 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 M2M driver APIs declarations. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "common/include/nm_common.h" + +/** +* @struct tstrM2mRev +* @brief Structure holding firmware version parameters and build date/time +*/ +typedef struct { + uint16 u16FirmwareHifInfo; /* Fw HIF Info */ + uint8 u8FirmwareMajor; /* Version Major Number */ + uint8 u8FirmwareRsvd; /* Reserved */ + uint8 u8FirmwareMinor; /* Version Minor */ + uint8 u8FirmwarePatch; /* Patch Number */ + uint8 BuildDate[sizeof(__DATE__)]; // 12 bytes + uint8 BuildTime[sizeof(__TIME__)]; // 9 bytes +} tstrM2mRev; + +#ifdef __cplusplus + extern "C" { + #endif +/** +* @fn nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +* @brief Get Hif info of images in both partitions (Firmware and Ota). +* @param [out] pu16FwHifInfo +* Pointer holding Hif info of image in the active partition. +* @param [out] pu16OtaHifInfo +* Pointer holding Hif info of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_hif_info(uint16 *pu16FwHifInfo, uint16 *pu16OtaHifInfo); +/** +* @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] pstrRev +* Pointer holds address of structure @ref tstrM2mRev that contains the version parameters +* of image in the active partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_firmware_full_info(tstrM2mRev* pstrRev); +/** +* @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) +* @brief Get Firmware version info +* @param [out] pstrRev +* Pointer holds address of structure @ref tstrM2mRev that contains the version parameters +* of image in the inactive partition. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_get_ota_firmware_info(tstrM2mRev* pstrRev); +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_download_mode(uint32 req_serial_number); + +/* +* @fn nm_drv_init +* @brief Initialize NMC1000 driver +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg - Generic argument passed on to nm_drv_init_start +* @param [in] req_serial_number +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init(void * arg, uint32 req_serial_number); + +/* +* @fn nm_drv_init_hold +* @brief First part of nm_drv_init, up to the point of initializing spi for flash access. +* @see nm_drv_init +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] req_serial_number +* Parameter inherited from nm_drv_init +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_hold(uint32 req_serial_number); + +/* +* @fn nm_drv_init_start +* @brief Second part of nm_drv_init, continuing from where nm_drv_init_hold left off. +* @see nm_drv_init +* @return M2M_SUCCESS in case of success and Negative error code in case of failure +* @param [in] arg +* Parameter inherited from nm_drv_init +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_init_start(void * arg); + +/** +* @fn nm_drv_deinit +* @brief Deinitialize NMC1000 driver +* @author M. Abdelmawla +* @param [in] arg - Generic argument unused. +* @return ZERO in case of success and Negative error code in case of failure +*/ +sint8 nm_drv_deinit(void * arg); + +/** +* @fn nm_cpu_start(void) +* @brief Start CPU from the WINC module +* @return ZERO in case of success and Negative error code in case of failure +*/ + +sint8 nm_cpu_start(void); + +#ifdef __cplusplus + } + #endif + +#endif /*_NMDRV_H_*/ + + diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.c new file mode 100644 index 0000000..726b857 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.c @@ -0,0 +1,873 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "driver/include/m2m_flash.h" +#include "driver/source/nmflash.h" +#include "spi_flash/include/spi_flash.h" +#include "nmdrv.h" +//#include "main.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static uint32 gu32LocationId = MEM_ID_NONE; +static uint8 *gpu8Location = NULL; + +uint16 gu16LastAccessId = 0; +uint8 gu8Success = 0; +uint8 gu8Changed = 0; +uint8 gu8Init = 0; +uint8 gu8Reset = 0; + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static sint8 winc_flash_compare(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size) +{ + sint8 ret = M2M_SUCCESS; + uint8 buf[128]; + uint32 offset = 0; + + while (offset < u32Size) + { + uint32 chunk_sz = sizeof(buf); + if (chunk_sz > u32Size - offset) + chunk_sz = u32Size - offset; + ret = spi_flash_read(buf, u32Offset + offset, chunk_sz); + if (ret != M2M_SUCCESS) + break; + ret = m2m_memcmp(buf, pu8Buf + offset, chunk_sz); + if (ret != 0) + break; + offset += chunk_sz; + } + return ret; +} + +sint8 winc_flash_write_verify(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size) +{ + sint8 ret = M2M_ERR_FAIL; + uint8 count = 20; + + while ((ret != M2M_SUCCESS) && (count-- > 0)) + { + ret = spi_flash_write(pu8Buf, u32Offset, u32Size); + if (ret == M2M_SUCCESS) + ret = winc_flash_compare(pu8Buf, u32Offset, u32Size); + } + return ret; +} +static sint8 set_changed_flag(tstrFlashAccessPersistent *pstrPersistentInfo) +{ + sint8 ret = FLASH_RETURN_OK; + if (pstrPersistentInfo->u8ModeFlags & FLASH_MODE_FLAGS_UNCHANGED) + { + pstrPersistentInfo->u8ModeFlags &= ~FLASH_MODE_FLAGS_UNCHANGED; + if (winc_flash_write_verify((uint8*)pstrPersistentInfo, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)) == M2M_SUCCESS) + gu8Changed = 1; + else + ret = FLASH_ERR_WINC_ACCESS; + } + return ret; +} + +static uint8 crc7(uint8 crc, const uint8 *buff, uint16 len) +{ + uint8 reg = crc; + uint16 i; + for(i = 0; i < len; i++) + { + uint16 g; + for(g = 0; g < 8; g++) + { + uint8 inv = (((buff[i] << g) & 0x80) >> 7) ^ ((reg >> 6) & 1); + reg = ((reg << 1) & 0x7f) ^ (9 * inv); + } + } + return reg; +} +static sint8 read_control_sector(tstrOtaControlSec *pstrControlSec, uint32 u32Offset) +{ + sint8 s8Ret = spi_flash_read((uint8*)pstrControlSec, u32Offset, sizeof(tstrOtaControlSec)); + if (s8Ret == M2M_SUCCESS) + { + if (pstrControlSec->u32OtaMagicValue != OTA_MAGIC_VALUE) + s8Ret = M2M_ERR_FAIL; + if (pstrControlSec->u32OtaControlSecCrc != crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4)) + s8Ret = M2M_ERR_FAIL; + } + return s8Ret; +} +static sint8 update_control_sector(tstrOtaControlSec *pstrControlSec) +{ + sint8 ret = M2M_ERR_FAIL; + + ret = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if (ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8*)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if (ret == M2M_SUCCESS) + { + ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if (ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8*)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8*)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + } + return ret; +} +static sint8 access_control_sector(tenuCSOp enuOp, uint32 *param) +{ + static tstrOtaControlSec strControlSec = {0}; + sint8 s8Ret = M2M_SUCCESS; + uint8 bUpdate = false; + + if ((enuOp != CS_INITIALIZE) && (strControlSec.u32OtaMagicValue != OTA_MAGIC_VALUE)) + { + if (param != NULL) + *param = 0; + return M2M_ERR_FAIL; + } + + switch (enuOp) + { + case CS_INITIALIZE: + s8Ret = read_control_sector(&strControlSec, M2M_CONTROL_FLASH_OFFSET); + if (s8Ret != M2M_SUCCESS) + { + s8Ret = read_control_sector(&strControlSec, M2M_BACKUP_FLASH_OFFSET); + if (s8Ret == M2M_SUCCESS) + { + /* + * Reinstate the control sector from backup. + */ + s8Ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if (s8Ret == M2M_SUCCESS) + s8Ret = winc_flash_write_verify((uint8*)&strControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + break; + case CS_INVALIDATE_RB: + // Update trashes the backup sector, so we need to avoid unnecessary updates. + if (strControlSec.u32OtaRollbackImageValidStatus != OTA_STATUS_INVALID) + { + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_INVALID; + bUpdate = true; + } + break; + case CS_VALIDATE_RB: + // Update trashes the backup sector, so we need to avoid unnecessary updates. + if (strControlSec.u32OtaRollbackImageValidStatus != OTA_STATUS_VALID) + { + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_VALID; + bUpdate = true; + } + break; + case CS_VALIDATE_SWITCH: + strControlSec.u32OtaRollbackImageValidStatus = OTA_STATUS_VALID; + // intentional fallthrough. + case CS_SWITCH: + if (strControlSec.u32OtaRollbackImageValidStatus == OTA_STATUS_VALID) + { + uint32 tmp = strControlSec.u32OtaCurrentworkingImagOffset; + strControlSec.u32OtaCurrentworkingImagOffset = strControlSec.u32OtaRollbackImageOffset; + strControlSec.u32OtaRollbackImageOffset = tmp; + bUpdate = true; + } + else + s8Ret = M2M_ERR_FAIL; + break; + case CS_GET_ACTIVE: + if (param == NULL) + s8Ret = M2M_ERR_FAIL; + else + *param = strControlSec.u32OtaCurrentworkingImagOffset; + break; + case CS_GET_INACTIVE: + if (param == NULL) + s8Ret = M2M_ERR_FAIL; + else + *param = strControlSec.u32OtaRollbackImageOffset; + break; + case CS_DEINITIALIZE: + m2m_memset((uint8*)&strControlSec, 0, sizeof(tstrOtaControlSec)); + break; + default: + s8Ret = M2M_ERR_FAIL; + } + if (bUpdate) + { + s8Ret = update_control_sector(&strControlSec); + M2M_INFO("CS update:%d %s\n", enuOp, (s8Ret==M2M_SUCCESS)?"":"Failed"); + } + return s8Ret; +} +static sint8 local_access_ptr(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + sint8 s8Ret = M2M_ERR_FAIL; + static uint8 *pu8Location = NULL; + static uint8 u8Flags = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + u8Flags = init_params->u8Flags; + pu8Location = gpu8Location; + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_DATA: + if (pu8Location != NULL) + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + if (u8Flags & FLASH_FN_FLAGS_WRITE) + m2m_memcpy(pu8Location, params->pu8Buf + params->u32DataOffset, params->u32DataSize); + if (u8Flags & FLASH_FN_FLAGS_READ) + m2m_memcpy(params->pu8Buf + params->u32DataOffset, pu8Location, params->u32DataSize); + pu8Location += params->u32DataSize; + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + u8Flags = 0; + pu8Location = NULL; + s8Ret = M2M_SUCCESS; + break; + } + return s8Ret; +} +static sint8 winc_flash_access(tenuFlashDataFnCtl enuCtl, void *pvStr) +{ + sint8 s8Ret = M2M_ERR_FAIL; + static uint32 u32CurrentAddr = 0; + static uint8 u8Flags = 0; + + switch (enuCtl) + { + case FLASH_DATA_FN_INITIALIZE: + { + tstrDataAccessInitParams *init_params = (tstrDataAccessInitParams*)pvStr; + printf("FA Init: 0x%lx Fg 0x%02x Sz 0x%lx \n", gu32LocationId, init_params->u8Flags, init_params->u32TotalSize); + u8Flags = init_params->u8Flags; + switch (gu32LocationId) + { + case MEM_ID_WINC_FLASH: + u32CurrentAddr = 0; + break; + case MEM_ID_WINC_ACTIVE: + s8Ret = access_control_sector(CS_GET_ACTIVE, &u32CurrentAddr); + break; + case MEM_ID_WINC_INACTIVE: + s8Ret = access_control_sector(CS_GET_INACTIVE, &u32CurrentAddr); + /* If we're about to write to the inactive partition, mark it as invalid. */ + if ((s8Ret == M2M_SUCCESS) && (u8Flags & (FLASH_FN_FLAGS_WRITE | FLASH_FN_FLAGS_ERASE))) + s8Ret = access_control_sector(CS_INVALIDATE_RB, NULL); + break; + case MEM_ID_NONE: + s8Ret = M2M_ERR_FAIL; + break; + default: + u32CurrentAddr = gu32LocationId; + break; + } + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + { + init_params->u32AlignmentSize = FLASH_SECTOR_SZ; + init_params->u32StartAlignment = u32CurrentAddr & (FLASH_SECTOR_SZ - 1); + } + s8Ret = M2M_SUCCESS; + } + break; + case FLASH_DATA_FN_DATA: + { + tstrDataAccessParams *params = (tstrDataAccessParams*)pvStr; + if (u8Flags & FLASH_FN_FLAGS_COMPARE_BEFORE) + { + printf("c-"); + // If contents match already, return success + s8Ret = winc_flash_compare(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret == M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + { + uint32 prefill_sz = params->u32DataOffset; + uint32 postfill_sz = params->u32BufSize - (params->u32DataOffset + params->u32DataSize); + if (prefill_sz > 0) + { + printf("r-"); + s8Ret = spi_flash_read(params->pu8Buf, u32CurrentAddr - prefill_sz, prefill_sz); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (postfill_sz > 0) + { + printf("-r"); + s8Ret = spi_flash_read(params->pu8Buf + params->u32BufSize - postfill_sz, u32CurrentAddr + params->u32DataSize, postfill_sz); + if (s8Ret != M2M_SUCCESS) + goto END; + } + } + if (u8Flags & FLASH_FN_FLAGS_BACKUP) + { + if (params->u32BufSize > params->u32DataSize) + { + printf("b"); + s8Ret = winc_flash_write_verify(params->pu8Buf, M2M_BACKUP_FLASH_OFFSET, params->u32BufSize); + if (s8Ret == M2M_SUCCESS) + s8Ret = prepare_backup(u32CurrentAddr - params->u32DataOffset); + if (s8Ret != M2M_SUCCESS) + goto END; + } + } + if (u8Flags & FLASH_FN_FLAGS_ERASE) + { + printf("e"); + s8Ret = spi_flash_erase(u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_WRITE) + { + printf("W"); + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + s8Ret = spi_flash_write(params->pu8Buf, u32CurrentAddr - params->u32DataOffset, params->u32BufSize); + else + s8Ret = spi_flash_write(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_COMPARE_AFTER) + { + printf("-c"); + // If contents do not match, return failure + if (u8Flags & FLASH_FN_FLAGS_READ_SURROUNDING) + s8Ret = winc_flash_compare(params->pu8Buf, u32CurrentAddr - params->u32DataOffset, params->u32BufSize); + else + s8Ret = winc_flash_compare(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } + if (u8Flags & FLASH_FN_FLAGS_READ) + { + printf("R"); + s8Ret = spi_flash_read(params->pu8Buf + params->u32DataOffset, u32CurrentAddr, params->u32DataSize); + if (s8Ret != M2M_SUCCESS) + goto END; + } +END: + u32CurrentAddr += params->u32DataSize; + } + break; + case FLASH_DATA_FN_TERMINATE: + case FLASH_DATA_FN_COMPLETE: + printf(" FA End 0x%lx\n", u32CurrentAddr); + u8Flags = 0; + u32CurrentAddr = 0; + s8Ret = M2M_SUCCESS; + break; + } + return s8Ret; +} + +void set_internal_info_ptr(tpfDataAccessFn *ppfFn, uint8 *pu8Ptr) +{ + if (ppfFn != NULL) + *ppfFn = local_access_ptr; + gpu8Location = pu8Ptr; +} +void set_internal_info(tpfDataAccessFn *ppfFn, uint32 u32LocationId) +{ + if (ppfFn != NULL) + *ppfFn = winc_flash_access; + gu32LocationId = u32LocationId; +} +uint8 is_internal_info(tpfDataAccessFn pfFn) +{ + if (pfFn == winc_flash_access) + return true; + return false; +} +sint8 recover_backup(void) +{ + sint8 ret = FLASH_RETURN_OK; + uint32 u32BackupAddr = FLASH_BACKUP_STORE_OFFSET; + tstrBackup strBackup; + + while (u32BackupAddr < FLASH_BACKUP_STORE_OFFSET + FLASH_BACKUP_STORE_SZ) + { + sint8 status = spi_flash_read((uint8*)&strBackup, u32BackupAddr, sizeof(tstrBackup)); + if ((status == M2M_SUCCESS) && (strBackup.enuTransferStatus == BACKUP_STATUS_ACTIVE)) + { + uint8 *pu8Buff = malloc(strBackup.u32Size); + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto ERR; + } + status = spi_flash_read(pu8Buff, strBackup.u32SourceAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + status = spi_flash_erase(strBackup.u32DestinationAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + status = winc_flash_write_verify(pu8Buff, strBackup.u32DestinationAddr, strBackup.u32Size); + if (status == M2M_SUCCESS) + { + strBackup.enuTransferStatus = BACKUP_STATUS_DONE; + status = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + } + } + } + free(pu8Buff); + } + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + u32BackupAddr += sizeof(tstrBackup); + } +ERR: + return ret; +} +sint8 prepare_backup(uint32 u32Target) +{ + sint8 s8Ret = M2M_ERR_FAIL; + uint32 u32BackupAddr = FLASH_BACKUP_STORE_OFFSET; + tenuBackupStatus enuStatus = BACKUP_STATUS_EMPTY; + + s8Ret = spi_flash_read((uint8*)&enuStatus, u32BackupAddr, sizeof(enuStatus)); + if ((s8Ret != M2M_SUCCESS) || (enuStatus != BACKUP_STATUS_EMPTY)) + { + u32BackupAddr += sizeof(tstrBackup); + s8Ret = spi_flash_read((uint8*)&enuStatus, u32BackupAddr, sizeof(enuStatus)); + if ((s8Ret == M2M_SUCCESS) && (enuStatus != BACKUP_STATUS_EMPTY)) + s8Ret = M2M_ERR_FAIL; + } + if (s8Ret == M2M_SUCCESS) + { + tstrBackup strBackup = {BACKUP_STATUS_NOT_ACTIVE, u32Target, M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ}; + s8Ret = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = winc_flash_write_verify((uint8*)&strBackup, u32BackupAddr, sizeof(strBackup)); + if (s8Ret == M2M_SUCCESS) + { + strBackup.enuTransferStatus = BACKUP_STATUS_ACTIVE; + s8Ret = winc_flash_write_verify((uint8*)&strBackup.enuTransferStatus, u32BackupAddr, FLASH_BACKUP_STA_SZ); + } + } + } + return s8Ret; +} +sint8 image_get_target(uint8 *pu8Target) +{ + sint8 s8Ret = M2M_ERR_FAIL; + uint32 u32OffsetActive = 0; + uint32 u32OffsetInactive = 0; + + s8Ret = access_control_sector(CS_INITIALIZE, NULL); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = access_control_sector(CS_GET_ACTIVE, &u32OffsetActive); + if (s8Ret == M2M_SUCCESS) + { + s8Ret = access_control_sector(CS_GET_INACTIVE, &u32OffsetInactive); + if (s8Ret == M2M_SUCCESS) + *pu8Target = (u32OffsetInactive > u32OffsetActive) ? 1 : 0; + } + access_control_sector(CS_DEINITIALIZE, NULL); + } + return s8Ret; +} +sint8 rootcert_get_size(tstrRootCertEntryHeader *pstrHdr, uint16 *pu16Size) +{ + sint8 s8Ret = M2M_ERR_FAIL; + if ((pstrHdr == NULL) || (pu16Size == NULL)) + goto ERR; + + /* Set default size out to maximum. */ + *pu16Size = 0xFFFF; + switch (pstrHdr->strPubKey.u32PubKeyType) + { + case ROOT_CERT_PUBKEY_RSA: + if (pstrHdr->strPubKey.strRsaKeyInfo.u16NSz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + if (pstrHdr->strPubKey.strRsaKeyInfo.u16ESz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + *pu16Size = sizeof(tstrRootCertEntryHeader) + ((pstrHdr->strPubKey.strRsaKeyInfo.u16NSz + 0x3) & ~0x3) + ((pstrHdr->strPubKey.strRsaKeyInfo.u16ESz + 0x3) & ~0x3); + s8Ret = M2M_SUCCESS; + break; + case ROOT_CERT_PUBKEY_ECDSA: + if (pstrHdr->strPubKey.strEcsdaKeyInfo.u16KeySz > M2M_TLS_ROOTCER_FLASH_SZ) + goto ERR; + *pu16Size = sizeof(tstrRootCertEntryHeader) + ((pstrHdr->strPubKey.strEcsdaKeyInfo.u16KeySz + 0x3) & ~0x3) * 2; + s8Ret = M2M_SUCCESS; + break; + case 0xFFFFFFFF: + // Invalid. May indicate end of list. Fail with size set to 0. + *pu16Size = 0; + break; + default: + // Corrupt header. + break; + } +ERR: + return s8Ret; +} +sint8 rootcert_access(tenuFlashAccessItemMode enuMode, tstrRootCertEntryHeader *pstrReferenceHdr, uint16 *pu16EntrySize, uint8 *pu8Buff, uint32 *pu32Offset) +{ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_SUCCESS; + uint8 au8RootCertSig[] = M2M_TLS_ROOTCER_FLASH_SIG; + tstrRootCertEntryHeader strEntryHeader; + /* Previous version used 0-identifiers to indicate removed entries. Use last 20 bytes of pu8Buff to help us check for them. */ + uint8 *pu8Zero = pu8Buff + M2M_TLS_ROOTCER_FLASH_SZ - sizeof(pstrReferenceHdr->au8SHA1NameHash); + uint32 u32StoreOffset = 0; + uint32 u32Entries = 0; + + m2m_memset(pu8Zero, 0, sizeof(pstrReferenceHdr->au8SHA1NameHash)); + /* Use pu8SectionBuffer to read signature. */ + status = spi_flash_read(pu8Buff, M2M_TLS_ROOTCER_FLASH_OFFSET, sizeof(au8RootCertSig)); + if ((status != M2M_SUCCESS) || m2m_memcmp(pu8Buff, au8RootCertSig, sizeof(au8RootCertSig))) + { + /* + * Root certificate section is not initialized. We could try to initialize it + * here, but for now just fail. + */ + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + + /* + * By default assume we'll get to the end of the flash store without finding what we need + * (matching entry or space to add new entry). If we break while loop before reaching end of + * store then we'll change ret accordingly. */ + if (enuMode == FLASH_ITEM_ADD) + ret = FLASH_ERR_SIZE; + else + ret = FLASH_ERR_WINC_CONFLICT; + + u32StoreOffset = *pu32Offset = sizeof(tstrRootCertFlashHeader); + while (u32StoreOffset + sizeof(tstrRootCertEntryHeader) < M2M_TLS_ROOTCER_FLASH_SZ) + { + uint16 u16EntrySize = 0; + status = spi_flash_read((uint8*)&strEntryHeader, M2M_TLS_ROOTCER_FLASH_OFFSET + u32StoreOffset, sizeof(tstrRootCertEntryHeader)); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + status = rootcert_get_size(&strEntryHeader, &u16EntrySize); + if (status != M2M_SUCCESS) + { + // Found the end of the list. We are done. If we are adding an entry, check the space here. + if ((enuMode == FLASH_ITEM_ADD) && ((*pu32Offset + *pu16EntrySize) <= M2M_TLS_ROOTCER_FLASH_SZ)) + { + u32Entries++; + ret = FLASH_RETURN_OK; + } + break; + } + + // If we are here we know that u32EntrySize is sane. + if (m2m_memcmp(pu8Zero, (uint8*)pstrReferenceHdr, sizeof(strEntryHeader.au8SHA1NameHash))) + { + // Entry is not empty. + status = spi_flash_read(pu8Buff + *pu32Offset, M2M_TLS_ROOTCER_FLASH_OFFSET + u32StoreOffset, u16EntrySize); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + break; + } + if (enuMode == FLASH_ITEM_READIDX) + { + if (u32Entries == *(uint32*)pstrReferenceHdr) + { + // Found entry. pu16EntrySize is used to output size. + *pu16EntrySize = u16EntrySize; + ret = FLASH_RETURN_OK; + break; + } + } + else if (!m2m_memcmp(strEntryHeader.au8SHA1NameHash, (uint8*)pstrReferenceHdr, sizeof(strEntryHeader.au8SHA1NameHash))) + { + if (enuMode == FLASH_ITEM_ADD) + { + // Found a match. Cannot add. + ret = FLASH_ERR_WINC_CONFLICT; + break; + } + if (enuMode == FLASH_ITEM_READ) + { + // Found a match. pu16EntrySize is used to output size. + *pu16EntrySize = u16EntrySize; + ret = FLASH_RETURN_OK; + break; + } + if (enuMode == FLASH_ITEM_REMOVE) + { + // Found a match. Continue, to complete entry count. + ret = FLASH_RETURN_OK; + // Cancel out increment of u32BuffOffset. + *pu32Offset -= u16EntrySize; + } + } + *pu32Offset += u16EntrySize; + u32Entries++; + } + u32StoreOffset += u16EntrySize; + } + if (ret == FLASH_RETURN_OK) + ((tstrRootCertFlashHeader*)pu8Buff)->u32nCerts = u32Entries; +ERR: + return ret; +} + +sint8 transfer_run(tstrFlashAccess *pstrFlashAccess) +{ + /* + * Errors before start of first transfer will be reported as parameter errors. + * This means the information is insufficient to allow us to begin. + */ + sint8 ret = FLASH_RETURN_OK; + sint8 status = M2M_ERR_FAIL; + + tpfDataAccessFn pfWriteFn = pstrFlashAccess->pfDestinationFn; + tpfDataAccessFn pfReadFn = pstrFlashAccess->pfSourceFn; + tstrDataAccessInitParams read_init_params = {pstrFlashAccess->u32Size, FLASH_FN_FLAGS_READ, 0, 0}; + tstrDataAccessInitParams write_init_params = {pstrFlashAccess->u32Size, FLASH_FN_FLAGS_WRITE, 0, 0}; + uint32 u32BytesTransferred = 0; + uint32 u32BytesRemaining = pstrFlashAccess->u32Size; + uint8 *pu8Buff = NULL; + + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_COMPARE_BEFORE) + write_init_params.u8Flags |= FLASH_FN_FLAGS_COMPARE_BEFORE; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_ERASE_FIRST) + { + write_init_params.u8Flags |= FLASH_FN_FLAGS_ERASE; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_KEEP_SURROUNDING) + { + write_init_params.u8Flags |= FLASH_FN_FLAGS_READ_SURROUNDING; + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_USE_BACKUP) + write_init_params.u8Flags |= FLASH_FN_FLAGS_BACKUP; + } + } + if (pstrFlashAccess->strPersistentInfo.u8AccessFlags & FLASH_ACCESS_OPTION_COMPARE_AFTER) + write_init_params.u8Flags |= FLASH_FN_FLAGS_COMPARE_AFTER; + + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_DATA_IN_BACKUP) + { + if (prepare_backup(gu32LocationId) != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + set_changed_flag(&pstrFlashAccess->strPersistentInfo); + ret = recover_backup(); + if (ret < 0) + goto ERR; + } + /* + * Initialize control sector. Even if we don't need to access it, this at + * least ensures that the control sector is not relying on the flash backup sector. + */ + status = access_control_sector(CS_INITIALIZE, NULL); + if (status != M2M_SUCCESS && (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS)) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + + if (pfReadFn != NULL) + { + /* Prepare for read. */ + + status = pfReadFn(FLASH_DATA_FN_INITIALIZE, &read_init_params); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfReadFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + pfReadFn(FLASH_DATA_FN_TERMINATE, NULL); + goto ERR; + } + } + if (pfWriteFn != NULL) + { + /* Prepare for write. */ + status = pfWriteFn(FLASH_DATA_FN_INITIALIZE, &write_init_params); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfWriteFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + goto TERMINATE; + } + } + if (u32BytesRemaining > 0) + { + if (u32BytesRemaining > FLASH_SECTOR_SIZE) + pu8Buff = malloc(FLASH_SECTOR_SIZE); + else if (write_init_params.u32AlignmentSize > 1) + pu8Buff = malloc(write_init_params.u32AlignmentSize); + else + pu8Buff = malloc(u32BytesRemaining); + if (pu8Buff == NULL) + { + ret = FLASH_ERR_INTERNAL; + goto TERMINATE; + } + } + + while (u32BytesRemaining > 0) + { + tstrDataAccessParams params = {pu8Buff, FLASH_SECTOR_SIZE, 0, FLASH_SECTOR_SIZE}; + + if (u32BytesTransferred > 0) + write_init_params.u32StartAlignment = 0; + if (write_init_params.u32AlignmentSize > 1) + { + params.u32DataOffset = write_init_params.u32StartAlignment & (write_init_params.u32AlignmentSize-1); + params.u32DataSize = write_init_params.u32AlignmentSize - params.u32DataOffset; + } + + if (params.u32DataSize > u32BytesRemaining) + params.u32DataSize = u32BytesRemaining; + + /* Read. */ + if (pfReadFn != NULL) + { + status = pfReadFn(FLASH_DATA_FN_DATA, ¶ms); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfReadFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + break; + } + } + + /* Write. */ + if (pfWriteFn != NULL) + { + if (is_internal_info(pfWriteFn)) + { + ret = set_changed_flag(&pstrFlashAccess->strPersistentInfo); + if (ret < 0) + break; + } + status = pfWriteFn(FLASH_DATA_FN_DATA, ¶ms); + if (status != M2M_SUCCESS) + { + if (is_internal_info(pfWriteFn)) + ret = FLASH_ERR_WINC_ACCESS; + else + ret = FLASH_ERR_LOCAL_ACCESS; + break; + } + } + + u32BytesTransferred += params.u32DataSize; + u32BytesRemaining -= params.u32DataSize; + } + + if (u32BytesRemaining > 0) + { +TERMINATE: + if (pfReadFn != NULL) + pfReadFn(FLASH_DATA_FN_TERMINATE, NULL); + if (pfWriteFn != NULL) + pfWriteFn(FLASH_DATA_FN_TERMINATE, NULL); + goto ERR; + } + else + { + if (pfReadFn != NULL) + pfReadFn(FLASH_DATA_FN_COMPLETE, NULL); + if (pfWriteFn != NULL) + pfWriteFn(FLASH_DATA_FN_COMPLETE, NULL); + } + + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & (FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE | FLASH_MODE_FLAGS_CS_SWITCH)) + { + tenuCSOp enuOp; + ret = set_changed_flag(&pstrFlashAccess->strPersistentInfo); + if (ret < 0) + goto ERR; + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE) + { + if (pstrFlashAccess->strPersistentInfo.u8ModeFlags & FLASH_MODE_FLAGS_CS_SWITCH) + enuOp = CS_VALIDATE_SWITCH; + else + enuOp = CS_VALIDATE_RB; + } + else + enuOp = CS_SWITCH; + status = access_control_sector(enuOp, NULL); + if (status != M2M_SUCCESS) + { + ret = FLASH_ERR_WINC_ACCESS; + goto ERR; + } + } + + pstrFlashAccess->strPersistentInfo.enuTransferStatus = FLASH_STATUS_DONE; + status = winc_flash_write_verify((uint8*)pstrFlashAccess, HOST_CONTROL_FLASH_OFFSET, sizeof(tstrFlashAccessPersistent)); + gu8Success = 1; +ERR: + if (pu8Buff != NULL) + free(pu8Buff); + access_control_sector(CS_DEINITIALIZE, NULL); + return ret; +} diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.h new file mode 100644 index 0000000..8dceaf9 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmflash.h @@ -0,0 +1,284 @@ +/** + * + * \file + * + * \brief WINC Flash Interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + + +#ifndef __NM_FLASH_H__ +#define __NM_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "common/include/nm_common.h" +#include "driver/include/m2m_types.h" + +#define FLASH_RETURN_OK 0 +#define FLASH_SECTOR_SIZE FLASH_SECTOR_SZ +#define FLASH_SIGNATURE HOST_CONTROL_FLASH_SIG +#define BACKUP_SIGNATURE 0x424b5550 + +#define FLASH_MODE_FLAGS_CS NBIT0 +#define FLASH_MODE_FLAGS_CS_SWITCH NBIT1 +#define FLASH_MODE_FLAGS_CS_SWITCH_TARGET NBIT2 +#define FLASH_MODE_FLAGS_CS_VALIDATE_IMAGE NBIT3 +#define FLASH_MODE_FLAGS_UNCHANGED NBIT4 +#define FLASH_MODE_FLAGS_DATA_IN_BACKUP NBIT5 + +/*! Bit 0 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Compare buffer against existing data, to avoid unnecessary operation. */ +#define FLASH_FN_FLAGS_COMPARE_BEFORE NBIT0 +/*! Bit 1 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Fill uninitialized portion of buffer with existing data to avoid losing it in subsequent erase. + * Typically not set unless @ref FLASH_FN_FLAGS_ERASE is set. */ +#define FLASH_FN_FLAGS_READ_SURROUNDING NBIT1 +/*! Bit 2 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Save buffer to a backup persistent location in case of power loss after subsequent erase. + * A (persistent) record of the backup status must also be kept. + * Typically not set unless @ref FLASH_FN_FLAGS_READ_SURROUNDING and @ref FLASH_FN_FLAGS_ERASE are both set. */ +#define FLASH_FN_FLAGS_BACKUP NBIT2 +/*! Bit 3 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Erase existing data before writing. */ +#define FLASH_FN_FLAGS_ERASE NBIT3 +/*! Bit 4 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Write buffer. */ +#define FLASH_FN_FLAGS_WRITE NBIT4 +/*! Bit 5 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Compare buffer against written data, to provide verification. + * Typically not set unless @ref FLASH_FN_FLAGS_WRITE is set. */ +#define FLASH_FN_FLAGS_COMPARE_AFTER NBIT5 +/*! Bit 6 of u8Flags parameter of @ref tpfDataAccessFn.\n + * Read data to buffer. Typically this would be the only flag set, meaning read the existing data. + * However, if other flags are set, the read should be performed at the end. */ +#define FLASH_FN_FLAGS_READ NBIT6 + +/*! Bit 0 of u8AccessOptions parameter of various function APIs.\n + * Request to erase existing data before writing.\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_ERASE will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_ERASE_FIRST NBIT0 +/*! Bit 1 of u8AccessOptions parameter of various function APIs.\n + * When set with @ref FLASH_ACCESS_OPTION_ERASE_FIRST, this is a request to do + * read-modify-erase-write (eg if MCU application is storing received data in flash).\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_READ_SURROUNDING may be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_KEEP_SURROUNDING NBIT1 +/*! Bit 2 of u8AccessOptions parameter of various function APIs.\n + * When set with @ref FLASH_ACCESS_OPTION_ERASE_FIRST and @ref FLASH_ACCESS_OPTION_KEEP_SURROUNDING, + * this is a request to keep a persistent backup of modified contents during read-modify-erase-write.\n + * Only applies when module is providing data to the MCU application.\n + * If set, @ref FLASH_FN_FLAGS_BACKUP may be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_USE_BACKUP NBIT2 +/*! Bit 3 of u8AccessOptions parameter of various function APIs.\n + * Request to compare new data against existing data before erasing/writing, to avoid unnecessary operations.\n + * Applies to data transfer in either direction.\n + * If set, @ref FLASH_FN_FLAGS_COMPARE_BEFORE will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_COMPARE_BEFORE NBIT3 +/*! Bit 4 of u8AccessOptions parameter of various function APIs.\n + * Request for byte-wise verification of write.\n + * Applies to data transfer in either direction.\n + * If set, @ref FLASH_FN_FLAGS_COMPARE_AFTER will be set in subsequent call to function of type + * @ref tpfDataAccessFn. */ +#define FLASH_ACCESS_OPTION_COMPARE_AFTER NBIT4 +/*! When modifying WINC flash contents, the module determines most options internally. Only two + * options are taken from the u8AccessOptions parameter.\n + * When providing data to the MCU application, the module takes all options from the + * u8AccessOptions parameter. */ +#define FLASH_ACCESS_WINC_MASK (FLASH_ACCESS_OPTION_COMPARE_BEFORE | FLASH_ACCESS_OPTION_COMPARE_AFTER) + + +typedef enum { + CS_INITIALIZE, + CS_INVALIDATE_RB, + CS_VALIDATE_RB, + CS_SWITCH, + CS_VALIDATE_SWITCH, + CS_GET_ACTIVE, + CS_GET_INACTIVE, + CS_DEINITIALIZE +}tenuCSOp; + +typedef enum { + /* + * Status values arranged so that status can be updated without any erase operation. + */ + FLASH_STATUS_EMPTY = 0xFFFFFFFF, + FLASH_STATUS_NOT_ACTIVE = 0xFFFFFF00, + FLASH_STATUS_ACTIVE = 0xFFFF0000, + FLASH_STATUS_DONE = 0xFF000000 +}tenuFlashAccessStatus; + +typedef enum { + /* + * Status values arranged so that status can be updated without any erase operation. + */ + BACKUP_STATUS_EMPTY = 0xFFFFFFFF, + BACKUP_STATUS_NOT_ACTIVE = BACKUP_SIGNATURE | 0xFFFFFF00, + BACKUP_STATUS_ACTIVE = BACKUP_SIGNATURE, + BACKUP_STATUS_DONE = 0x00000000 +}tenuBackupStatus; + +typedef enum { + /* + * Special location ID values. If top bit is not set, the location ID is interpreted as flash address. + */ + MEM_ID_WINC_FLASH = 0x80000000, + MEM_ID_WINC_ACTIVE, + MEM_ID_WINC_INACTIVE, + MEM_ID_NONE = 0xFFFFFFFF +}tenuMemId; + +/*! +@enum tenuFlashAccessItemMode + +@brief Transfer modes available for accessing items in WINC flash stores such as TLS root + certificate store. +@see m2m_flash_rootcert_access + */ +typedef enum { + /*! Add an item to the relevant WINC flash store. */ + FLASH_ITEM_ADD, + /*! Remove an item from the relevant WINC flash store. */ + FLASH_ITEM_REMOVE, + /*! Read an item from the relevant WINC flash store, using an identifier. */ + FLASH_ITEM_READ, + /*! Read an item from the relevant WINC flash store, using an index. */ + FLASH_ITEM_READIDX +}tenuFlashAccessItemMode; + + +typedef struct { + uint32 u32Signature; + tenuFlashAccessStatus enuTransferStatus; + uint16 u16AppId; + uint8 u8AccessFlags; // These correspond bitwise to application access options. + uint8 u8ModeFlags; // These are set internally, with reference to application mode options. +}tstrFlashAccessPersistent; +#define FLASH_SIG_SZ (sizeof(uint32)) +#define FLASH_STA_SZ (sizeof(tenuFlashAccessStatus)) +#define FLASH_SIG_STA_SZ (FLASH_SIG_SZ+FLASH_STA_SZ) + +typedef struct { + tstrFlashAccessPersistent strPersistentInfo; + tpfDataAccessFn pfDestinationFn; + tpfDataAccessFn pfSourceFn; + uint32 u32Size; +}tstrFlashAccess; + +typedef struct { + tenuBackupStatus enuTransferStatus; + uint32 u32DestinationAddr; + uint32 u32SourceAddr; + uint32 u32Size; +}tstrBackup; +#define FLASH_BACKUP_STA_SZ sizeof(tenuBackupStatus) +#define FLASH_BACKUP_STORE_SZ (2*sizeof(tstrBackup)) +#define FLASH_BACKUP_STORE_OFFSET (HOST_CONTROL_FLASH_OFFSET + HOST_CONTROL_FLASH_SZ - FLASH_BACKUP_STORE_SZ) + +/*! +@struct \ + tstrDataAccessInitParams +@brief + This structure contains parameters for initializing a local data access (read, erase or write). + +@see tpfDataAccessFn. +@see FLASH_FN_FLAGS_COMPARE_BEFORE +@see FLASH_FN_FLAGS_READ_SURROUNDING +@see FLASH_FN_FLAGS_BACKUP +@see FLASH_FN_FLAGS_ERASE +@see FLASH_FN_FLAGS_WRITE +@see FLASH_FN_FLAGS_COMPARE_AFTER +@see FLASH_FN_FLAGS_READ + */ +typedef struct { + /*! Total size of data to be accessed in data location. \n + * This field is set by the module in a call to @ref tpfDataAccessFn. */ + uint32 u32TotalSize; + /*! Flags indicating type of data access. \n + * This field is set by the module in a call to @ref tpfDataAccessFn. */ + uint8 u8Flags; + /*! Block size, to assist with alignment. \n + * This field can be set by the local memory access function @ref tpfDataAccessFn. Defaults to 0 if not set. + * Recommended values are:\n + * - 4096 if accessing flash memory with erase block size <= 4096.\n + * - 0 if accessing normal memory. */ + uint32 u32AlignmentSize; + /*! Offset of access start address, relative to u32AlignmentSize. \n + * This field can be set by the local memory access function @ref tpfDataAccessFn. The field is ignored if u32AlignmentSize < 2. */ + uint32 u32StartAlignment; +}tstrDataAccessInitParams; + +/*! +@struct \ + tstrDataAccessParams +@brief + This structure contains data for local data access (read, erase or write). +@see tpfDataAccessFn. + */ +typedef struct { + /*! Buffer to be written to or read from. */ + uint8 *pu8Buf; + /*! Total size of the buffer. */ + uint32 u32BufSize; + /* Offset of data within the buffer. */ + uint32 u32DataOffset; + /* Size of data to be written or read. */ + uint32 u32DataSize; +}tstrDataAccessParams; + +extern uint16 gu16LastAccessId; +extern uint8 gu8Success; +extern uint8 gu8Changed; +extern uint8 gu8Init; +extern uint8 gu8Reset; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +sint8 winc_flash_write_verify(uint8 *pu8Buf, uint32 u32Offset, uint32 u32Size); +void set_internal_info(tpfDataAccessFn *ppfFn, uint32 u32LocationId); +void set_internal_info_ptr(tpfDataAccessFn *ppfFn, uint8 *pu8Ptr); +uint8 is_internal_info(tpfDataAccessFn pfFn); +sint8 recover_backup(void); +sint8 prepare_backup(uint32 u32Target); +sint8 image_get_target(uint8 *pu8Target); +sint8 rootcert_get_size(tstrRootCertEntryHeader *pstrHdr, uint16 *pu16Size); +sint8 rootcert_access(tenuFlashAccessItemMode enuMode, tstrRootCertEntryHeader *pstrReferenceHdr, uint16 *pu16EntrySize, uint8 *pu8Buff, uint32 *pu32Offset); +sint8 transfer_run(tstrFlashAccess *pstrFlashAccess); + + +#endif /* __NM_FLASH_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.c new file mode 100644 index 0000000..dcde7ae --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.c @@ -0,0 +1,262 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 I2C protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_I2C + +#include "nmi2c.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + + +/* +* @fn nm_i2c_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ + sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ + uint8 b[6]; + uint8 rsz; + tstrNmI2cDefault strI2c; + sint8 s8Ret = M2M_SUCCESS; + + if(u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x09; + b[1] = (uint8)(u32Addr); + rsz = 1; + strI2c.u16Sz = 2; + } else { + b[0] = 0x80; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)(u32Addr); + b[5] = 0x04; + rsz = 4; + strI2c.u16Sz = 6; + } + + strI2c.pu8Buf = b; + + if(M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + strI2c.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) + { + //M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + if (rsz == 1) { + *pu32RetVal = b[0]; + } else { + *pu32RetVal = b[0] | ((uint32)b[1] << 8) | ((uint32)b[2] << 16) | ((uint32)b[3] << 24); + } + return s8Ret; +} + +/* +* @fn nm_i2c_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_i2c_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_i2c_read_reg_with_ret(u32Addr, &val); + return val; +} + +/* +* @fn nm_i2c_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmI2cDefault strI2c; + uint8 b[16]; + sint8 s8Ret = M2M_SUCCESS; + + if(u32Addr < 0xff) { /* clockless i2c */ + b[0] = 0x19; + b[1] = (uint8)(u32Addr); + b[2] = (uint8)(u32Val); + strI2c.u16Sz = 3; + } else { + b[0] = 0x90; + b[1] = (uint8)(u32Addr >> 24); + b[2] = (uint8)(u32Addr >> 16); + b[3] = (uint8)(u32Addr >> 8); + b[4] = (uint8)u32Addr; + b[5] = 0x04; + b[6] = (uint8)u32Val; + b[7] = (uint8)(u32Val >> 8); + b[8] = (uint8)(u32Val >> 16); + b[9] = (uint8)(u32Val >> 24); + strI2c.u16Sz = 10; + } + + strI2c.pu8Buf = b; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +/* +* @fn nm_i2c_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmI2cDefault strI2c; + uint8 au8Buf[7]; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x02; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr >> 0); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf = au8Buf; + strI2c.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + strI2c.pu8Buf = pu8Buf; + strI2c.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strI2c)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + + return s8Ret; +} + +/* +* @fn nm_i2c_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + uint8 au8Buf[7]; + tstrNmI2cSpecial strI2c; + sint8 s8Ret = M2M_SUCCESS; + + au8Buf[0] = 0x12; + au8Buf[1] = (uint8)(u32Addr >> 24); + au8Buf[2] = (uint8)(u32Addr >> 16); + au8Buf[3] = (uint8)(u32Addr >> 8); + au8Buf[4] = (uint8)(u32Addr); + au8Buf[5] = (uint8)(u16Sz >> 8); + au8Buf[6] = (uint8)(u16Sz); + + strI2c.pu8Buf1 = au8Buf; + strI2c.pu8Buf2 = pu8Buf; + strI2c.u16Sz1 = sizeof(au8Buf); + strI2c.u16Sz2 = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W_SPECIAL, &strI2c)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + return s8Ret; +} + +#endif +/* EOF */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.h new file mode 100644 index 0000000..a9048cc --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmi2c.h @@ -0,0 +1,97 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 I2C protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMI2C_H_ +#define _NMI2C_H_ + +#include "common/include/nm_common.h" + +/** +* @fn nm_i2c_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_i2c_read_reg(uint32 u32Addr); + +/** +* @fn nm_i2c_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_i2c_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_i2c_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_i2c_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_i2c_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#endif /* _NMI2C_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.c new file mode 100644 index 0000000..43150b3 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.c @@ -0,0 +1,910 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 SPI protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_SPI + +#define USE_OLD_SPI_SW + +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "nmspi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +//#define CMD_DMA_WRITE 0xc1 +//#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +//#define CMD_TERMINATE 0xc5 +//#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 0 +#define N_FAIL -1 +#define N_RESET -2 +#define N_RETRY -3 + + +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8 gu8Crc_off = 0; +#if (defined __SAMG55J19__) || (defined __SAM4SD32C__) || (defined __SAME70Q21__) || (defined __SAME70Q21B__) +static sint8 nmi_spi_read(uint8* b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = NULL; + spi.pu8OutBuf = b; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_write(uint8* b, uint16 sz) +{ + tstrNmSpiRw spi; + spi.pu8InBuf = b; + spi.pu8OutBuf = NULL; + spi.u16Sz = sz; + return nm_bus_ioctl(NM_BUS_IOCTL_RW, &spi); +} + +static sint8 nmi_spi_writeread(uint8* bw, uint8* br, uint16 sz) +{ + nmi_spi_write(bw, sz); + return nmi_spi_read(br, sz); +} +#else +static inline sint8 nmi_spi_read(uint8* b, uint16 sz) +{ + return nm_spi_rw(NULL, b, sz); +} +static inline sint8 nmi_spi_write(uint8* b, uint16 sz) +{ + return nm_spi_rw(b, NULL, sz); +} +static sint8 nmi_spi_writeread(uint8* bw, uint8* br, uint16 sz) +{ + return nm_spi_rw(bw, br, sz); +} +#endif +/******************************************** + + Crc7 + +********************************************/ + +static const uint8 crc7_syndrome_table[256] = { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, + 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, + 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, + 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, + 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, + 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, + 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, + 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, + 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, + 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, + 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, + 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, + 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, + 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, + 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, + 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, + 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, + 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, + 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, + 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, + 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, + 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, + 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, + 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, + 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, + 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, + 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, + 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, + 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 +}; + + +static inline uint8 crc7_byte(uint8 crc, uint8 data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static inline uint8 crc7(uint8 crc, const uint8 *buffer, uint32 len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + +/******************************************** + + Spi protocol Function + +********************************************/ + +static sint8 spi_cmd(uint8 cmd, uint32 adr, uint32 u32data, uint32 sz,uint8 clockless) +{ + uint8 bc[9]; + uint8 len = 5; + sint8 result = N_OK; + + bc[0] = cmd; + switch (cmd) { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + len = 5; + break; + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8)adr; + bc[3] = 0x00; + len = 5; + break; +#if defined(CMD_TERMINATE) + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif +#if defined(CMD_REPEAT) + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; +#if defined(CMD_DMA_WRITE) || defined(CMD_DMA_READ) + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 8); + bc[5] = (uint8)(sz); + len = 7; + break; +#endif + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)adr; + bc[4] = (uint8)(sz >> 16); + bc[5] = (uint8)(sz >> 8); + bc[6] = (uint8)(sz); + len = 8; + break; + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8)(adr); + bc[3] = (uint8)(u32data >> 24); + bc[4] = (uint8)(u32data >> 16); + bc[5] = (uint8)(u32data >> 8); + bc[6] = (uint8)(u32data); + len = 8; + break; + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8)(adr >> 16); + bc[2] = (uint8)(adr >> 8); + bc[3] = (uint8)(adr); + bc[4] = (uint8)(u32data >> 24); + bc[5] = (uint8)(u32data >> 16); + bc[6] = (uint8)(u32data >> 8); + bc[7] = (uint8)(u32data); + len = 9; + break; + default: + result = N_FAIL; + break; + } + + if (result == N_OK) { + if (!gu8Crc_off) + bc[len-1] = (crc7(0x7f, (const uint8 *)&bc[0], len-1)) << 1; + else + len-=1; + + if (M2M_SUCCESS != nmi_spi_write(bc, len)) { + M2M_ERR("[nmi spi]: Failed cmd write, bus error...\n"); + result = N_FAIL; + } + } + + return result; +} + +static sint8 spi_cmd_rsp(uint8 cmd) +{ + uint8 rsp; + sint8 result = N_OK; + sint8 s8RetryCnt; + + /** + Command/Control response + **/ +#if defined(CMD_TERMINATE) + if (cmd == CMD_TERMINATE) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } +#endif +#if defined(CMD_REPEAT) + if (cmd == CMD_REPEAT) { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + result = N_FAIL; + goto _fail_; + } + } +#endif + + /* wait for response */ + s8RetryCnt = 10; + do + { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while((rsp != cmd) && (s8RetryCnt-- >0)); + if (s8RetryCnt < 0) + { + M2M_ERR("[nmi spi]: Failed cmd response read\n"); + result = N_FAIL; + goto _fail_; + } + /** + State response + **/ + /* wait for response */ + s8RetryCnt = 10; + do + { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed cmd response read, bus error...\n"); + result = N_FAIL; + goto _fail_; + } + } while((rsp != 0x00) && (s8RetryCnt-- >0)); + if (s8RetryCnt < 0) + { + M2M_ERR("[nmi spi]: Failed cmd response read\n"); + result = N_FAIL; + goto _fail_; + } +_fail_: + + return result; +} + +static sint8 spi_reset(void) +{ + M2M_INFO("Reset Spi\n"); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + + if (spi_cmd_rsp(CMD_RESET) != N_OK) { + // Reset command failed, need to send repeated 1's until reset occurs + // TODO This catchall reset code has not yet been tested. + uint8 w_buf[8] = {0xFF}; + uint8 r_buf[8]; + M2M_ERR("[nmi spi]: Failed rst cmd response\n"); + nmi_spi_writeread(w_buf, r_buf, 8); + if (r_buf[7] != 0xFF) + { + M2M_ERR("[nmi spi]: Failed repeated reset\n"); + return N_FAIL; + } + } + // TODO: May need to call spi_init() here + return N_OK; +} + +static sint8 spi_data_read(uint8 *b, uint16 sz,uint8 clockless) +{ + sint16 retry, ix, nbytes; + sint8 result = N_OK; + uint8 crc[2]; + uint8 rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Response header + **/ + retry = 10; + do { + if (M2M_SUCCESS != nmi_spi_read(&rsp, 1)) { + M2M_ERR("[nmi spi]: Failed data response read, bus error...\n"); + result = N_FAIL; + break; + } + //if (((rsp >> 4) & 0xf) == 0xf) + if ((rsp & 0xf0) == 0xf0) + break; + } while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) { + M2M_ERR("[nmi spi]: Failed data response read...(%02x)\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (M2M_SUCCESS != nmi_spi_read(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block read, bus error...\n"); + result = N_FAIL; + break; + } + if(!clockless) + { + /** + Read Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_read(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc read, bus error...\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static sint8 spi_data_write(uint8 *b, uint16 sz) +{ + sint16 ix = 0; + uint16 nbytes; + sint8 result = N_OK; + uint8 cmd, order, crc[2] = {0}; + //uint8 rsp; + + /** + Data + **/ + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } else { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + cmd |= order; + if (M2M_SUCCESS != nmi_spi_write(&cmd, 1)) { + M2M_ERR("[nmi spi]: Failed data block cmd write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (M2M_SUCCESS != nmi_spi_write(&b[ix], nbytes)) { + M2M_ERR("[nmi spi]: Failed data block write, bus error...\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) { + if (M2M_SUCCESS != nmi_spi_write(crc, 2)) { + M2M_ERR("[nmi spi]: Failed data block crc write, bus error...\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } while (sz); + + + return result; +} + +/******************************************** + + Spi Internal Read/Write Function + +********************************************/ + +/******************************************** + + Spi interfaces + +********************************************/ + +/* +* @fn nm_spi_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_write_reg(uint32 addr, uint32 u32data) +{ + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_WRITE; + uint8 clockless = 0; + if (addr <= 0x30) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } + //else + //{ + // cmd = CMD_SINGLE_WRITE; + // clockless = 0; + //} + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write reg (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, write reg (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + return N_OK; +#else + + result = spi_cmd_complete(cmd, addr, (uint8*)&u32data, 4, clockless); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, write reg (%08x)...\n", addr); + } + + return result; + +#endif +} + + +/* +* @fn nm_spi_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_write_block(uint32 addr, uint8 *buf, uint16 size) +{ + sint8 result; + uint8 cmd = CMD_DMA_EXT_WRITE; + + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + + //Workaround hardware problem with single byte transfers over SPI bus + if (size == 1) + size = 2; + + result = spi_cmd(cmd, addr, 0, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, write block (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi ]: Failed cmd response, write block (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, NULL, size, 0); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, write block (%08x)...\n", addr); + return N_FAIL; + } +#endif + + /** + Data + **/ + result = spi_data_write(buf, size); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data write...\n"); + spi_reset(); + return N_FAIL; + } + + return N_OK; +} + +/* +* @fn nm_spi_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_read_reg_with_ret(uint32 addr, uint32 *u32data) +{ + sint8 result = N_OK; + uint8 cmd = CMD_SINGLE_READ; + uint8 tmp[4]; + uint8 clockless = 0; + + if (addr <= 0xff) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } + //else + //{ + // cmd = CMD_SINGLE_READ; + // clockless = 0; + //} + +#if defined USE_OLD_SPI_SW + result = spi_cmd(cmd, addr, 0, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read reg (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read reg (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + /* to avoid endianess issues */ + result = spi_data_read(tmp, 4, clockless); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed data read...\n"); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, (uint8*)&tmp[0], 4, clockless); + if (result != N_OK) { + M2M_ERR( "[nmi spi]: Failed cmd, read reg (%08x)...\n", addr); + return N_FAIL; + } + +#endif + + *u32data = tmp[0] | + ((uint32)tmp[1] << 8) | + ((uint32)tmp[2] << 16) | + ((uint32)tmp[3] << 24); + + return N_OK; +} + +/* +* @fn nm_spi_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_read_block(uint32 addr, uint8 *buf, uint16 size) +{ + uint8 cmd = CMD_DMA_EXT_READ; + sint8 result; + +#if defined USE_OLD_SPI_SW + uint8 tmp[2]; + uint8 single_byte_workaround = 0; +#endif + + /** + Command + **/ +#if defined USE_OLD_SPI_SW + if (size == 1) + { + //Workaround hardware problem with single byte transfers over SPI bus + size = 2; + single_byte_workaround = 1; + } + result = spi_cmd(cmd, addr, 0, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", (unsigned int)addr); + return N_FAIL; + } + + result = spi_cmd_rsp(cmd); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd response, read block (%08x)...\n", (unsigned int)addr); + spi_reset(); + return N_FAIL; + } + + /** + Data + **/ + if (single_byte_workaround) + { + result = spi_data_read(tmp, size,0); + buf[0] = tmp[0]; + } + else + result = spi_data_read(buf, size,0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed block data read...\n"); + spi_reset(); + return N_FAIL; + } +#else + result = spi_cmd_complete(cmd, addr, buf, size, 0); + if (result != N_OK) { + M2M_ERR("[nmi spi]: Failed cmd, read block (%08x)...\n", addr); + return N_FAIL; + } +#endif + + return N_OK; +} + +/******************************************** + + Bus interfaces + +********************************************/ + +static void spi_init_pkt_sz(void) +{ + uint32 val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE+0x24); + val32 &= ~(0x7 << 4); + switch(DATA_PKT_SZ) + { + case 256: val32 |= (0 << 4); break; + case 512: val32 |= (1 << 4); break; + case 1024: val32 |= (2 << 4); break; + case 2048: val32 |= (3 << 4); break; + case 4096: val32 |= (4 << 4); break; + case 8192: val32 |= (5 << 4); break; + + } + nm_spi_write_reg(SPI_BASE+0x24, val32); +} + +/* +* @fn nm_spi_init +* @brief Initialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +sint8 nm_spi_init(void) +{ + uint32 chipid; + uint32 reg =0; + + /** + configure protocol + **/ + gu8Crc_off = 0; + + // TODO: We can remove the CRC trials if there is a definite way to reset + // the SPI to it's initial value. + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nmi spi]: Failed internal read protocol with CRC on, retyring with CRC off...\n"); + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS){ + // Read failed with both CRC on and off, something went bad + M2M_ERR( "[nmi spi]: Failed internal read protocol...\n"); + return M2M_ERR_BUS_FAIL; + } + } + if(gu8Crc_off == 0) + { + reg &= ~0xc; /* disable crc checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + if (nm_spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg) != M2M_SUCCESS) { + M2M_ERR( "[nmi spi]: Failed internal write protocol reg...\n"); + return M2M_ERR_BUS_FAIL; + } + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (nm_spi_read_reg_with_ret(0x1000, &chipid) != M2M_SUCCESS) { + M2M_ERR("[nmi spi]: Fail cmd read chip id...\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nmi spi]: chipid (%08x)\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_init +* @brief DeInitialize the SPI +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Samer Sarhan +* @date 27 Feb 2015 +* @version 1.0 +*/ +sint8 nm_spi_deinit(void) +{ + gu8Crc_off = 0; + return M2M_SUCCESS; +} + +/* +* @fn nm_spi_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author M. Abdelmawla +* @date 11 July 2012 +* @version 1.0 +*/ +uint32 nm_spi_read_reg(uint32 u32Addr) +{ + uint32 u32Val; + + nm_spi_read_reg_with_ret(u32Addr, &u32Val); + + return u32Val; +} + +#endif diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.h new file mode 100644 index 0000000..740f581 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmspi.h @@ -0,0 +1,119 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 SPI protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "common/include/nm_common.h" + +#ifdef __cplusplus + extern "C" { +#endif + +/** +* @fn nm_spi_init +* @brief Initialize the SPI +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_init(void); + +/** +* @fn nm_spi_deinit +* @brief DeInitialize the SPI +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_deinit(void); + +/** +* @fn nm_spi_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_spi_read_reg(uint32 u32Addr); + +/** +* @fn nm_spi_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_spi_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_spi_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_spi_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_spi_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +#ifdef __cplusplus + } +#endif + +#endif /* _NMSPI_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.c b/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.c new file mode 100644 index 0000000..48ed613 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.c @@ -0,0 +1,585 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 UART protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#include "common/include/nm_common.h" + +#ifdef CONF_WINC_USE_UART + +#include "driver/source/nmuart.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" + +#define HDR_SZ 12 + +static uint8 get_cs(uint8* b, uint8 sz){ + int i; + uint8 cs = 0; + for(i = 0; i < sz; i++) + cs ^= b[i]; + return cs; +} + +/* +* @fn nm_uart_sync_cmd +* @brief Check COM Port +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_sync_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_ERR_BUS_FAIL; + uint8 b [HDR_SZ+1]; + uint8 onchip = 0; + int escape = 3; + + // send query char up to 3 times + while (escape-- && (s8Ret != M2M_SUCCESS)) + { + b[0] = 0x12; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + // then read back all chars in the buffer if any, is last char what we are looking for + s8Ret = nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart); + if (M2M_SUCCESS == s8Ret) + { + uint8 lastchar; + + // drain buffer + while (M2M_SUCCESS == s8Ret) + { + lastchar = b[0]; + s8Ret = nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart); + } + + switch (lastchar) + { + case 0x5a: + onchip = 1; + M2M_INFO("Built-in WINCxx00 UART Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x5b: + onchip = 0; + M2M_INFO("WINCxx00 Serial Bridge Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x5c: + onchip = 2; + M2M_INFO("WINCxx00 Serial Bridge + AT CMD app Found\n"); + s8Ret = M2M_SUCCESS; + break; + case 0x12: + M2M_INFO("failed to read Serial Bridge ID response\n"); + s8Ret = M2M_ERR_BUS_FAIL; + break; + default: + M2M_INFO("Non Serial Bridge Found\n"); + s8Ret = M2M_ERR_BUS_FAIL; + break; + } + } + else + { + M2M_ERR("failed to send Serial Bridge ID Query\n"); + } + } + + if(s8Ret == M2M_SUCCESS) + s8Ret = (sint8)onchip; + + return s8Ret; +} + +/* +* @fn nm_uart_reboot_cmd +* @brief Sends a command to the MCU to force reboot +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @version 1.0 +*/ + +sint8 nm_uart_reboot_cmd(void) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ + 1]; + uint8 rsz; + uint8 onchip = 0; + + /*read reg*/ + b[0] = 0x13; + + rsz = 1; + strUart.pu8Buf = b; + strUart.u16Sz = 1; + + if (M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("failed to send reboot cmd\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + return s8Ret; +} + + + sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b [HDR_SZ+1]; + uint8 rsz; + + /*read reg*/ + b[0] = 0xa5; + b[1] = 0; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + b[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + b[8] = (uint8)((u32Addr & 0xff000000)>>24); + b[9] = 0; + b[10] = 0; + b[11] = 0; + b[12] = 0; + + b[2] = get_cs(&b[1],HDR_SZ); + + rsz = 4; + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS == nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + if(!nm_bus_get_chip_type()) + { + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the command\n"); + strUart.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.u16Sz = rsz; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + else + { + M2M_ERR("failed to send cfg bytes\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + + *pu32RetVal = ((uint32)b[0] << 24) | ((uint32)b[1] << 16) | ((uint32)b[2] << 8) | b[3]; + + return s8Ret; +} + +/* +* @fn nm_uart_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +uint32 nm_uart_read_reg(uint32 u32Addr) +{ + uint32 val; + nm_uart_read_reg_with_ret(u32Addr , &val); + return val; +} + +/* +* @fn nm_uart_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ+1]; + + /*write reg*/ + b[0] = 0xa5; + b[1] = 1; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = (uint8)(u32Addr & 0x000000ff); + b[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + b[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + b[8] = (uint8)((u32Addr & 0xff000000)>>24); + b[9] = (uint8)(u32Val & 0x000000ff); + b[10] = (uint8)((u32Val & 0x0000ff00)>>8); + b[11] = (uint8)((u32Val & 0x00ff0000)>>16); + b[12] = (uint8)((u32Val & 0xff000000)>>24); + + b[2] = get_cs(&b[1],HDR_SZ); + + get_cs(&b[1],HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the reg write command\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + + +/** +* @fn nm_uart_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *pu8Buf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 au8Buf[HDR_SZ+1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 2; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00)>>8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000)>>24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1],HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the block read command\n"); + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + M2M_ERR("write error (Error sending the block read command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.pu8Buf = pu8Buf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + M2M_ERR("read error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} + +/** +* @fn nm_uart_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Dina El Sissy +* @date 13 AUG 2012 +* @version 1.0 +*/ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + static uint8 au8Buf[HDR_SZ+1]; + + au8Buf[0] = 0xa5; + au8Buf[1] = 3; + au8Buf[2] = 0; + au8Buf[3] = (uint8)(u16Sz & 0x00ff); + au8Buf[4] = (uint8)((u16Sz & 0xff00)>>8); + au8Buf[5] = (uint8)(u32Addr & 0x000000ff); + au8Buf[6] = (uint8)((u32Addr & 0x0000ff00)>>8); + au8Buf[7] = (uint8)((u32Addr & 0x00ff0000)>>16); + au8Buf[8] = (uint8)((u32Addr & 0xff000000)>>24); + au8Buf[9] = 0; + au8Buf[10] = 0; + au8Buf[11] = 0; + au8Buf[12] = 0; + + au8Buf[2] = get_cs(&au8Buf[1],HDR_SZ); + + strUart.pu8Buf = au8Buf; + strUart.u16Sz = sizeof(au8Buf); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the block Write command\n"); + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + //check for the ack from the SAMD21 for the payload reception. + strUart.pu8Buf = au8Buf; + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(au8Buf[0] == 0xAC) + { + M2M_DBG("Successfully sent the data payload\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + else + { + M2M_ERR("write error (Error sending the block write command)\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + else + { + strUart.pu8Buf = puBuf; + strUart.u16Sz = u16Sz; + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + return s8Ret; +} + +/** +* @fn nm_uart_reconfigure +* @brief Reconfigures the UART interface +* @param [in] ptr +* Pointer to a DWORD containing baudrate at this moment. +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @author Viswanathan Murugesan +* @date 22 OCT 2014 +* @version 1.0 +*/ +sint8 nm_uart_reconfigure(void *ptr) +{ + tstrNmUartDefault strUart; + sint8 s8Ret = M2M_SUCCESS; + uint8 b[HDR_SZ+1]; + + if (ptr == NULL) + { + M2M_ERR("port not open\n"); + return M2M_ERR_BUS_FAIL; + } + + /*write reg*/ + b[0] = 0xa5; + b[1] = 5; + b[2] = 0; + b[3] = 0; + b[4] = 0; + b[5] = 0; + b[6] = 0; + b[7] = 0; + b[8] = 0; + b[9] = (uint8)((*(unsigned long *)ptr) & 0x000000ff); + b[10] = (uint8)(((*(unsigned long *)ptr) & 0x0000ff00)>>8); + b[11] = (uint8)(((*(unsigned long *)ptr) & 0x00ff0000)>>16); + b[12] = (uint8)(((*(unsigned long *)ptr) & 0xff000000)>>24); + + b[2] = get_cs(&b[1],HDR_SZ); + + get_cs(&b[1],HDR_SZ); + + strUart.pu8Buf = b; + strUart.u16Sz = sizeof(b); + + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_W, &strUart)) + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + else + { + if(!nm_bus_get_chip_type()) + { + //check for the ack from the SAMD21 for the packet reception. + strUart.u16Sz = 1; + if(M2M_SUCCESS != nm_bus_ioctl(NM_BUS_IOCTL_R, &strUart)) + { + s8Ret = M2M_ERR_BUS_FAIL; + } + if(b[0] == 0xAC) + { + M2M_DBG("Successfully sent the UART reconfigure command\n"); + } + else + { + M2M_ERR("write error\n"); + s8Ret = M2M_ERR_BUS_FAIL; + } + } + } + + return s8Ret; +} +#endif +/* EOF */ diff --git a/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.h b/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.h new file mode 100644 index 0000000..2fdf9e5 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/driver/source/nmuart.h @@ -0,0 +1,119 @@ +/** + * + * \file + * + * \brief This module contains WINC3400 UART protocol bus APIs implementation. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef _NMUART_H_ +#define _NMUART_H_ + +#include "common/include/nm_common.h" + +/* +* @fn nm_uart_sync_cmd +* @brief Check COM Port +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_sync_cmd(void); +/** +* @fn nm_uart_read_reg +* @brief Read register +* @param [in] u32Addr +* Register address +* @return Register value +*/ +uint32 nm_uart_read_reg(uint32 u32Addr); + +/** +* @fn nm_uart_reboot_cmd +* @brief Sends a command to the MCU to force the reboot of the WINC +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +* @version 1.0 +*/ +sint8 nm_uart_reboot_cmd(void); + +/** +* @fn nm_uart_read_reg_with_ret +* @brief Read register with error code return +* @param [in] u32Addr +* Register address +* @param [out] pu32RetVal +* Pointer to u32 variable used to return the read value +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_read_reg_with_ret(uint32 u32Addr, uint32* pu32RetVal); + +/** +* @fn nm_uart_write_reg +* @brief write register +* @param [in] u32Addr +* Register address +* @param [in] u32Val +* Value to be written to the register +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_write_reg(uint32 u32Addr, uint32 u32Val); + +/** +* @fn nm_uart_read_block +* @brief Read block of data +* @param [in] u32Addr +* Start address +* @param [out] puBuf +* Pointer to a buffer used to return the read data +* @param [in] u16Sz +* Number of bytes to read. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_read_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_uart_write_block +* @brief Write block of data +* @param [in] u32Addr +* Start address +* @param [in] puBuf +* Pointer to the buffer holding the data to be written +* @param [in] u16Sz +* Number of bytes to write. The buffer size must be >= u16Sz +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_write_block(uint32 u32Addr, uint8 *puBuf, uint16 u16Sz); + +/** +* @fn nm_uart_reconfigure +* @brief Reconfigures the UART interface +* @param [in] ptr +* Pointer to a DWORD containing baudrate at this moment. +* @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +sint8 nm_uart_reconfigure(void *ptr); +#endif /* _NMI2C_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400/programmer/programmer.h b/ChaloupeLora.X/Source/winc3400/programmer/programmer.h new file mode 100644 index 0000000..cbde6f7 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/programmer/programmer.h @@ -0,0 +1,53 @@ +/** + * + * \file + * + * \brief Programmer. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef IMAGE_DOWNLOADER_H_ +#define IMAGE_DOWNLOADER_H_ + +/** +* Include +*/ +#include "spi_flash_map.h" +#include "spi_flash/include/spi_flash.h" +#include "programmer_apis.h" + +#define ROOT_CERT_SIZE M2M_TLS_ROOTCER_FLASH_SZ + +#define programmer_get_flash_size() (((spi_flash_get_size()*1024)/8)*1024) +#define programmer_write(pu8Buf, u32Offset, u32Sz) spi_flash_write(pu8Buf, u32Offset, u32Sz) +#define programmer_erase(u32Offset, u32Sz) spi_flash_erase(u32Offset, u32Sz) +#define programmer_eraseall() programmer_erase(0, programmer_get_flash_size()) +#define programmer_read(pu8Buf, u32Offset, u32Sz) spi_flash_read(pu8Buf, u32Offset, u32Sz) + +#endif /* IMAGE_DOWNLOADER_H_ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/socket/include/m2m_socket_host_if.h b/ChaloupeLora.X/Source/winc3400/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..daf42b4 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/socket/include/m2m_socket_host_if.h @@ -0,0 +1,412 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifndef _BOOT_ +#ifndef _FIRMWARE_ +#include "socket/include/socket.h" +#else +#include "driver/include/m2m_types.h" +#endif +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef _FIRMWARE_ +#define HOSTNAME_MAX_SIZE (100) +#endif + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + + + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invlaid Socket command value. +*/ + + +#define SOCKET_CMD_BIND 0x41 +/*!< + Socket Binding command value. +*/ + + +#define SOCKET_CMD_LISTEN 0x42 +/*!< + Socket Listening command value. +*/ + + +#define SOCKET_CMD_ACCEPT 0x43 +/*!< + Socket Accepting command value. +*/ + + +#define SOCKET_CMD_CONNECT 0x44 +/*!< + Socket Connecting command value. +*/ + + +#define SOCKET_CMD_SEND 0x45 +/*!< + Socket send command value. +*/ + + +#define SOCKET_CMD_RECV 0x46 +/*!< + Socket Recieve command value. +*/ + + +#define SOCKET_CMD_SENDTO 0x47 +/*!< + Socket sendTo command value. +*/ + + +#define SOCKET_CMD_RECVFROM 0x48 +/*!< + Socket RecieveFrom command value. +*/ + + +#define SOCKET_CMD_CLOSE 0x49 +/*!< + Socket Close command value. +*/ + + +#define SOCKET_CMD_DNS_RESOLVE 0x4A +/*!< + Socket DNS Resolve command value. +*/ + + +#define SOCKET_CMD_SSL_CONNECT 0x4B +/*!< + SSL-Socket Connect command value. +*/ + + +#define SOCKET_CMD_SSL_SEND 0x4C +/*!< + SSL-Socket Send command value. +*/ + + +#define SOCKET_CMD_SSL_RECV 0x4D +/*!< + SSL-Socket Recieve command value. +*/ + + +#define SOCKET_CMD_SSL_CLOSE 0x4E +/*!< + SSL-Socket Close command value. +*/ + + +#define SOCKET_CMD_SET_SOCKET_OPTION 0x4F +/*!< + Set Socket Option command value. +*/ + + +#define SOCKET_CMD_SSL_CREATE 0x50 +/*!< +*/ + + +#define SOCKET_CMD_SSL_SET_SOCK_OPT 0x51 + + +#define SOCKET_CMD_PING 0x52 + + + + + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct{ + uint16 u16Family; + uint16 u16Port; + uint32 u32IPAddr; +}tstrSockAddr; + + +//typedef sint8 SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + + + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct{ + char acHostName[HOSTNAME_MAX_SIZE]; + uint32 u32HostIP; +}tstrDnsReply; + + +/*! +@brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +}tstrBindCmd; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +}tstrBindReply; + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8BackLog; + uint16 u16SessionID; +}tstrListenCmd; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct{ + SOCKET sock; + sint8 s8Status; + uint16 u16SessionID; +}tstrListenReply; + + +/*! +* @brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16 u16Void; +}tstrAcceptReply; + + +/*! +* @brief +*/ +typedef struct{ + tstrSockAddr strAddr; + SOCKET sock; + uint8 u8SslFlags; + uint16 u16SessionID; +}tstrConnectCmd; + + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct{ + SOCKET sock; + sint8 s8Error; + uint16 u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ +}tstrConnectReply; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Void; + uint16 u16DataSize; + tstrSockAddr strAddr; + uint16 u16SessionID; + uint16 u16Void; +}tstrSendCmd; + + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct{ + SOCKET sock; + uint8 u8Void; + sint16 s16SentBytes; + uint16 u16SessionID; + uint16 u16Void; +}tstrSendReply; + + +/*! +* @brief +*/ +typedef struct{ + uint32 u32Timeoutmsec; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; + uint16 u16BufLen; +}tstrRecvCmd; + + +/*! +@struct \ + tstrRecvReply +@brief +*/ +typedef struct{ + tstrSockAddr strRemoteAddr; + sint16 s16RecvStatus; + uint16 u16DataOffset; + SOCKET sock; + uint8 u8Void; + uint16 u16SessionID; +}tstrRecvReply; + + +/*! +* @brief +*/ +typedef struct{ + uint32 u32OptionValue; + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; +}tstrSetSocketOptCmd; + + +typedef struct{ + SOCKET sslSock; + uint8 __PAD24__[3]; +}tstrSSLSocketCreateCmd; + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Option; + uint16 u16SessionID; + uint32 u32OptLen; + uint8 au8OptVal[SSL_MAX_OPT_LEN]; +}tstrSSLSetSockOptCmd; + + +/*! +*/ +typedef struct{ + uint32 u32DestIPAddr; + uint32 u32CmdPrivate; + uint16 u16PingCount; + uint8 u8TTL; + uint8 __PAD8__; +}tstrPingCmd; + + +typedef struct{ + uint32 u32IPAddr; + uint32 u32CmdPrivate; + uint32 u32RTT; + uint16 u16Success; + uint16 u16Fail; + uint8 u8ErrorCode; + uint8 __PAD24__[3]; +}tstrPingReply; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/socket/include/socket.h b/ChaloupeLora.X/Source/winc3400/socket/include/socket.h new file mode 100644 index 0000000..6463d94 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/socket/include/socket.h @@ -0,0 +1,1740 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/**@defgroup SOCKETAPI SOCKET + */ + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "driver/include/m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SOCKETDEF Defines + * @ingroup SOCKETAPI + * The following list of macros are used to define constants used throughout the socket layer, and SSL Socket options. + * @{ */ + +#define HOSTNAME_MAX_SIZE 100 +/*!< + Maximum allowed size for a host domain name passed to the function gethostbyname @ref gethostbyname. + command value. Used with the setsocketopt function. + +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in structure. + (It is the only supported type for the current implementation.) +*/ + + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag shall be passed to the socket API for SSL session. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks. + Used with the @ref setsockopt function. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value. + Used with the @ref setsockopt function. +*/ + + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value. + Used with the @ref setsockopt function. +*/ + + +// SSL Socket options + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate + verification process. + It is highly recommended NOT to use this socket option in production + software applications. It is intended for debugging and testing + purposes only.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The + SNI is a NULL terminated string containing the server name + associated with the connection. It must not exceed the size + of HOSTNAME_MAX_SIZE. If the SNI is not a null string, then + TLS Client Hello messages will include the SNI extension. +*/ + + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + Allow the TLS to cache the session information for fast + TLS session establishment in future connections using the + TLS Protocol session resume features.\n + The option value should be cast to int type and it is handled + as a boolean flag. + +*/ + +#define SO_SSL_ENABLE_CERTNAME_VALIDATION 0x04 +/*!< + Enable internal validation of server name against the server's + certificate subject common name. If there is no server name + provided (via the SO_SSL_SNI option), setting this option does + nothing.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Legacy name for @ref SO_SSL_ENABLE_CERTNAME_VALIDATION.\n + The option value should be cast to int type and it is handled + as a boolean flag. +*/ + //@} + +/** @defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + + +#define SSL_ECC_ONLY_CIPHERS \ +(\ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ +) +/*!< + All supported ECC Ciphers. These ciphers are turned off by default at startup. + The application may enable them if it has an ECC math engine (like ATECC508). +*/ + + +#define SSL_DEFAULT_CIPHERS \ +(\ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ +) +/*!< + All supported Non-ECC Ciphers. This is the default active group after startup. + Note that firmware may support only a subset of these. +*/ + //@} + +/**@defgroup SOCKETBYTEORDER Byte Order + * @ingroup SOCKETAPI + * The following list of macros are used to convert between host representation and network byte order. + * @{ */ +#ifdef _NM_BSP_BIG_END +#define _htonl(m) (m) +/*!< + Convert a 4-byte integer from the Host representation to Network byte order (Host is BE). +*/ +#define _htons(A) (A) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is BE). +*/ +#else +#define _htonl(m) \ + (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) | ((uint32)(((uint32)m) >> 24))) +/*!< + Convert a 4-byte integer from Host representation to Network byte order (Host is LE). +*/ + +#define _htons(A) (uint16)((((uint16) (A)) << 8) | (((uint16) (A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is LE). +*/ +#endif + + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from Network byte order to Host representation. +*/ + + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from Network byte order to Host representation. +*/ + //@} + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SOCKETAPI + * The following list of macros are used to define the possible error codes. + * Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation. This code is also used with event @ref SOCKET_MSG_RECV if a socket connection is closed. + In that case, the application should call @ref close(). +*/ + + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a valid address + For example: bind is called without specifying a port number +*/ + + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. Only one IP address per socket, and one socket per IP address is permitted - + any attempt for a new socket to bind with an IP address already bound to another open socket will return the following error code. +*/ + + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through TCP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed. +*/ + + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through UDP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed +*/ + + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a socket function. Identifies that @ref socket operation failed +*/ + + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies that @ref listen operation failed. +*/ + + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be completed. + The @ref sendto function requires a destination address to send data. +*/ + + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed (reset) by the peer. If this error is received, the application should call @ref close(). +*/ + + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has timed out. The socket remains open. +*/ + + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ + + //@} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** @defgroup SocketEnums Enumeration/Typedefs + * @ingroup SOCKETAPI + * Specific Enumeration-typedefs used for socket operations + * @{ */ +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + The ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef sint8 SOCKET; + //@} + +/*! +@struct \ + in_addr + +@brief + IPv4 address representation. + + This structure is used as a placeholder for IPV4 address in other structures. +@see + sockaddr_in +*/ +typedef struct{ + uint32 s_addr; + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ +}in_addr; + + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see \ + sockaddr_in +*/ +struct sockaddr{ + uint16 sa_family; + /*!< +Socket address family. + */ + uint8 sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + sockaddr_in + +@brief + Socket address structure for IPV4 addresses. Used to specify socket address information to connect to. + Can be cast to @ref sockaddr structure. +*/ +struct sockaddr_in{ + uint16 sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16 sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + Must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. + */ + uint8 sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; + +/**@addtogroup SocketEnums + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs make use of callback functions in-order to return back the results once the corresponding socket operation is completed. + Hence resuming the normal execution of the application code while the socket operation returns the results. + Callback functions expect event messages to be passed in, in-order to identify the operation they're returning the results for. + The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback functions, + a function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket operation. + +@see bind +@see listen +@see accept +@see connect +@see send +@see recv + +*/ +typedef enum{ + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + Sendto socket event. + */ + SOCKET_MSG_RECVFROM + /*!< + Recvfrom socket event. + */ +}tenuSocketCallbackMsgType; +// @} + + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind + +*/ +typedef struct{ + sint8 status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +}tstrSocketBindMsg; + + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen function. + This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback function. +@see + listen +*/ +typedef struct{ + sint8 status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +}tstrSocketListenMsg; + + + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept function. + This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback function. +*/ +typedef struct{ + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with the remote peer. + Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +}tstrSocketAcceptMsg; + + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to the asynchronous call to the @ref connect socket function. + This structure together with the event @ref SOCKET_MSG_CONNECT are passed-in parameters to the callback function. + If the application receives this structure with a negative value in s8Error, the application should call @ref close(). +*/ +typedef struct{ + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the connect function call. + */ + sint8 s8Error; + /*!< + Connect error code. + Holding a value of ZERO for a successful connect or otherwise a negative + error code corresponding to the type of error. + */ +}tstrSocketConnectMsg; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the recv or recvfrom socket functions. + This structure together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM are passed-in parameters to the callback function. +@remark + In case the received data from the remote peer is larger than the USER buffer size defined during the asynchronous call to the @ref recv function, + only data up to the buffer size is delivered to the user. The user must call @ref recv again in order to receive the remaining data. + A negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref close(). + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref close(). + @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. +*/ +typedef struct{ + uint8 *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + sint16 s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16 u16RemainingSize; + /*!< + The number of bytes remaining in the current @ref recv operation. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +}tstrSocketRecvMsg; + +/**@addtogroup SocketEnums + * @{ */ +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application callback through this function by calling @ref registerSocketCallback. + In response to events received, the following callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is received in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb) (SOCKET sock, uint8 u8Msg, void * pvMsg); + + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref registerSocketCallback. + The following callback is triggered in response to an asynchronous call to the @ref gethostbyname function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in Network byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb) (uint8* pu8DomainName, uint32 u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + @ref m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32 u32IPAddr, uint32 u32RTT, uint8 u8ErrorCode); + + /**@}*/ +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup SocketAPI Functions + * @ingroup SOCKETAPI + */ + + /**@{*/ +/*! +@fn \ + NMI_API void socketInit(void); + The function performs the necessary initialization for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent reseting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based on the maximum number of + sockets @ref MAX_SOCKET which is tuned to the systems capability. +\section SocketExample1 Example +This example demonstrates the use of the socketInit for socket initialization for an mqtt chat application. + \code + tstrWifiInitParam param; + int8_t ret; + char topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + m2m_wifi_connect((char *)DEFAULT_SSID, sizeof(DEFAULT_SSID), + DEFAULT_AUTH, (char *)DEFAULT_KEY, M2M_WIFI_CH_ALL); + +\endcode +*/ +NMI_API void socketInit(void); + +/*! +@fn \ + NMI_API void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked only after all desired socket operations have been performed on any active sockets. +*/ +NMI_API void socketDeinit(void); +/*! +@fn \ + NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering function. + The registered callback functions are used to retrieve information in response to the asynchronous socket functions called. +@param [in] socket_cb + Assignment of callback function to the global callback @ref tpfAppSocketCb gpfAppSocketCb. Delivers + socket messages to the host application. In response to the asynchronous function calls, such as @ref bind + @ref listen @ref accept @ref connect + +@param [in] resolve_cb + Assignment of callback function to the global callback @ref tpfAppResolveCb gpfAppResolveCb. + Used for DNS resolving functionality. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when DNS resolution is not required. + +@return void +@remarks + If any of the socket functionality is not to be used, NULL is passed in as a parameter. + It must be invoked after @ref socketInit and before other socket layer operations. + +\section SocketExample2 Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS resolution CB set to null + for a simple UDP server example. + \code + tstrWifiInitParam param; + int8_t ret; + struct sockaddr_in addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + m2m_wifi_connect((char *)DEFAULT_SSID, sizeof(DEFAULT_SSID), DEFAULT_AUTH, (char *)DEFAULT_KEY, M2M_WIFI_CH_ALL); + \endcode +*/ +NMI_API void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); +/*! +@fn \ + NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); + Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and their possible types are either TCP or a UDP sockets. + The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + +@param [in] u8Flags + Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets, + or [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) if the socket is used for SSL session. The use of the flag + [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) has no meaning in case of UDP sockets. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket handler. + before any call to the socket function can be made. + +@see + connect + bind + listen + accept + recv + recvfrom + send + sendto + close + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of available sockets. + +@remarks + The socket function must be called before any other related socket functions "e.g. send, recv, close ..etc" +\section SocketExample3 Example + This example demonstrates the use of the socket function to allocate the socket, returning the socket handler to be used for other +socket operations. Socket creation is dependent on the socket type. +\subsection sub1 UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, 0); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, 0)); +@endcode +*/ +NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags); +/*! +\fn \ + NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + Asynchronous bind function associates the provided address and local port to the socket. + The function can be used with both TCP and UDP sockets. It is mandatory to call the @ref bind function before starting any UDP or TCP server operation. + Upon socket bind completion, the application will receive a @ref SOCKET_MSG_BIND message in the socket callback. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see socket +@see connect +@see listen +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section SocketExample4 Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET,SOCK_DGRAM,0); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(UDP_SERVER_PORT); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret == 0) + printf("Bind success!\n"); + else + { + printf("Bind Failed. Error code = %d\n",ret); + close(udpServerSocket); + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint8 listen(SOCKET sock, uint8 backlog); + + After successfully binding a socket to an IP address and port on the system, start listening passively for incoming connections. + The socket must be bound on a local port or the listen operation fails. + Upon the call to the asynchronous listen function, response is received through the event @ref SOCKET_MSG_LISTEN + in the socket callback. + + A successful listen means the TCP server operation is active. If a connection is accepted, then the application socket callback function is + notified with the new connected socket through the event @ref SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function + after calling @ref listen. + + After a connection is accepted, the user is then required to call @ref recv to receive any packets transmitted by the remote host or to recieve notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see bind +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating invalid arguments were passed, such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section SocketExample5 Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8 u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + close(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +NMI_API sint8 listen(SOCKET sock, uint8 backlog); +/*! +@fn \ + NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); + The function has no current implementation. An empty deceleration is used to prevent errors when legacy application code is used. + As it has no effect, it can be safely removed from any application using it. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen); +/*! +@fn \ + NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); + Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of the result of the connection attempt through the event @ref SOCKET_MSG_CONNECT, + along with a structure @ref tstrSocketConnectMsg. + If socket connection fails, the application should call @ref close(). + A successful connect means the TCP session is active. The application is then required to make a call to the @ref recv function + to receive any packets transmitted by the remote server, unless the application is interrupted by a notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section SocketExample6 Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through the main function and how the + callback function handles the @ref SOCKET_MSG_CONNECT event. +\subsection sub3 Main Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,0); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub4 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8 acBuffer[GROWL_MSG_SIZE]; + uint16 u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + close(pstrNotification->Socket); + } + } +@endcode +*/ +NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); + + An asynchrnonous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the two socket events + [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the socket is already connected to a remote + host. + The application receives the required data in response to this asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the + socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref close(). + - @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref close(). + - @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see socket +@see connect +@see bind +@see listen +@see recvfrom +@see close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Recieve buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket recieve failure. +\section SocketExample7 Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification of the accept or connect events, and the parsing of the + received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socet recv Error: %d\n",pstrRx->s16BufferSize); + close(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/*! +@fn \ + NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds); + Receives data from a UDP Scoket. + + The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + with successful status in the socket callback). + + Upon calling the recvfrom function with a successful return code, the application is expected to receive a notification + in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + + Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error @ref SOCK_ERR_TIMEOUT + + The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref bind function. + +@see + socket + bind + close + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample8 Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon notification of a successful bind event, and the parsing of the + received data when the SOCKET_MSG_RECVFROM event is received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16 u16port = pstrRx->strRemoteAddr.sin_port; + uint32 strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Received frame with size = %d.\tHost address=%x, Port number = %d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + ret = close(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec); +/*! +@fn \ + NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); + Asynchronous sending function, used to send data on a TCP/UDP socket. + + Called by the application code when there is outgoing data available required to be sent on a specific socket handler. + The only difference between this function and the similar @ref sendto function, is the type of socket the data is sent on and the parameters passed in. + @ref send function is most commonly called for sockets in a connected state. + After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the data). + Hence this function is expected to be called after a successful socket connect operation(in client case or accept in the + the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order to send outgoing data + using the @ref send function, at least one successful call must be made to the @ref sendto function before consecutive calls to the @ref send function, + to ensure that the destination address is saved in the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifer through the aprior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + + +@return + The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags); +/*! +@fn \ + NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); + + Asynchronous sending function, used to send data on a UDP socket. + Called by the application code when there is data required to be sent on a UDP socket. + The application code is expected to receive data from a successfully bound socket node. + The only difference between this function and the similar @ref send function, is the type of socket the data is received on. This function works + only with UDP sockets. + After the data is sent, the socket callback function registered using @ref registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SENDTO. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] u16SendLength + The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + +@param [in] flags + Not used in the current implementation + +@param [in] pstrDestAddr + The destination address. + +@param [in] u8AddrLen + Destination address length in bytes. + Not used in the current implementation, only included for BSD compatibility. +@pre + Sockets must be initialized using socketInit. + +@see + socketInit + recvfrom + sendto + socket + connect + accept + send + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket (returned from socket ). + A valid buffer pointer must be used (not NULL). \n + Successful completion of a call to sendto() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + +@return + The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen); +/*! +@fn \ + NMI_API sint8 close(SOCKET sock); + + Synchronous close function, releases all the socket assigned resources. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@pre + Sockets must be initialized through the call of the socketInit function. + @ref close is called only for valid socket identifiers created through the @ref socket function. + +@warning + If @ref close is called while there are still pending messages (sent or received ) they will be discarded. + +@see + socketInit + socket + +@return + The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +NMI_API sint8 close(SOCKET sock); +/*! +@fn \ + NMI_API uint32 nmi_inet_addr(char *pcIpAddr); + + Synchronous function which returns a BSD socket compliant Internet Protocol (IPv4) socket address. + This IPv4 address in the input string parameter could either be specified as a hostname, or as a numeric string representation like n.n.n.n known as the IPv4 dotted-decimal format + (i.e. "192.168.10.1"). + This function is used whenever an ip address needs to be set in the proper format + (i.e. for the @ref tstrM2MIPConfig structure). + +@param [in] pcIpAddr + A null terminated string containing the IP address in IPv4 dotted-decimal address. + +@return + Unsigned 32-bit integer representing the IP address in Network byte order + (eg. "192.168.10.1" will be expressed as 0x010AA8C0). + +*/ +NMI_API uint32 nmi_inet_addr(char *pcIpAddr); +/*! +@fn \ + NMI_API sint8 gethostbyname(uint8 * pcHostName); + Asynchronous DNS resolving function. This function uses DNS to resolve a domain name to the corresponding IP address. + A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS callback function registered using registerSocketCallback() + +@param [in] pcHostName + NULL terminated string containing the domain name for the remote host. + Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + +@see + registerSocketCallback + +@warning + Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + a negative return value indicates only locally-detected errors + +@return + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) +*/ +NMI_API sint8 gethostbyname(uint8 * pcHostName); + +/*! +@fn \ + NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); + + The setsockopt() function shall set the option specified by the option_name + argument, at the protocol level specified by the level argument, to the value + pointed to by the option_value argument for the socke specified by the socket argument. + + Possible Options: + SO_SET_UDP_SEND_CALLBACK: + Enable/Disable callback messages for sendto().Since UDP is unreliable by default the user maybe interested (or not) + in receiving a message of /ref SOCKET_MSG_SENDTO for each call of sendto(). + Enabled if option_value equals /ref BTRUE Disabled otherwise. + IP_ADD_MEMBERSHIP: + valid for UDP sockets,this option is used to receive frames sent to a multicast group. + option_value shall be a pointer to Unsigned 32 bit integer containing the Multicast ipv4 address. + IP_DROP_MEMBERSHIP: + valid for UDP sockets,this option is used to Stop receiving frames sent to a multicast group. + option_value shall be a pointer to Unsigned 32 bit integer containing the Multicast ipv4 address. + + Possible values for s32Level: + This argument is ignored. + +@param [in] socket + Socket handler. + +@param [in] u8Level + protocol level. always SOL_SOCKET for now. + +@param [in] option_name + option to be set. + +@param [in] option_value + pointer to user provided value. + +@param [in] u16OptionLen + length of the option value. +@warning + -Note that sending IGMP packets to Join/Leave multicast groups is not currently implemented. \n + Calling this function will Pass/Filter packets sent to the Multicast address provided in the option_value +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +*/ +NMI_API sint8 setsockopt(SOCKET socket, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen); +/*! +@fn \ + sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8 * pu8OptLen); + Get socket options retrieves + This Function isn't implemented yet but this is the form that will be released later. +@brief + + +@param [in] sock + Socket Identifie. +@param [in] u8Level + The protocol level of the option. +@param [in] u8OptName + The u8OptName argument specifies a single option to get. +@param [out] pvOptValue + The pvOptValue argument contains pointer to a buffer containing the option value. +@param [out] pu8OptLen + Option value buffer length. +@return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +NMI_API sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8* pu8OptLen); +/*! + * @fn NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); + * The function request to send ping request to the given IP Address. + * + * @param [in] u32DstIP + * Target Destination IP Address for the ping request. It must be represented in Network + * byte order. + * The function nmi_inet_addr could be used to translate the dotted decimal notation IP + * to its Network bytes order integer represntative. + * + * @param [in] u8TTL + * IP TTL value for the ping request. If set to ZERO, the default value SHALL be used. + * + * @param [in] fpPingCb + * Callback will be called to deliver the ping statistics. + * + * @see nmi_inet_addr + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +NMI_API sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb); +/**@}*/ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/socket/source/socket.c b/ChaloupeLora.X/Source/winc3400/socket/source/socket.c new file mode 100644 index 0000000..e6371a9 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/socket/source/socket.c @@ -0,0 +1,1266 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "bsp/include/nm_bsp.h" +#include "socket/include/socket.h" +#include "driver/source/m2m_hif.h" +#include "socket/source/socket_internal.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_CHECK_CERTNAME NBIT6 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct{ + SOCKET sock; + uint8 u8Dummy; + uint16 u16SessionID; +}tstrCloseCmd; + + +/*! +* @brief +*/ +typedef struct{ + uint8 *pu8UserBuffer; + uint16 u16UserBufferSize; + uint16 u16SessionID; + uint16 u16DataOffset; + uint8 bIsUsed; + uint8 u8SSLFlags; + uint8 bIsRecvPending; +}tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile sint8 gsockerrno; +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint8 gu8OpCode; +volatile uint16 gu16BufferSize; +volatile uint16 gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8 gbSocketInit = 0; +volatile tpfPingCb gfpPingCb; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the NMC1500 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv,uint8 u8SocketMsg, + uint32 u32StartAddress,uint16 u16ReadCount) +{ + uint32 u32Address = u32StartAddress; + uint16 u16Read; + sint16 s16Diff; + + pstrRecv->u16RemainingSize = u16ReadCount; + if((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) && (gastrSockets[sock].bIsUsed == 1)) + { + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if(s16Diff > 0) + u16Read = gastrSockets[sock].u16UserBufferSize; + + if(hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, 1) == M2M_SUCCESS) + { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + gastrSockets[sock].u16UserBufferSize -= u16Read; + if(gastrSockets[sock].u16UserBufferSize == 0) + gastrSockets[sock].pu8UserBuffer = NULL; + + if (gpfAppSocketCb) + gpfAppSocketCb(sock,u8SocketMsg, pstrRecv); + } + else + { + M2M_INFO("(ERRR)Current <%d>\n", u16ReadCount); + } + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 17 July 2012 +*********************************************************************/ +static void m2m_ip_cb(uint8 u8OpCode, uint16 u16BufferSize,uint32 u32Address) +{ + if(u8OpCode == SOCKET_CMD_BIND) + { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if(hif_receive(u32Address, (uint8*)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) + { + strBind.status = strBindReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock,SOCKET_MSG_BIND,&strBind); + } + } + else if(u8OpCode == SOCKET_CMD_LISTEN) + { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if(hif_receive(u32Address, (uint8*)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) + { + strListen.status = strListenReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock,SOCKET_MSG_LISTEN, &strListen); + } + } + else if(u8OpCode == SOCKET_CMD_ACCEPT) + { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if(hif_receive(u32Address, (uint8*)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) + { + if(strAcceptReply.sConnectedSock >= 0) + { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags = 0; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n",strAcceptReply.sConnectedSock , gu16SessionID ); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if(gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } + else if((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT)) + { + tstrConnectReply strConnectReply; + tstrSocketConnectMsg strConnMsg; + if(hif_receive(u32Address, (uint8*)&strConnectReply, sizeof(tstrConnectReply), 0) == M2M_SUCCESS) + { + strConnMsg.sock = strConnectReply.sock; + strConnMsg.s8Error = strConnectReply.s8Error; + if(strConnectReply.s8Error == SOCK_ERR_NO_ERROR) + { + gastrSockets[strConnectReply.sock].u16DataOffset = strConnectReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + } + if(gpfAppSocketCb) + gpfAppSocketCb(strConnectReply.sock,SOCKET_MSG_CONNECT, &strConnMsg); + } + } + else if(u8OpCode == SOCKET_CMD_DNS_RESOLVE) + { + tstrDnsReply strDnsReply; + if(hif_receive(u32Address, (uint8*)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) + { + strDnsReply.u32HostIP = strDnsReply.u32HostIP; + if(gpfAppResolveCb) + gpfAppResolveCb((uint8*)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } + else if((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) || (u8OpCode == SOCKET_CMD_SSL_RECV)) + { + SOCKET sock; + sint16 s16RecvStatus; + tstrRecvReply strRecvReply; + uint16 u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8 u8CallbackMsgID = SOCKET_MSG_RECV; + uint16 u16DataOffset; + + if(u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if(hif_receive(u32Address, (uint8*)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) + { + uint16 u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n",u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) + { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. If the buffer is smaller than the received data, + the data is passed to the application in chunks according to its buffer size. + */ + u16ReadSize = (uint16)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } + else + { + /* Don't tidy up here. Application must call close(). + */ + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if(gpfAppSocketCb) + gpfAppSocketCb(sock,u8CallbackMsgID, &strRecvMsg); + } + } + else + { + M2M_DBG("Discard recv callback %d %d \r\n",u16SessionID , gastrSockets[sock].u16SessionID); + if(u16ReadSize < u16BufferSize) + hif_receive(0, NULL, 0, 1); + } + } + } + else if((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) + { + SOCKET sock; + sint16 s16Rcvd; + tstrSendReply strReply; + uint8 u8CallbackMsgID = SOCKET_MSG_SEND; + + if(u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if(hif_receive(u32Address, (uint8*)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) + { + uint16 u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n",u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if(gpfAppSocketCb) + gpfAppSocketCb(sock,u8CallbackMsgID, &s16Rcvd); + } + else + { + M2M_DBG("Discard send callback %d %d \r\n",u16SessionID , gastrSockets[sock].u16SessionID); + } + } + } + else if(u8OpCode == SOCKET_CMD_PING) + { + tstrPingReply strPingReply; + if(hif_receive(u32Address, (uint8*)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) + { + gfpPingCb = (void (*)(uint32 , uint32 , uint8))strPingReply.u32CmdPrivate; + if(gfpPingCb != NULL) + { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); +} + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void socketInit(void) +{ + if(gbSocketInit==0) + { + m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP,m2m_ip_cb); + gbSocketInit=1; + gu16SessionID = 0; + } +} + +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. + +Author + Samer Sarhan + +Version + 1.0 + +Date + 27 Feb 2015 +*********************************************************************/ +void socketDeinit(void) +{ + m2m_memset((uint8*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} + + +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. + +Author + Ahmed Ezzat + +Versio + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags) +{ + SOCKET sock = -1; + uint8 u8SockID; + uint8 u8Count; + volatile tstrSocket *pstrSock; + static volatile uint8 u8NextTcpSock = 0; + static volatile uint8 u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if(u16Domain == AF_INET) + { + if(u8Type == SOCK_STREAM) + { + for(u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)u8SockID; + break; + } + } + } + else if(u8Type == SOCK_DGRAM) + { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for(u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + break; + } + } + } + + if(sock >= 0) + { + m2m_memset((uint8*)pstrSock, 0, sizeof(tstrSocket)); + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n",sock, gu16SessionID ); + + if(u8Flags & SOCKET_FLAGS_SSL) + { + tstrSSLSocketCreateCmd strSSLCreate; + strSSLCreate.sslSock = sock; + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + } + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((pstrAddr != NULL) && (sock >= 0) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrBindCmd strBind; + + /* Build the bind request. */ + strBind.sock = sock; + m2m_memcpy((uint8 *)&strBind.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strBind.strAddr.u16Family = strBind.strAddr.u16Family; + strBind.strAddr.u16Port = strBind.strAddr.u16Port; + strBind.strAddr.u32IPAddr = strBind.strAddr.u32IPAddr; + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(SOCKET_CMD_BIND, (uint8*)&strBind,sizeof(tstrBindCmd) , NULL , 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 listen(SOCKET sock, uint8 backlog) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) + { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8*)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1) ) + { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrConnectCmd strConnect; + uint8 u8Cmd = SOCKET_CMD_CONNECT; + if((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + m2m_memcpy((uint8 *)&strConnect.strAddr, (uint8 *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strConnect,sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 5 June 2012 +*********************************************************************/ +sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + uint16 u16DataOffset; + tstrSendCmd strSend; + uint8 u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if(sock >= TCP_SOCK_MAX) + { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd|M2M_REQ_DATA_PKT, (uint8*)&strSend, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, u16DataOffset); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + tstrSendCmd strSendTo; + + m2m_memset((uint8*)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if(pstrDestAddr != NULL) + { + struct sockaddr_in *pstrAddr; + pstrAddr = (void*)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8*)&strSendTo, sizeof(tstrSendCmd), + pvSendBuffer, u16SendLength, UDP_TX_PACKET_OFFSET); + + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + uint8 u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strRecv, sizeof(tstrRecvCmd), NULL , 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + close + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 close(SOCKET sock) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + + M2M_INFO("Sock to delete <%d>\n", sock); + + if(sock >= 0 && (gastrSockets[sock].bIsUsed == 1)) + { + uint8 u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strclose, sizeof(tstrCloseCmd), NULL,0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + m2m_memset((uint8*)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + + +Author + Ahmed Ezzat + +Version + 1.0 + 2.0 9 April 2013 --> Add timeout for recv operation. + +Date + 5 June 2012 +*********************************************************************/ +sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec) +{ + sint16 s16Ret = SOCK_ERR_NO_ERROR; + if((sock >= 0) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8*)&strRecv, sizeof(tstrRecvCmd), NULL , 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } + else + { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + nmi_inet_addr + +Description + +Return + Unsigned 32-bit integer representing the IP address in Network + byte order. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +uint32 nmi_inet_addr(char *pcIpAddr) +{ + uint8 tmp; + uint32 u32IP = 0; + uint8 au8IP[4]; + uint8 c; + uint8 i, j; + + tmp = 0; + + for(i = 0; i < 4; ++i) + { + j = 0; + do + { + c = *pcIpAddr; + ++j; + if(j > 4) + { + return 0; + } + if(c == '.' || c == 0) + { + au8IP[i] = tmp; + tmp = 0; + } + else if(c >= '0' && c <= '9') + { + tmp = (tmp * 10) + (c - '0'); + } + else + { + return 0; + } + ++pcIpAddr; + } while(c != '.' && c != 0); + } + m2m_memcpy((uint8*)&u32IP, au8IP, 4); + return u32IP; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2012 +*********************************************************************/ +sint8 gethostbyname(uint8 * pcHostName) +{ + sint8 s8Err = SOCK_ERR_INVALID_ARG; + uint8 u8HostNameSize = (uint8)m2m_strlen(pcHostName); + if(u8HostNameSize <= HOSTNAME_MAX_SIZE) + { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8*)pcHostName, u8HostNameSize + 1, NULL,0, 0); + if(s8Err != SOCK_ERR_NO_ERROR) + { + s8Err = SOCK_ERR_INVALID; + } + } + return s8Err; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +static sint8 sslSetSockOpt(SOCKET sock, uint8 u8Opt, const void *pvOptVal, uint16 u16OptLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if(sock < TCP_SOCK_MAX) + { + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + if(u8Opt == SO_SSL_BYPASS_X509_VERIF) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_BYPASS_X509; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_BYPASS_X509; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_ENABLE_SESSION_CACHING) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CACHE_SESSION; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CACHE_SESSION; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_ENABLE_CERTNAME_VALIDATION) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= SSL_FLAGS_CHECK_CERTNAME; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_CHECK_CERTNAME; + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else if(u8Opt == SO_SSL_SNI) + { + if(u16OptLen < HOSTNAME_MAX_SIZE) + { + uint8 *pu8SNI = (uint8*)pvOptVal; + tstrSSLSetSockOptCmd strCmd; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + m2m_memcpy(strCmd.au8OptVal, pu8SNI, HOSTNAME_MAX_SIZE); + + if(SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8*)&strCmd, sizeof(tstrSSLSetSockOptCmd), + 0, 0, 0) == M2M_ERR_MEM_ALLOC) + { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + } + s8Ret = SOCK_ERR_NO_ERROR; + } + else + { + M2M_ERR("SNI Exceeds Max Length\n"); + } + } + else + { + M2M_ERR("Unknown SSL Socket Option %d\n",u8Opt); + } + } + else + { + M2M_ERR("Not SSL Socket\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. + +Author + Abdelrahman Diab + +Version + 1.0 + +Date + 9 September 2014 +*********************************************************************/ +sint8 setsockopt(SOCKET sock, uint8 u8Level, uint8 option_name, + const void *option_value, uint16 u16OptionLen) +{ + sint8 s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) + { + if(u8Level == SOL_SSL_SOCKET) + { + if((option_name == SO_SSL_SNI) || (u16OptionLen == sizeof(int))) + { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + } + else + { + if(u16OptionLen == sizeof(uint32)) + { + uint8 u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option=option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32*)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL,0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 24 August 2014 +*********************************************************************/ +sint8 getsockopt(SOCKET sock, uint8 u8Level, uint8 u8OptName, const void *pvOptValue, uint8* pu8OptLen) +{ + // This is not implemented so return a value that will cause failure should this be used. + return SOCK_ERR_INVALID_ARG; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return + +Author + Ahmed Ezzat + +Version + 1.0 + +Date + 4 June 2015 +*********************************************************************/ +sint8 m2m_ping_req(uint32 u32DstIP, uint8 u8TTL, tpfPingCb fpPingCb) +{ + sint8 s8Ret = M2M_ERR_INVALID_ARG; + + if((u32DstIP != 0) && (fpPingCb != NULL)) + { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = (uint32)fpPingCb; + strPingCmd.u8TTL = u8TTL; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8*)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} diff --git a/ChaloupeLora.X/Source/winc3400/socket/source/socket_internal.h b/ChaloupeLora.X/Source/winc3400/socket/source/socket_internal.h new file mode 100644 index 0000000..e5c1896 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/socket/source/socket_internal.h @@ -0,0 +1,61 @@ +/** + * + * \file + * + * \brief BSD compatible socket interface internal types. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ +#ifndef __SOCKET_INTERNAL_H__ +#define __SOCKET_INTERNAL_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket/include/socket.h" +#include "socket/include/m2m_socket_host_if.h" + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv,uint8 u8SocketMsg, + uint32 u32StartAddress,uint16 u16ReadCount); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash.h b/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..44c360a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash.h @@ -0,0 +1,192 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +/** @defgroup SPIFLASHAPI SPI FLASH + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ +#include "common/include/nm_common.h" +#include "bus_wrapper/include/nm_bus_wrapper.h" +#include "driver/source/nmbus.h" +#include "spi_flash_map.h" + +/** @defgroup SPIFLASHFUNCTIONS Functions + * @ingroup SPIFLASHAPI + */ + + /**@{*/ +/*! + * @fn uint32 spi_flash_get_size(void); + * @brief Returns with \ref uint32 value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32 spi_flash_get_size(void); + +/*! + * @fn sint8 spi_flash_read(uint8 *, uint32, uint32); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will be filled with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz); + +/*! + * @fn sint8 spi_flash_write(uint8 *, uint32, uint32); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the data to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and comparing it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase that section first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + + */ +sint8 spi_flash_write(uint8* pu8Buf, uint32 u32Offset, uint32 u32Sz); + +/*! + * @fn sint8 spi_flash_erase(uint32, uint32); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Total number of bytes required to be erased. + * @note It is blocking function \n +* @warning +* - Address (offset) plus size of data must not exceed flash size.\n +* - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * \section SPIFLASHExample Example + * @code{.c} + * #include "spi_flash/include/spi_flash.h" + * + * #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + * + * int main() + * { + * uint8 au8FlashContent[FLASH_SECTOR_SZ] = {0}; + * uint32 u32FlashTotalSize = 0; + * uint32 u32FlashOffset = 0; + * + * ret = m2m_wifi_download_mode(); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to enter download mode\r\n"); + * } + * else + * { + * u32FlashTotalSize = spi_flash_get_size(); + * } + * + * while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + * { + * ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to read SPI sector\r\n"); + * break; + * } + * memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + * + * ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to erase SPI sector\r\n"); + * break; + * } + * + * ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to write SPI sector\r\n"); + * break; + * } + * u32FlashOffset += FLASH_SECTOR_SZ; + * } + * + * if(M2M_SUCCESS == ret) + * { + * printf("Successful operations\r\n"); + * } + * else + * { + * printf("Failed operations\r\n"); + * } + * + * while(1); + * return M2M_SUCCESS; + * } + * @endcode + */ + +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz); + + +/**@} + */ + + +#endif //__SPI_FLASH_H__ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash_map.h b/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..40ea38d --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/spi_flash/include/spi_flash_map.h @@ -0,0 +1,267 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2017-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ +#define BT_IMAGE_PRESENT + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! M2M_OTA_IMAGE2_OFFSET) +#error "Exceed Flash Size" +#endif /* ((FLASH_COMMON_SZ + OTA_IMAGE_SIZE + HOST_CONTROL_FLASH_SZ) > M2M_OTA_IMAGE2_OFFSET) */ +#if ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) +#error "OTA Exceed Flash Size" +#endif /* ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400/spi_flash/source/spi_flash.c b/ChaloupeLora.X/Source/winc3400/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..ad91e04 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/spi_flash/source/spi_flash.c @@ -0,0 +1,677 @@ +/** + * + * \file + * + * \brief SPI Flash. + * + * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries. + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + * + */ + +#ifdef PROFILING +#include "windows.h" +#endif +#include "spi_flash/include/spi_flash.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +//#define DISABLE_UNSED_FLASH_FUNCTIONS + +#define HOST_SHARE_MEM_BASE (0xd0000UL) +#define CORTUS_SHARE_MEM_BASE (0x60000000UL) +#define NMI_SPI_FLASH_ADDR (0x111c) +/*********************************************************** +SPI Flash DMA +***********************************************************/ +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32)X[1+Y]<<8) + ((uint32)X[2+Y]<<16) +((uint32)X[3+Y]<<24)) +#define SPI_FLASH_BASE (0x10200) +#define SPI_FLASH_MODE (SPI_FLASH_BASE + 0x00) +#define SPI_FLASH_CMD_CNT (SPI_FLASH_BASE + 0x04) +#define SPI_FLASH_DATA_CNT (SPI_FLASH_BASE + 0x08) +#define SPI_FLASH_BUF1 (SPI_FLASH_BASE + 0x0c) +#define SPI_FLASH_BUF2 (SPI_FLASH_BASE + 0x10) +#define SPI_FLASH_BUF_DIR (SPI_FLASH_BASE + 0x14) +#define SPI_FLASH_TR_DONE (SPI_FLASH_BASE + 0x18) +#define SPI_FLASH_DMA_ADDR (SPI_FLASH_BASE + 0x1c) +#define SPI_FLASH_MSB_CTL (SPI_FLASH_BASE + 0x20) +#define SPI_FLASH_TX_CTL (SPI_FLASH_BASE + 0x24) + +/*********************************************/ +/* STATIC FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read_status_reg +* @brief Read status register +* @param[OUT] val + value of status reg +* @return Status of execution +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_read_status_reg(uint8 * val) +{ + sint8 ret = M2M_SUCCESS; + uint8 cmd[1]; + uint32 reg; + + cmd[0] = 0x05; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + *val = reg & 0xff; + return ret; +} + +#ifdef DISABLE_UNSED_FLASH_FUNCTIONS +/** +* @fn spi_flash_read_security_reg +* @brief Read security register +* @return Security register value +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static uint8 spi_flash_read_security_reg(void) +{ + uint8 cmd[1]; + uint32 reg; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x2b; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 1); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + + return (sint8)reg & 0xff; +} + +/** +* @fn spi_flash_gang_unblock +* @brief Unblock all flash area +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_gang_unblock(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x98; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_clear_security_flags +* @brief Clear all security flags +* @note Compatible with MX25L6465E +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_clear_security_flags(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x30; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} +#endif + +/** +* @fn spi_flash_load_to_cortus_mem +* @brief Load data from SPI flash into cortus memory +* @param[IN] u32MemAdr +* Cortus load address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_load_to_cortus_mem(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[5]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x0b; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_sector_erase +* @brief Erase sector (4KB) +* @param[IN] u32FlashAdr +* Any memory address within the sector +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_sector_erase(uint32 u32FlashAdr) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_enable +* @brief Send write enable command to SPI flash +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_write_enable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_disable +* @brief Send write disable command to SPI flash +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_write_disable(void) +{ + uint8 cmd[1]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_page_program +* @brief Write data (less than page size) from cortus memory to SPI flash +* @param[IN] u32MemAdr +* Cortus data address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Compatible with MX25L6465E and should be working with other types +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_page_program(uint32 u32MemAdr, uint32 u32FlashAdr, uint32 u32Sz) +{ + uint8 cmd[4]; + uint32 val = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8)(u32FlashAdr >> 16); + cmd[2] = (uint8)(u32FlashAdr >> 8); + cmd[3] = (uint8)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7) | ((u32Sz & 0xfffff) << 8)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_read_internal +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32Addr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Data size must be < 64KB (limitation imposed by the bus wrapper) +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_read_internal(uint8 *pu8Buf, uint32 u32Addr, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if(M2M_SUCCESS != ret) goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** +* @fn spi_flash_pp +* @brief Program data of size less than a page (256 bytes) at the SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @author M. Abdelmawla +* @version 1.0 +*/ +static sint8 spi_flash_pp(uint32 u32Offset, uint8 *pu8Buf, uint16 u16Sz) +{ + sint8 ret = M2M_SUCCESS; + uint8 tmp; + spi_flash_write_enable(); + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + ret += spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz); + do + { + if(ret != M2M_SUCCESS) goto ERR; + ret += spi_flash_read_status_reg(&tmp); + } + while(tmp & 0x01); + ret += spi_flash_write_disable(); +ERR: + return ret; +} + +/** +* @fn spi_flash_rdid +* @brief Read SPI Flash ID +* @return SPI FLash ID +* @author M.S.M +* @version 1.0 +*/ +static uint32 spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32 reg = 0; + uint32 cnt = 0; + sint8 ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32 *)®); + if(M2M_SUCCESS != ret) break; + if(++cnt > 500) + { + ret = M2M_ERR_INIT; + break; + } + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + M2M_PRINT("Flash ID %x \n",(unsigned int)reg); + return reg; +} + +/** +* @fn spi_flash_unlock +* @brief Unlock SPI Flash +* @author M.S.M +* @version 1.0 +*/ +#if 0 +static void spi_flash_unlock(void) +{ + uint8 tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif + +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32offset +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_read(uint8 *pu8Buf, uint32 u32offset, uint32 u32Sz) +{ + sint8 ret = M2M_SUCCESS; + if(u32Sz > FLASH_BLOCK_SIZE) + { + do + { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if(M2M_SUCCESS != ret) goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while(u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** +* @fn spi_flash_write +* @brief Proram SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_write(uint8* pu8Buf, uint32 u32Offset, uint32 u32Sz) +{ +#ifdef PROFILING + unsigned long long t1 = 0; + uint32 percent =0; + uint32 tpercent =0; +#endif + sint8 ret = M2M_SUCCESS; + uint32 u32wsz; + uint32 u32off; + uint32 u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz/u32Blksz)+((u32Sz%u32Blksz)>0); + t1 = GetTickCount64(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if(u32Sz<=0) + { + M2M_ERR("Data size = %d",(int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if (u32off)/*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if(spi_flash_pp(u32Offset, pu8Buf, (uint16)BSP_MIN(u32Sz, u32wsz))!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + if (u32Sz < u32wsz) goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while (u32Sz > 0) + { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if(spi_flash_pp(u32Offset, pu8Buf, (uint16)u32wsz)!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r",((percent*100)/tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r",(GetTickCount64() - t1)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_erase +* @brief Erase from data from SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +* @author M. Abdelmawla +* @version 1.0 +*/ +sint8 spi_flash_erase(uint32 u32Offset, uint32 u32Sz) +{ + uint32 i = 0; + sint8 ret = M2M_SUCCESS; + uint8 tmp = 0; +#ifdef PROFILING + unsigned long long t; + t = GetTickCount64(); +#endif + M2M_DBG("\r\n>Start erasing...\r\n"); + for(i = u32Offset; i < (u32Sz +u32Offset); i += (16*FLASH_PAGE_SZ)) + { + ret += spi_flash_write_enable(); + ret += spi_flash_read_status_reg(&tmp); + ret += spi_flash_sector_erase(i); + ret += spi_flash_read_status_reg(&tmp); + do + { + if(ret != M2M_SUCCESS) goto ERR; + ret += spi_flash_read_status_reg(&tmp); + }while(tmp & 0x01); + + } + M2M_DBG("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (GetTickCount64()-t)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_get_size +* @brief Get size of SPI Flash +* @return Size of Flash +* @author M.S.M +* @version 1.0 +*/ +uint32 spi_flash_get_size(void) +{ + uint32 u32FlashId = 0, u32FlashPwr = 0; + static uint32 gu32InernalFlashSize= 0; + + if(!gu32InernalFlashSize) + { + u32FlashId = spi_flash_rdid();//spi_flash_probe(); + if(u32FlashId != 0xffffffff) + { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId>>16)&0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InernalFlashSize = 1< + +//extern void set_winc_spi_descriptor(struct spi_m_sync_descriptor *spi_inst); + +/* + * \brief Initialize Wifi library + */ +void wifi_init(tstrWifiInitParam *params) +{ + tstrWifiInitParam param; + int8_t ret; + + //set_winc_spi_descriptor(&WINC_SPI); //JFM + + /* Initialize the BSP. */ + nm_bsp_init(); + /* Initialize Wi-Fi parameters structure. */ + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + /* Initialize Wi-Fi driver with data and status callbacks. */ + param.pfAppWifiCb = params->pfAppWifiCb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + while (1) { + } + } +} diff --git a/ChaloupeLora.X/Source/winc3400/winc_init.h b/ChaloupeLora.X/Source/winc3400/winc_init.h new file mode 100644 index 0000000..dce666c --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400/winc_init.h @@ -0,0 +1,14 @@ +#ifndef WINC1500_MAIN_H +#define WINC1500_MAIN_H + +//#include "atmel_start.h" + +#include "driver/include/m2m_wifi.h" + +//#define CONF_WINC_PIN_CHIP_SELECT WINC_PIN_CHIP_SELECT +//#define CONF_WINC_PIN_CHIP_ENABLE WINC_PIN_CHIP_ENABLE +//#define CONF_WINC_PIN_RESET WINC_PIN_RESET + +void wifi_init(tstrWifiInitParam *params); + +#endif diff --git a/ChaloupeLora.X/Source/winc3400_142/bsp/include/nm_bsp.h b/ChaloupeLora.X/Source/winc3400_142/bsp/include/nm_bsp.h new file mode 100644 index 0000000..a22ad5c --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/bsp/include/nm_bsp.h @@ -0,0 +1,85 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains WINC3400 BSP APIs declarations. + + Description: + This module contains WINC3400 BSP APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup nm_bsp BSP + @brief + Description of the BSP (Board Support Package) module. + @{ + @defgroup DataT Data Types + @defgroup BSPDefine Defines + @defgroup BSPAPI Functions + @brief + Lists the available BSP (Board Support Package) APIs. + @} + */ + +/**@addtogroup BSPDefine + @{ + */ +#ifndef _NM_BSP_H_ +#define _NM_BSP_H_ + +#define BSP_MIN(x,y) ((x)>(y)?(y):(x)) +/*!< + * Computes the minimum value between \b x and \b y. + */ +/**@}*/ //BSPDefine + +/** + * @addtogroup BSPDefine + * @{ + */ + +#ifdef _NM_BSP_BIG_END +/*! Switch endianness of 32bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_32(x) \ +((((x) & 0x000000FF) << 24) + \ +(((x) & 0x0000FF00) << 8) + \ +(((x) & 0x00FF0000) >> 8) + \ +(((x) & 0xFF000000) >> 24)) +/*! Switch endianness of 16bit word (In the case that Host is BE) */ +#define NM_BSP_B_L_16(x) \ +((((x) & 0x00FF) << 8) + \ +(((x) & 0xFF00) >> 8)) +#else +/*! Retain endianness of 32bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_32(x) (x) +/*! Retain endianness of 16bit word (In the case that Host is LE) */ +#define NM_BSP_B_L_16(x) (x) +#endif +/**@}*/ //BSPDefine + +#endif /*_NM_BSP_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400_142/common/include/nm_common.h b/ChaloupeLora.X/Source/winc3400_142/common/include/nm_common.h new file mode 100644 index 0000000..fd420dd --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/common/include/nm_common.h @@ -0,0 +1,172 @@ +/******************************************************************************* + File Name: + nm_common.h + + Summary: + This module contains common APIs declarations. + + Description: + This module contains common APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup COMMON Common + @{ + @defgroup COMMONDEF Defines + @defgroup COMMONAPI Functions + @} + */ + +#ifndef _NM_COMMON_H_ +#define _NM_COMMON_H_ + +#include +#include "define.h" +#include "nm_bsp.h" +#include "nm_debug.h" + +/**@addtogroup COMMONDEF + * @{ + */ + +/*states*/ +#define M2M_SUCCESS ((int8_t)0) +#define M2M_ERR_SEND ((int8_t)-1) +#define M2M_ERR_RCV ((int8_t)-2) +#define M2M_ERR_MEM_ALLOC ((int8_t)-3) +#define M2M_ERR_TIME_OUT ((int8_t)-4) +#define M2M_ERR_INIT ((int8_t)-5) +#define M2M_ERR_BUS_FAIL ((int8_t)-6) +#define M2M_NOT_YET ((int8_t)-7) +#define M2M_ERR_FIRMWARE ((int8_t)-8) +#define M2M_SPI_FAIL ((int8_t)-9) +#define M2M_ERR_FIRMWARE_bURN ((int8_t)-10) +#define M2M_ACK ((int8_t)-11) +#define M2M_ERR_FAIL ((int8_t)-12) +#define M2M_ERR_FW_VER_MISMATCH ((int8_t)-13) +#define M2M_ERR_SCAN_IN_PROGRESS ((int8_t)-14) +#define M2M_ERR_INVALID_ARG ((int8_t)-15) + +#define NBIT31 (0x80000000) +#define NBIT30 (0x40000000) +#define NBIT29 (0x20000000) +#define NBIT28 (0x10000000) +#define NBIT27 (0x08000000) +#define NBIT26 (0x04000000) +#define NBIT25 (0x02000000) +#define NBIT24 (0x01000000) +#define NBIT23 (0x00800000) +#define NBIT22 (0x00400000) +#define NBIT21 (0x00200000) +#define NBIT20 (0x00100000) +#define NBIT19 (0x00080000) +#define NBIT18 (0x00040000) +#define NBIT17 (0x00020000) +#define NBIT16 (0x00010000) +#define NBIT15 (0x00008000) +#define NBIT14 (0x00004000) +#define NBIT13 (0x00002000) +#define NBIT12 (0x00001000) +#define NBIT11 (0x00000800) +#define NBIT10 (0x00000400) +#define NBIT9 (0x00000200) +#define NBIT8 (0x00000100) +#define NBIT7 (0x00000080) +#define NBIT6 (0x00000040) +#define NBIT5 (0x00000020) +#define NBIT4 (0x00000010) +#define NBIT3 (0x00000008) +#define NBIT2 (0x00000004) +#define NBIT1 (0x00000002) +#define NBIT0 (0x00000001) + +#ifndef BIG_ENDIAN +/*! Most significant byte of 32bit word (LE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (LE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (LE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (LE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +#else +/*! Most significant byte of 32bit word (BE) */ +#define BYTE_0(word) ((uint8_t)(((word) >> 24) & 0x000000FFUL)) +/*! Second most significant byte of 32bit word (BE) */ +#define BYTE_1(word) ((uint8_t)(((word) >> 16) & 0x000000FFUL)) +/*! Third most significant byte of 32bit word (BE) */ +#define BYTE_2(word) ((uint8_t)(((word) >> 8) & 0x000000FFUL)) +/*! Least significant byte of 32bit word (BE) */ +#define BYTE_3(word) ((uint8_t)(((word) >> 0) & 0x000000FFUL)) +#endif +/**@}*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! + * @ingroup COMMONAPI + * @fn int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + * @brief Converts a string of hex characters to bytes. + * @param[out] pu8Out + * Output buffer (eg {0x11, 0x12, 0x13,...}) + * @param[in] pu8In + * Input buffer (eg {0x31, 0x31, 0x31, 0x32, 0x31, 0x33, ...}) + * @param[in] u8SizeOut + * Length of output buffer (should be half of the length of the input buffer). + * @return @ref M2M_SUCCESS if successful, M2M_ERR_INVALID_ARG otherwise (eg unrecognised hexchar in input). + */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut); + +/*! + * @fn void nm_sleep(uint32_t u32TimeMsec); + * @brief Used to put the host to sleep for the specified duration (in milliseconds). + * Forcing the host to sleep for extended period may lead to host not being able to respond + * to WINC board events. It is important to be considerate while choosing the sleep period. + * @param [in] u32TimeMsec + * Time unit in milliseconds. + * @pre Initialize @ref nm_bsp_init first. + * @note Implementation of this function is host dependent. + * @warning Maximum value must nor exceed 4294967295 milliseconds which is equal to 4294967.295 seconds. + * @see nm_bsp_init + * @return None + */ +void nm_sleep(uint32_t u32TimeMsec); + +/*! + * @ingroup COMMONAPI + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void); +/**@}*/ +#ifdef __cplusplus +} +#endif +#endif /*_NM_COMMON_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400_142/common/include/nm_debug.h b/ChaloupeLora.X/Source/winc3400_142/common/include/nm_debug.h new file mode 100644 index 0000000..1a5ee88 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/common/include/nm_debug.h @@ -0,0 +1,60 @@ +/******************************************************************************* + File Name: + nm_debug.h + + Summary: + This module contains debug API declarations. + + Description: + This module contains debug API declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef _NM_DEBUG_H_ +#define _NM_DEBUG_H_ + + +//#include "wdrv_winc_debug.h" //JFM replaced include by direct definitions below +#define WDRV_DBG_VERBOSE_PRINT(...) +#define WDRV_DBG_TRACE_PRINT(...) +#define WDRV_DBG_INFORM_PRINT(...) +#define WDRV_DBG_ERROR_PRINT(...) + +/** + * @defgroup DebugDefines DebugDefines + * @ingroup WlanDefines + */ + +/**@{*/ + +#define M2M_ERR(...) WDRV_DBG_ERROR_PRINT(__VA_ARGS__) +#define M2M_INFO(...) WDRV_DBG_INFORM_PRINT(__VA_ARGS__) +#define M2M_DBG(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) +#define M2M_PRINT(...) WDRV_DBG_VERBOSE_PRINT(__VA_ARGS__) + +/**@}*/ + +#endif /* _NM_DEBUG_H_ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/common/source/nm_common.c b/ChaloupeLora.X/Source/winc3400_142/common/source/nm_common.c new file mode 100644 index 0000000..1900671 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/common/source/nm_common.c @@ -0,0 +1,114 @@ +/******************************************************************************* + File Name: + nm_common.c + + Summary: + This module contains common APIs implementations. + + Description: + This module contains common APIs implementations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "timer.h" +#include "BoardCfg.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_gpio.h" + + + +void __ISR(_EXTERNAL_0_VECTOR , ipl3) chip_isr(void) +//static void chip_isr(void) +{ + //JFM WINC LOW LEVEL + //JFM ŕ valider si ça fuck pas la patente vu qu'on est en interrupt... + //m2m_wifi_handle_events(); + + IFS0bits.INT0IF = 0; +} + +/*! + * @fn nm_sleep + * @brief Sleep in units of mSec + * @param[IN] u32TimeMsec + * Time in milliseconds + */ +void nm_sleep(uint32_t u32TimeMsec) +{ + Sleep(u32TimeMsec); +} + +/*! + * @fn nm_reset + * @brief Reset NMC3400 SoC by setting CHIP_EN and RESET_N signals low, + * CHIP_EN high then RESET_N high + */ +void nm_reset(void) +{ + //JFM WINC LOW LEVEL + WIFI_CHP_EN_PIN = 0; + WIFI_CHP_RST_PIN = 0; +// Sleep(1); //JFM + Sleep(100); + WIFI_CHP_EN_PIN = 1; +// Sleep(5); JFM + Sleep(150); + WIFI_CHP_RST_PIN = 1; +} + +/* Convert hexchar to value 0-15 */ +static uint8_t hexchar_2_val(uint8_t ch) +{ + ch -= 0x30; + if (ch <= 9) + return ch; + ch |= 0x20; + ch -= 0x31; + if (ch <= 5) + return ch + 10; + return 0xFF; +} + +/* Convert hexstring to bytes */ +int8_t hexstr_2_bytes(uint8_t *pu8Out, uint8_t *pu8In, uint8_t u8SizeOut) +{ + while(u8SizeOut--) + { + uint8_t u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out = u8Out * 0x10; + u8Out = hexchar_2_val(*pu8In++); + if (u8Out > 0xF) + return M2M_ERR_INVALID_ARG; + *pu8Out += u8Out; + pu8Out++; + } + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/ecc_types.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/ecc_types.h new file mode 100644 index 0000000..51d4065 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/ecc_types.h @@ -0,0 +1,300 @@ +/******************************************************************************* + File Name: + ecc_types.h + + Summary: + Elliptic Curve Cryptography Module Interface. + + Description: + Elliptic Curve Cryptography Module Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef __ECC_TYPES_H__ +#define __ECC_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + + +#define ECC_LARGEST_CURVE_SIZE (32) +/*!< + The size of the the largest supported EC. For now, assuming + the 256-bit EC is the largest supported curve type. +*/ + + +#define ECC_POINT_MAX_SIZE ECC_LARGEST_CURVE_SIZE +/*!< + Maximum size of one coordinate of an EC point. +*/ + + +#define ECC_POINT_MAX_SIZE_WORDS (ECC_POINT_MAX_SIZE / 4) +/*!< + SIZE in 32-bit words. +*/ + + +#define ECC_NUM_SUPP_CURVES ((sizeof(gastrECCSuppList)) / (sizeof(tstrEllipticCurve))) +/*!< +*/ + + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/**@addtogroup SSLEnums + * @{ + */ +/*! +@enum \ + tenuEcNamedCurve + +@brief EC Named Curves + + Defines a list of supported ECC named curves. +*/ +typedef enum EcNamedCurve{ + EC_SECP192R1 = 19, + /*!< + It is defined by NIST as P192 and by the SEC Group as secp192r1. + */ + EC_SECP256R1 = 23, + /*!< + It is defined by NIST as P256 and by the SEC Group as secp256r1. + */ + EC_SECP384R1 = 24, + /*!< + It is defined by NIST as P384 and by the SEC Group as secp384r1. + */ + EC_SECP521R1 = 25, + /*!< + It is defined by NIST as P521 and by the SEC Group as secp521r1. + */ + EC_UNKNOWN = 255 +}tenuEcNamedCurve; + + +/*! +@struct \ + tstrECPoint + +@brief Elliptic Curve point representation +*/ +typedef struct EcPoint{ + uint8_t X[ECC_POINT_MAX_SIZE]; + /*!< + The X-coordinate of the ec point. + */ + uint8_t Y[ECC_POINT_MAX_SIZE]; + /*!< + The Y-coordinate of the ec point. + */ + uint16_t u16Size; + /*!< + Point size in bytes (for each of the coordinates). + */ + uint16_t u16PrivKeyID; + /*!< + ID for the corresponding private key. + */ +}tstrECPoint; + + +/*! +@struct \ + tstrECDomainParam + +@brief ECC Curve Domain Parameters + + The structure defines the ECC domain parameters for curves defined over prime finite fields. +*/ +typedef struct EcDomainParam{ + uint32_t p[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t a[ECC_POINT_MAX_SIZE_WORDS]; + uint32_t b[ECC_POINT_MAX_SIZE_WORDS]; + tstrECPoint G; +}tstrECDomainParam; + + +/*! +@struct \ + tstrEllipticCurve + +@brief + Definition of an elliptic curve +*/ +typedef struct{ + tenuEcNamedCurve enuType; + tstrECDomainParam strParam; +}tstrEllipticCurve; + +/*! +@enum \ + tenuEccREQ + +@brief ECC operations that may be requested by WINC. + + These are passed in the u16REQ field of @ref tstrEccReqInfo, which is used in both the request + from the WINC and the response to the WINC. +*/ +typedef enum{ + ECC_REQ_NONE, + /*!< */ + ECC_REQ_CLIENT_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as client. + */ + ECC_REQ_SERVER_ECDH, + /*!< + Derive the shared secret from ECDHE key exchange as server. + */ + ECC_REQ_GEN_KEY, + /*!< + Generate a key pair to be used in ECDHE key exchange as server. + */ + ECC_REQ_SIGN_GEN, + /*!< + Generate the signature for a given curve and value. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ + ECC_REQ_SIGN_VERIFY + /*!< + Verify a list of signatures. Each set of value/signature/key/curve information needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tenuEccREQ; + +/*! +@struct \ + tstrEcdhReqInfo + +@brief Information relating to operations of type @ref ECC_REQ_CLIENT_ECDH, @ref ECC_REQ_GEN_KEY + and @ref ECC_REQ_SERVER_ECDH. +*/ +typedef struct{ + tstrECPoint strPubKey; + /*!< + Public key. Usage depends on type of operation. + */ + uint8_t au8Key[ECC_POINT_MAX_SIZE]; + /*!< + Pre master secret generated during operations of type @ref ECC_REQ_CLIENT_ECDH and + @ref ECC_REQ_SERVER_ECDH. + */ +}tstrEcdhReqInfo; + +/*! +@struct \ + tstrEcdsaVerifyReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_VERIFY. +*/ +typedef struct{ + uint32_t u32nSig; + /*!< + Number of sets of value/signature/key/curve information for verifying. Each set needs to be + retrieved via @ref m2m_ssl_retrieve_next_for_verifying. + */ +}tstrEcdsaVerifyReqInfo; + +/*! +@struct \ + tstrEcdsaSignReqInfo + +@brief Information relating to requests of type @ref ECC_REQ_SIGN_GEN. +*/ +typedef struct{ + uint16_t u16CurveType; + /*!< + The named curve to be used for signing, to be cast to type @ref tenuEcNamedCurve. + */ + uint16_t u16HashSz; + /*!< + The size of the value to be signed. The value needs to be retrieved via + @ref m2m_ssl_retrieve_hash. + */ +}tstrEcdsaSignReqInfo; + +/*! +@struct \ + tstrEccReqInfo + +@brief Information relating to ECC operations. + + This is used in both the request from the WINC and the response to the WINC. +*/ +typedef struct{ + uint16_t u16REQ; + /*!< + The requested ECC operation, to be cast to type @ref tenuEccREQ. + */ + uint16_t u16Status; + /*!< + The status of the operation: zero for success; non-zero for failure. + This field should be used in responses and ignored in requests. + */ + uint32_t u32UserData; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + uint32_t u32SeqNo; + /*!< + This value is used internally. The value set in the response must match the value received + in the request. + */ + union{ + tstrEcdhReqInfo strEcdhREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_CLIENT_ECDH, + @ref ECC_REQ_GEN_KEY or @ref ECC_REQ_SERVER_ECDH. + */ + tstrEcdsaSignReqInfo strEcdsaSignREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_GEN. + This field is used in requests and ignored in responses. + */ + tstrEcdsaVerifyReqInfo strEcdsaVerifyREQ; + /*!< + Information relating to an operation of type @ref ECC_REQ_SIGN_VERIFY. + This field is used in requests and ignored in responses. + */ + }; +}tstrEccReqInfo; +/**@}*/ //SSLEnums + +#endif /* __ECC_TYPES_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_flash.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_flash.h new file mode 100644 index 0000000..b279933 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_flash.h @@ -0,0 +1,188 @@ +/******************************************************************************* + WINC Flash Interface. + + File Name: + m2m_flash.h + + Summary: + WINC Flash Interface + + Description: + WINC Flash Interface + +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup FLASHAPI Flash +*/ + +#ifndef __M2M_FLASH_H__ +#define __M2M_FLASH_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "nm_common.h" +#include "m2m_types.h" + +/**@defgroup FlashEnums Enumeration/Typedefs + * @ingroup FLASHAPI + * @{*/ + +/*! +@enum tenuWincFlashRegion + +@brief The regions of WINC flash available for accessing. +*/ +typedef enum +{ + /*! Access to the entire flash address space. */ + WINC_FLASH_REGION_RAW, + /*! Access to the active firmware region. */ + WINC_FLASH_REGION_FIRMWARE_ACTIVE, + /*! Access to the inactive firmware region. */ + WINC_FLASH_REGION_FIRMWARE_INACTIVE, + /*! Access to PLL table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_PLL_TABLE, + /*! Access to gain table region. Erase is not supported for this region. */ + WINC_FLASH_REGION_GAIN_TABLE, + /*! Access to PLL and gain tables region. Erase is supported for this region. */ + WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + /*! Access to TLS root certificate region. */ + WINC_FLASH_REGION_ROOT_CERTS, + /*! Access to TLS local certificate region. */ + WINC_FLASH_REGION_LOCAL_CERTS, + /*! Access to connection parameters region. */ + WINC_FLASH_REGION_CONN_PARAM, + /*! Access to HTTP files region. This region is also erased/written by erase/write of firmware regions. */ + WINC_FLASH_REGION_HTTP_FILES, + /*! Number of regions. */ + WINC_FLASH_NUM_REGIONS +} tenuWincFlashRegion; + +/**@} +*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/** \defgroup FLASHFUNCTIONS Functions +* @ingroup FLASHAPI +*/ +/**@{*/ + +/*! +@fn \ + int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +@brief Erase one or more sectors within a WINC flash region. + +@param [in] enuRegion + Region of flash in which to erase. +@param [in] u8StartSector + Sector offset (within region) of first sector to erase. +@param [in] u8NumSectors + Number of sectors to erase. + +@return M2M_SUCCESS - The erase completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors); + +/*! +@fn \ + int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Write the number of bytes specified to a WINC flash location. + +@param [in] enuRegion + Region of flash in which to write. +@param [in] pvBuffer + Pointer to buffer containing the data to write. +@param [in] u32Offset + Byte offset (within region) of write location. +@param [in] u32Size + Number of bytes to write. + +@return M2M_SUCCESS - The write completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +@warning The write operation does not erase the flash device first, therefore the user + must ensure the flash region has been erased first. +*/ +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +@brief Read the number of bytes specified from a WINC flash location. + +@param [in] enuRegion + Region of flash from which to read. +@param [out] pvBuffer + Pointer to buffer to populate with the data being read. +@param [in] u32Offset + Byte offset (within region) of read location. +@param [in] u32Size + Number of bytes to read. + +@return M2M_SUCCESS - The read completed successfully. + M2M_ERR_INVALID_ARG - The parameters were invalid. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. +*/ +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size); + +/*! +@fn \ + int8_t m2m_flash_switch_firmware(void); + +@brief Switch the active and inactive firmware images. + +@return M2M_SUCCESS - The firmware switch completed successfully. + M2M_ERR_FAIL - The request encountered an error. + +@pre The WINC must have been initialised but must not be running. This can be done via + @ref m2m_wifi_init_hold, @ref m2m_wifi_reinit_hold or @ref m2m_wifi_download_mode. + +*/ +int8_t m2m_flash_switch_firmware(void); + +/**@}*/ +#endif /* __M2M_FLASH_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_hif.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_hif.h new file mode 100644 index 0000000..4728429 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_hif.h @@ -0,0 +1,243 @@ +/******************************************************************************* + File Name: + m2m_hif.h + + Summary: + This module contains M2M host interface API definitions. + + Description: + This module contains M2M host interface API definitions. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_HIF_ +#define _M2M_HIF_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define M2M_HIF_MAX_PACKET_SIZE (1600 - 4) +/*!< Maximum size of the buffer could be transferred between Host and Firmware. +*/ + +#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr) + 4) + + +/** +* @struct tstrHifHdr +* @brief Structure to hold HIF header +*/ +typedef struct +{ + uint8_t u8Gid; /*!< Group ID */ + uint8_t u8Opcode; /*!< OP code */ + uint16_t u16Length; /*!< Payload length */ +} tstrHifHdr; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@typedef typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +@brief used to point to Wi-Fi call back function depend on Arduino project or other projects. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +@param [in] grp + HIF group type. +*/ +typedef void (*tpfHifCallBack)(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr); +/** +* @fn int8_t hif_init(void *arg); +* @brief + To initialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_init(void *arg); +/** +* @fn int8_t hif_deinit(void *arg); +* @brief + To Deinitialize HIF layer. +* @param [in] arg +* Pointer to the arguments. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_deinit(void *arg); +/** +* @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); +* @brief +* To check the compatibility of an image with the current driver. +* @param [in] u16HifInfo +* HIF info of image to be checked. +* @return The function shall return ZERO for compatible image and a negative value otherwise. +*/ +int8_t hif_check_compatibility(uint16_t u16HifInfo); +/** +* @fn int8_t hif_enable_access(void); +* @brief +* To enable access to HIF layer, based on HIF level of Firmware. +* This function reads HIF level directly from a register written by Firmware. +* @return The function shall return ZERO for full match operation and a negative value if operation is restricted. +*/ +int8_t hif_enable_access(void); +/** +* @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +* @brief +* To check that a particular hif message is supported with the current driver/firmware pair. +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @return The function shall return ZERO for support and a negative value otherwise. +*/ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); +/** +* @fn int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +* @brief Send packet using host interface. + +* @param [in] u8Gid +* Group ID. +* @param [in] u8Opcode +* Operation ID. +* @param [in] pu8CtrlBuf +* Pointer to the Control buffer. +* @param [in] u16CtrlBufSize + Control buffer size. +* @param [in] u16DataOffset + Packet Data offset. +* @param [in] pu8DataBuf +* Packet buffer Allocated by the caller. +* @param [in] u16DataSize + Packet buffer size (including the HIF header). +* @return The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset); +/** +* @fn hif_receive +* @brief Host interface interrupt service routine +* @param [in] u32Addr +* Receive start address +* @param [out] pu8Buf +* Pointer to receive buffer. Allocated by the caller +* @param [in] u16Sz +* Receive buffer size +* @param [in] isDone +* If you don't need any more packets send True otherwise send false +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone); +/** +* @fn hif_register_cb +* @brief + To set Callback function for every Component. + +* @param [in] u8Grp +* Group to which the Callback function should be set. + +* @param [in] fn +* function to be set to the specified group. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn); +/** +* @fn int8_t hif_chip_sleep(void); +* @brief + To make the chip sleep. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ +int8_t hif_chip_sleep(void); +/** +* @fn int8_t hif_chip_wake(void); +* @brief + To Wakeup the chip. +* @return + The function shall return ZERO for successful operation and a negative value otherwise. +*/ + +int8_t hif_chip_wake(void); +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype); +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ + +uint8_t hif_get_sleep_mode(void); + +/** +* @fn hif_handle_isr(void) +* @brief + Handle interrupt received from WINC3400 firmware. +* @return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ota.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ota.h new file mode 100644 index 0000000..d6466d8 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ota.h @@ -0,0 +1,370 @@ +/******************************************************************************* + WINC3400 OTA Upgrade API Interface + + File Name: + m2m_ota.h + + Summary: + WINC3400 OTA Upgrade API Interface + + Description: + WINC3400 OTA Upgrade API Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +/**@defgroup OTAAPI OTA + @brief + The WINC supports OTA (Over-The-Air) updates. Using the APIs described in this module, + it is possible to request an ATWINC15x0 to update its firmware, or safely rollback to + the previous firmware version.\n There are also APIs to download files and store them in + the WINC's Flash (supported by ATWINC1510 only), which can be used for Host MCU OTA + updates or accessing information stored remotely. + @{ + @defgroup OTACALLBACKS Callbacks + @brief + Lists the different callbacks that can be used during OTA updates.\n + Callbacks of type @ref tpfOtaNotifCb and @ref tpfOtaUpdateCb should be passed + onto @ref m2m_ota_init at system initialization. Other callbacks are provided + to handle the various steps of Host File Download. + + @defgroup OTADEFINE Defines + @brief + Specifies the macros and defines used by the OTA APIs. + + @defgroup OTATYPEDEF Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the OTA APIs. + + @defgroup OTAFUNCTIONS Functions + @brief + Lists the full set of available APIs to manage OTA updates and Host File Downloads. + @} +*/ + +#ifndef __M2M_OTA_H__ +#define __M2M_OTA_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); + +@brief + A callback to get OTA status update, the callback provides the status type and its status.\n + The OTA callback provides the download status, the switch to the downloaded firmware status + and roll-back status. + +@param[in] u8OtaUpdateStatusType + Possible values are listed in @ref tenuOtaUpdateStatusType. + +@param[in] u8OtaUpdateStatus + Possible values are listed as enumerated by @ref tenuOtaUpdateStatus. + +@note + Executes other callbacks passed to the OTA module. + +@see + tenuOtaUpdateStatusType + tenuOtaUpdateStatus + */ +typedef void (*tpfOtaUpdateCb)(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus); +/**@}*/ // OTACALLBACKS + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +@brief + Synchronous initialization function for the OTA layer by registering the update callback.\n + The notification callback is not supported at the current version. Calling this API is a + MUST for all the OTA API's. + +@param[in] pfOtaUpdateCb + OTA Update callback function. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl); + +@brief + Request OTA start update using the download URL. The OTA module will download the OTA image, ensure integrity of the image + and update the validity of the image in the control structure. On completion, a callback of type @ref tpfOtaUpdateCb is called + (callback previously provided via @ref m2m_ota_init). Switching to the updated image additionally requires completion of + @ref m2m_ota_switch_firmware, followed by a WINC reset. + +@param[in] pcDownloadUrl + The download firmware URL, according to the application server. + +@warning + Calling this API does not guarantee OTA WINC image update, it depends on the connection with the + download server and the validity of the image.\n + Calling this API invalidates any previous valid rollback image, irrespective of the result, but when + the OTA succeeds, the current image will become the rollback image after @ref m2m_ota_switch_firmware. + +@pre + @ref m2m_ota_init is a prerequisite and must have been called before using @ref m2m_ota_start_update.\n + Switching to the newly downloaded image requires calling @ref m2m_ota_switch_firmware API. + +@sa + @ref m2m_ota_init + @ref m2m_ota_switch_firmware + @ref tpfOtaUpdateCb + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + Note that successful operation in this context means the OTA update request has reached the firmware OTA module. + It does not indicate whether or not the image update succeeded. + +@section OTAExample Example + This example shows how an OTA image update and switch is carried out. + It demonstrates use of the following OTA APIs: + - @ref m2m_ota_init + - @ref tpfOtaUpdateCb + - @ref m2m_ota_start_update + - @ref m2m_ota_switch_firmware + - @ref m2m_ota_rollback + + It also makes use of @ref m2m_wifi_check_ota_rb in order to inform OTA decisions. +@code +static void OtaUpdateCb(uint8_t u8OtaUpdateStatusType, uint8_t u8OtaUpdateStatus) +{ + int8_t s8tmp; + tstrM2mRev strtmp; + M2M_INFO("%d %d\n", u8OtaUpdateStatusType, u8OtaUpdateStatus); + switch(u8OtaUpdateStatusType) + { + case DL_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("OTA download succeeded\n"); + s8tmp = m2m_wifi_check_ota_rb(); + if(s8tmp == M2M_ERR_FW_VER_MISMATCH) + { + // In this case the application SHOULD update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without updating host + // driver would lead to severely limited functionality (i.e. OTA rollback only). + } + else if(s8tmp == M2M_SUCCESS) + { + // In this case the application MAY WANT TO update the host driver before calling + // @ref m2m_ota_switch_firmware(). Switching firmware image and resetting without + // updating host driver may lead to suboptimal functionality. + } + else + { + M2M_INFO("Cannot recognize downloaded image\n"); + // In this case the application MUST NOT update the host driver if such an update would change the + // driver HIF Major field. Firmware switch @ref using m2m_ota_switch_firmware() is blocked. + break; + } + // Switch to the upgraded firmware + M2M_INFO("Now switching active partition...\n"); + s8tmp = m2m_ota_switch_firmware(); + } + break; + case SW_STATUS: + case RB_STATUS: + if(u8OtaUpdateStatus == OTA_STATUS_SUCCESS) + { + M2M_INFO("Switch/Rollback succeeded\n"); + + // Start the host SW upgrade if required, then system reset is required (Reinitialize the driver) + + M2M_INFO("Now resetting the system...\n"); + system_reset(); + } + break; + } +} + +static void wifi_event_cb(uint8_t u8WiFiEvent, void *pvMsg) +{ + // ... + case M2M_WIFI_REQ_DHCP_CONF: + { + // After successful connection, start the OTA upgrade + m2m_ota_start_update(OTA_URL); + } + break; + default: + break; + // ... +} + +int main(void) +{ + tstrWifiInitParam param; + int8_t s8Ret = M2M_SUCCESS; + bool rollback_required = FALSE; + + // System init, etc should be here... + + memset((uint8_t *)¶m, 0, sizeof(param)); + param.pfAppWifiCb = wifi_event_cb; + + // Initialize the WINC Driver + s8Ret = m2m_wifi_init(¶m); + if(s8Ret == M2M_ERR_FW_VER_MISMATCH) + { + M2M_ERR("Firmware version mismatch\n"); + s8Ret = m2m_wifi_check_ota_rb(); + if(s8Ret == M2M_SUCCESS) + { + // In this case the image in the inactive partition has compatible HIF. We will switch/rollback to it + // after initializing the OTA module. + rollback_required = TRUE; + } + } + if(M2M_SUCCESS != s8Ret) + { + M2M_ERR("Driver Init Failed <%d>\n", s8Ret); + while(1); + } + // Initialize the OTA module + m2m_ota_init(OtaUpdateCb, NULL); + if(rollback_required) + { + // We need to call either @ref m2m_ota_rollback() or @ref m2m_ota_switch_firmware() (functionally equivalent). + m2m_ota_rollback(); + } + else + { + // Connect to AP that provides connection to the OTA server + m2m_wifi_default_connect(); + } + while(1) + { + // Handle the app state machine plus the WINC event handler + while(m2m_wifi_handle_events(NULL) != M2M_SUCCESS) { + } + } +} +@endcode + */ +int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_rollback(void); + +@brief + Request OTA Roll-back to the old (inactive) WINC image, the WINC firmware will check the validity of the inactive image + and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb is called (application must previously have + provided the callback via @ref m2m_ota_init). If the callback indicates successful activation, the newly-activated image + will start running after next system reset. + +@warning + If rollback requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_rollback(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_abort(void); + +@brief + Request the WINC to abort an OTA in progress.\n + If no download is in progress, the API will respond with failure. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for a successful operation and a negative value otherwise. + */ +int8_t m2m_ota_abort(void); + +/*! +@ingroup OTAFUNCTIONS +@fn \ + int8_t m2m_ota_switch_firmware(void); + +@brief + Request switch to the updated WINC image. The WINC firmware will check the validity of the + inactive image and activate it if valid. On completion, a callback of type @ref tpfOtaUpdateCb + is called (application must previously have provided the callback via @ref m2m_ota_init). + If the callback indicates successful activation, the newly-activated image will start running + after next system reset. + +@warning + If switch requires a host driver update in order to maintain HIF compatibility (HIF + major value change), then it is recommended to update the host driver prior to calling this API.\n + In the event of system reset with incompatible driver/firmware, compatibility can be + recovered by calling @ref m2m_ota_rollback or @ref m2m_ota_switch_firmware. See @ref OTAExample. + +@sa + m2m_ota_init + m2m_ota_start_update + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ota_switch_firmware(void); + + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_OTA_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_periph.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_periph.h new file mode 100644 index 0000000..27d1051 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_periph.h @@ -0,0 +1,307 @@ +/******************************************************************************* + WINC3400 Peripherals Application Interface. + + File Name: + m2m_periph.h + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _M2M_PERIPH_H_ +#define _M2M_PERIPH_H_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@struct \ + tstrPerphInitParam + +@brief + Peripheral module initialization parameters. +*/ +typedef struct { + void *arg; +} tstrPerphInitParam; + +/*! +@enum \ + tenuGpioNum + +@brief + A list of GPIO numbers configurable through the m2m_periph module. +*/ +typedef enum { + M2M_PERIPH_GPIO3, + M2M_PERIPH_GPIO4, + M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ + M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ + M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ + M2M_PERIPH_GPIO_MAX +} tenuGpioNum; + +/*! +@enum \ + tenuI2cMasterSclMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SCL signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is available on HOST_WAKEUP. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is available on SD_DAT3 (GPIO 7). */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is available on GPIO 13. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is available on GPIO 4.*/ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is available on I2C slave SCL. */ + M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM +} tenuI2cMasterSclMuxOpt; + +/*! +@enum \ + tenuI2cMasterSdaMuxOpt + +@brief + Allowed pin multiplexing options for I2C master SDA signal. +*/ +typedef enum { + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK, /*!< I2C master SDA is available on RTC_CLK. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is available on SD_CLK (GPIO 8). */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is available on GPIO 14. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is available on GPIO 6.*/ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is available on I2C slave SDA. */ + M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM +} tenuI2cMasterSdaMuxOpt; + +/*! +@struct \ + tstrI2cMasterInitParam + +@brief + I2C master configuration parameters. +@sa + tenuI2cMasterSclMuxOpt + tenuI2cMasterSdaMuxOpt +*/ +typedef struct { + uint8_t enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ + uint8_t enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ + uint8_t u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ +} tstrI2cMasterInitParam; + +/*! +@enum \ + tenuI2cMasterFlags + +@brief + Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read +@sa + m2m_periph_i2c_master_write + m2m_periph_i2c_master_read +*/ +typedef enum { + I2C_MASTER_NO_FLAGS = 0x00, + /*!< No flags. */ + I2C_MASTER_NO_STOP = 0x01, + /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ + I2C_MASTER_NO_START = 0x02, + /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ +} tenuI2cMasterFlags; + +/*! +@enum \ + tenuPullupMask + +@brief + Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. +@sa + m2m_periph_pullup_ctrl + +*/ +typedef enum { + M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 8), + M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_RXD = (1ul << 11), + M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 12), +} tenuPullupEnable1Mask; +typedef enum { + M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 0), + M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 1), + M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 2), + M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 3), + M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 4), + M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 5), + M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 6), + M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 7), + M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 9), + M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 10), + M2M_PERIPH_PULLUP_DIS_GPIO_38 = (1ul << 25), + M2M_PERIPH_PULLUP_DIS_GPIO_39 = (1ul << 26), + M2M_PERIPH_PULLUP_DIS_GPIO_40 = (1ul << 27), + M2M_PERIPH_PULLUP_DIS_GPIO_42 = (1ul << 29), +} tenuPullupEnable2Mask; +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! +@fn \ + int8_t m2m_periph_init(tstrPerphInitParam * param); + +@brief + Initialize the WINC3400 peripheral driver module. + +@param [in] param + Peripheral module initialization structure. See members of tstrPerphInitParam. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tstrPerphInitParam +*/ +int8_t m2m_periph_init(tstrPerphInitParam *param); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +@brief + Configure a specific WINC3400 pad as a GPIO and sets its direction (input or output). + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioDir + GPIO direction: Zero = input. Non-zero = output. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir); + +/*! +@fn \ + int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +@brief + Set an WINC3400 GPIO output level high or low. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [in] u8GpioVal + GPIO output value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t * pu8GpioVal); + +@brief + Read an WINC3400 GPIO input level. + +@param [in] u8GpioNum + GPIO number. Allowed values are defined in tenuGpioNum. + +@param [out] pu8GpioVal + GPIO input value. Zero = low, non-zero = high. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuGpioNum +*/ +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal); + +/*! +@fn \ + int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +@brief + Control the programmable pull-up resistor on the chip pads . + + +@param [in] pinmask + Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. + +@param [in] enable + Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. + +@return + The function SHALL return 0 for success and a negative value otherwise. + +@sa + tenuPullupMask +*/ +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable); + +#ifdef __cplusplus +} +#endif + +#endif /* _M2M_PERIPH_H_ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ssl.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ssl.h new file mode 100644 index 0000000..df22ef7 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_ssl.h @@ -0,0 +1,255 @@ +/******************************************************************************* + File Name: + m2m_ssl.h + + Summary: + WINC SSL Interface. + + Description: + WINC SSL Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +/** @defgroup SSLAPI SSL + @brief + Provides a description of the SSL Layer. + @{ + @defgroup SSLCallbacks Callbacks + @brief + Provides detail on the available callbacks for the SSL Layer. + + @defgroup SSLEnums Enumerations and Typedefs + @brief + Specifies the enums and Data Structures used by the SSL APIs. + + @defgroup SSLFUNCTIONS Functions + @brief + Provides detail on the available APIs for the SSL Layer. + @} +*/ + +#ifndef __M2M_SSL_H__ +#define __M2M_SSL_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" +#include "m2m_types.h" +#include "nmdrv.h" +#include "ecc_types.h" +#include "socket.h" + +/*! +@ingroup SSLCallbacks +@typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void* pvMsg); +@brief A callback to get SSL notifications. +@param[in] u8MsgType + The type of the message received. +@param[in] pvMsg + A structure to provide notification payload. +*/ +typedef void (*tpfAppSSLCb)(uint8_t u8MsgType, void *pvMsg); + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); +@brief Initializes the SSL layer. +@param[in] pfAppSSLCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz); +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t* pu8Buffer, uint32_t u32BufferSz); +@brief Sends certificates to the WINC. +@param[in] pu8Buffer + Pointer to the certificates. The buffer format must match the format of @ref tstrTlsSrvSecHdr. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void); + +/*! +@ingroup SSLFUNCTIONS +@fn NMI_API void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void); + +/*! +@ingroup SSLFUNCTIONS +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void); + +/*! +@ingroup SSLFUNCTIONS +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by + the caller in the form of a bitmap containing the required ciphers to be on.\n + There is no need to call this function if the application will not change the default ciphersuites. +@param[in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP); + +#endif /* __M2M_SSL_H__ */ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_types.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_types.h new file mode 100644 index 0000000..8b9015e --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/m2m_types.h @@ -0,0 +1,2745 @@ +/******************************************************************************* + File Name: + m2m_types.h + + Summary: + WINC3400 Application Interface Internal Types + + Description: + WINC3400 Application Interface Internal Types + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef __M2M_WIFI_TYPES_H__ +#define __M2M_WIFI_TYPES_H__ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_common.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup VERSION Version + */ +/**@defgroup VERSIONDEF Defines + * @ingroup VERSION + * @{ + */ + +/* + Layout of HIF_LEVEL fields + | x x x x x x | x x x x x x x x | + | 13:8 | 7:0 | + | HIF_MAJOR | HIF_MINOR | + | HIF_LEVEL | + + HIF compatibility (checked by driver after wifi boot). + + Check Firmware HIF_MAJOR + |___ + | Does not match Driver - Recommend either: + | > checking compatibility of Cortus image stored in inactive partition + | (m2m_wifi_check_ota_rb()) then swapping to it using OTA rollback or switch. + | > updating Host with out of band method. + |___ + Matches Driver - All APIs can be attempted. + | - Cortus image can be updated (OTA download) + | - New Host image can be retrieved (socket recv) + | + Check Firmware HIF_MINOR + |___ + | Less than Driver - Driver may refuse to execute some APIs (API would return M2M_ERR_SEND). + | - Recommend updating Cortus image using OTA download to use newer Firmware. + |___ + | Equal to Driver - Driver supports all APIs. + |___ + Greater than Driver - Driver supports all APIs. + - Recommend reviewing potential benefit of updating Host to use newer Driver. + + When an OTA update involving HIF_MAJOR change is required, the following order is recommended: + 1. m2m_ota_start_update() to store new Cortus image in inactive partition. + 2. Socket recv() to retrieve new Host image (including new WINC Driver). + 3. Application code to make Host image available in host flash. + 4. m2m_ota_switch_firmware() to switch active/inactive partition (will take effect after system_reset()). + 5. system_reset() to restart with new WINC Driver / Firmware. + Note that in the event of (unintentional) system reset after step (3), the remaining steps (4) and (5) should still be + run after the reset. +*/ +/* Selection of HIF_INFO +*/ +#define M2M_HIF_INFO_SHIFT (0) +#define M2M_HIF_INFO_MASK (0xffff) +/* Subdivision of HIF_INFO +*/ +#define M2M_HIF_BLOCK_SHIFT (14) +#define M2M_HIF_BLOCK_MASK (0x3) +#define M2M_HIF_LEVEL_SHIFT (0) +#define M2M_HIF_LEVEL_MASK (0x3fff) +/* Subdivision of HIF_LEVEL +*/ +#define M2M_HIF_MAJOR_SHIFT (8) +#define M2M_HIF_MAJOR_MASK (0x3f) +#define M2M_HIF_MINOR_SHIFT (0) +#define M2M_HIF_MINOR_MASK (0xff) + +#define M2M_GET_HIF_INFO(hif_ver) ((uint16_t)(((hif_ver) >> M2M_HIF_INFO_SHIFT) & M2M_HIF_INFO_MASK)) +#define M2M_GET_HIF_BLOCK(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_BLOCK_SHIFT) & M2M_HIF_BLOCK_MASK)) +#define M2M_GET_HIF_LEVEL(hif_info) ((uint16_t)(((hif_info) >> M2M_HIF_LEVEL_SHIFT) & M2M_HIF_LEVEL_MASK)) +#define M2M_GET_HIF_MAJOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MAJOR_SHIFT) & M2M_HIF_MAJOR_MASK)) +#define M2M_GET_HIF_MINOR(hif_info) ((uint8_t)(((hif_info) >> M2M_HIF_MINOR_SHIFT) & M2M_HIF_MINOR_MASK)) + +#define M2M_MAKE_HIF_INFO(hif_level) ( \ + (((uint16_t)(hif_level) & M2M_HIF_LEVEL_MASK) << M2M_HIF_LEVEL_SHIFT) | \ + (((uint16_t)M2M_HIF_BLOCK_VALUE & M2M_HIF_BLOCK_MASK) << M2M_HIF_BLOCK_SHIFT) ) + +/*======*======*======*======* + HIF LEVEL + *======*======*======*======*/ + +#define M2M_HIF_BLOCK_VALUE (2) +/*!< Drv/Fw blocking compatibility check. + */ +#define M2M_HIF_MAJOR_VALUE (1) +/*!< Drv/Fw major compatibility check. +*/ +#define M2M_HIF_MINOR_VALUE (5) +/*!< Drv/Fw minor compatibility check. +*/ + +#define M2M_HIF_LEVEL ( \ + ((M2M_HIF_MAJOR_VALUE & M2M_HIF_MAJOR_MASK) << M2M_HIF_MAJOR_SHIFT) | \ + ((M2M_HIF_MINOR_VALUE & M2M_HIF_MINOR_MASK) << M2M_HIF_MINOR_SHIFT) \ + ) +/*!< HIF Level (Major/Minor) for Drv/Fw compatibility. +*/ + +/*======*======*======*======* + DRIVER VERSION NO INFO + *======*======*======*======*/ + +#define M2M_DRIVER_VERSION_MAJOR_NO (1) +/*!< Driver Major release version number. +*/ +#define M2M_DRIVER_VERSION_MINOR_NO (2) +/*!< Driver Minor release version number. +*/ +#define M2M_DRIVER_VERSION_PATCH_NO (0) +/*!< Driver patch release version number. +*/ + +/**@}*/ // VERSIONDEF + +/**@addtogroup WlanDefines + * @ingroup m2m_wifi + */ +/**@{*/ + +#define M2M_BUFFER_MAX_SIZE (1600UL - 4) +/*!< Maximum size for the shared packet buffer. + */ + +#define M2M_MAC_ADDRES_LEN 6 +/*!< The size of the 802 MAC address. + */ + +#define M2M_ETHERNET_HDR_OFFSET 34 +/*!< The offset of the Ethernet header within the WLAN Tx Buffer. + */ + + +#define M2M_ETHERNET_HDR_LEN 14 +/*!< Length of the Ethernet header in bytes. +*/ + + +#define M2M_MAX_SSID_LEN 33 +/*!< 1 more than the max SSID length. + This matches the size of SSID buffers (max SSID length + 1-byte length field). + */ + + +#define M2M_MAX_PSK_LEN 65 +/*!< 1 more than the WPA PSK length (in ASCII format). + This matches the size of the WPA PSK/Passphrase buffer (max ASCII contents + 1-byte length field). + Alternatively it matches the WPA PSK length (in ASCII format) + 1 byte NULL termination. + */ + +#define M2M_MIN_PSK_LEN 9 +/*!< 1 more than the minimum WPA PSK Passphrase length. + It matches the minimum WPA PSK Passphrase length + 1 byte NULL termination. + */ + +#define M2M_DEVICE_NAME_MAX 48 +/*!< Maximum Size for the device name including the NULL termination. + */ + +#define M2M_NTP_MAX_SERVER_NAME_LENGTH 32 +/*!< Maximum NTP server name length +*/ + +#define M2M_LISTEN_INTERVAL 1 +/*!< The STA uses the Listen Interval parameter to indicate to the AP how + many beacon intervals it shall sleep before it retrieves the queued frames + from the AP. +*/ + +#define MAX_HIDDEN_SITES 4 +/*!< + max number of hidden SSID supported by scan request +*/ + +#define M2M_CUST_IE_LEN_MAX 252 +/*!< The maximum size of IE (Information Element). +*/ + +#define M2M_CRED_STORE_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be stored in WINC flash. +*/ +#define M2M_CRED_ENCRYPT_FLAG 0x02 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials should be encrypted when stored in WINC flash. +*/ +#define M2M_CRED_IS_STORED_FLAG 0x10 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are stored in WINC flash. May only be set by WINC firmware. +*/ +#define M2M_CRED_IS_ENCRYPTED_FLAG 0x20 +/*!< Flag used in @ref tstrM2mConnCredHdr to indicate that Wi-Fi connection + credentials are encrypted in WINC flash. May only be set by WINC firmware. +*/ + +#define M2M_WIFI_CONN_BSSID_FLAG 0x01 +/*!< Flag used in @ref tstrM2mConnCredCmn to indicate that Wi-Fi connection + must be restricted to an AP with a certain BSSID. +*/ + +#define M2M_AUTH_1X_USER_LEN_MAX 100 +/*!< The maximum length (in ASCII characters) of domain name + username (including '@' or '\') + for authentication with Enterprise methods. +*/ +#define M2M_AUTH_1X_PASSWORD_LEN_MAX 256 +/*!< The maximum length (in ASCII characters) of password for authentication with Enterprise MSCHAPv2 methods. +*/ +#define M2M_AUTH_1X_PRIVATEKEY_LEN_MAX 256 +/*!< The maximum length (in bytes) of private key modulus for authentication with Enterprise TLS methods. + Private key exponent must be the same length as modulus, pre-padded with 0s if necessary. +*/ +#define M2M_AUTH_1X_CERT_LEN_MAX 1584 +/*!< The maximum length (in bytes) of certificate for authentication with Enterprise TLS methods. +*/ + +#define M2M_802_1X_UNENCRYPTED_USERNAME_FLAG 0x80 +/*!< Flag to indicate that the 802.1x user-name should be sent (unencrypted) in the initial EAP + identity response. Intended for use with EAP-TLS only. +*/ +#define M2M_802_1X_PREPEND_DOMAIN_FLAG 0x40 +/*!< Flag to indicate that the 802.1x domain name should be prepended to the user-name: + "Domain\Username". If the flag is not set then domain name is appended to the user-name: + "Username@Domain". (Note that the '@' or '\' must be included in the domain name.) +*/ +#define M2M_802_1X_MSCHAP2_FLAG 0x01 +/*!< Flag to indicate 802.1x MsChapV2 credentials: domain/user-name/password. +*/ +#define M2M_802_1X_TLS_FLAG 0x02 +/*!< Flag to indicate 802.1x TLS credentials: domain/user-name/private-key/certificate. +*/ + +#define M2M_802_1X_TLS_CLIENT_CERTIFICATE 1 +/*!< Info type used in @ref tstrM2mWifiAuthInfoHdr to indicate Enterprise TLS client certificate. +*/ +#define PSK_CALC_LEN 40 +/*!< PSK is 32 bytes generated either: + - from 64 ASCII characters + - by SHA1 operations on up to 63 ASCII characters + 40 byte array is required during SHA1 operations, so we define PSK_CALC_LEN as 40. +*/ + +/********************* + * + * WIFI GROUP requests + */ +#define M2M_CONFIG_CMD_BASE 1 +/*!< The base value of all the Host configuration commands opcodes. +*/ +#define M2M_STA_CMD_BASE 40 +/*!< The base value of all the Station mode host commands opcodes. +*/ +#define M2M_AP_CMD_BASE 70 +/*!< The base value of all the Access Point mode host commands opcodes. +*/ +/**@cond P2P_DOC + */ +#define M2M_P2P_CMD_BASE 90 +/*!< The base value of all the P2P mode host commands opcodes. +*/ +/**@endcond*/ //P2P_DOC +#define M2M_SERVER_CMD_BASE 100 +/*!< The base value of all the Power Save mode host commands codes. +*/ +#define M2M_GEN_CMD_BASE 105 +/*!< The base value of additional host wifi command opcodes. + * Usage restrictions (eg STA mode only) should always be made clear at the API layer in any case. +*/ +/********************** + * OTA GROUP requests + */ +#define M2M_OTA_CMD_BASE 100 +/*!< The base value of all the OTA mode host commands opcodes. + * The OTA messages have their own group so op codes can extended from 1 to M2M_MAX_GRP_NUM_REQ. +*/ + +#define M2M_MAX_GRP_NUM_REQ (127) +/*!< max number of request in one group equal to 127 as the last bit reserved for config or data pkt +*/ + +#define WEP_40_KEY_SIZE ((uint8_t)5) +/*!< The size in bytes of a 40-bit wep key. +*/ +#define WEP_104_KEY_SIZE ((uint8_t)13) +/*!< The size in bytes of a 104-bit wep key. +*/ + +#define WEP_40_KEY_STRING_SIZE ((uint8_t)10) +/*!< The string length of a 40-bit wep key. +*/ +#define WEP_104_KEY_STRING_SIZE ((uint8_t)26) +/*!< The string length of a 104-bit wep key. +*/ + +#define WEP_KEY_MAX_INDEX ((uint8_t)4) +/*!< WEP key index is in the range 1 to 4 inclusive. (This is decremented to + * result in an index in the range 0 to 3 on air.) +*/ +#define M2M_SCAN_DEFAULT_NUM_SLOTS (2) +/*!< The default number of scan slots used by the WINC board. +*/ +#define M2M_SCAN_DEFAULT_SLOT_TIME (20) +/*!< The active scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_PASSIVE_SLOT_TIME (300) +/*!< The passive scan slot default duration in ms. +*/ +#define M2M_SCAN_DEFAULT_NUM_PROBE (2) +/*!< The default number of probes per slot. +*/ +#define M2M_FASTCONNECT_DEFAULT_RSSI_THRESH (-45) +/*!< The default threshold RSSI for fast reconnection to an AP. +*/ +#define M2M_SCAN_FAIL ((uint8_t)1) +/*!< Indicates the WINC board has failed to perform the scan operation. +*/ +#define M2M_JOIN_FAIL ((uint8_t)2) +/*!< Indicates the WINC board has failed to join the BSS. +*/ +#define M2M_AUTH_FAIL ((uint8_t)3) +/*!< Indicates the WINC board has failed to authenticate with the AP. +*/ +#define M2M_ASSOC_FAIL ((uint8_t)4) +/*!< Indicates the WINC board has failed to associate with the AP. +*/ + +#define M2M_SCAN_ERR_WIFI ((int8_t)-2) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_IP ((int8_t)-3) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_AP ((int8_t)-4) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_P2P ((int8_t)-5) +/*!< Currently not used. +*/ +#define M2M_SCAN_ERR_WPS ((int8_t)-6) +/*!< Currently not used. +*/ + +/*======*======*======*======* + MONITORING MODE DEFINITIONS + *======*======*======*======*/ + +#define M2M_WIFI_FRAME_TYPE_ANY 0xFF +/*!< Receive any frame type when configured as Monitor Mode. +*/ +#define M2M_WIFI_FRAME_SUB_TYPE_ANY 0xFF +/*!< Receive frames with any sub type when configured as Monitor Mode. +*/ + +/*======*======*======*======* + TLS DEFINITIONS + *======*======*======*======*/ +#define TLS_FILE_NAME_MAX 48 +/*!< Maximum length for each TLS certificate file name. +*/ +#define TLS_SRV_SEC_MAX_FILES 8 +/*!< Maximum number of certificates allowed in TLS_SRV section. +*/ +#define TLS_SRV_SEC_START_PATTERN_LEN 8 +/*!< Length of certificate struct start pattern. +*/ + +/**@}*/ // WLANDefines + +/**@addtogroup OTADEFINE + * @{ + */ + +/*======*======*======*======* + OTA DEFINITIONS + *======*======*======*======*/ + +#define OTA_STATUS_VALID (0x12526285) +/*!< + Magic value in the control structure for a valid image after ROLLBACK. +*/ +#define OTA_STATUS_INVALID (0x23987718) +/*!< + Magic value in the control structure for a invalid image after ROLLBACK. +*/ +#define OTA_MAGIC_VALUE (0x1ABCDEF9) +/*!< + Magic value set at the beginning of the OTA image header. +*/ +#define OTA_SHA256_DIGEST_SIZE (32) +/*!< + SHA256 digest size in the OTA image. + The SHA256 digest is set at the beginning of image before the OTA header. +*/ +/**@}*/ // OTADEFINE + +/** +* @addtogroup WlanEnums +*/ +/**@{*/ + +/*! +@enum \ + tenuM2mReqGroup + +@brief +*/ +typedef enum { + M2M_REQ_GROUP_MAIN = 0, + M2M_REQ_GROUP_WIFI, + M2M_REQ_GROUP_IP, + M2M_REQ_GROUP_HIF, + M2M_REQ_GROUP_OTA, + M2M_REQ_GROUP_SSL, + M2M_REQ_GROUP_SIGMA, + M2M_REQ_GROUP_INTERNAL, +} tenuM2mReqGroup; + +/*! +@enum \ + tenuM2mReqpkt + +@brief +*/ +typedef enum { + M2M_REQ_CONFIG_PKT, + M2M_REQ_DATA_PKT = 0x80 /*BIT7*/ +} tenuM2mReqpkt; + +/*! +@enum \ + tenuM2mWepKeyIndex + +@brief + +*/ +typedef enum { + M2M_WIFI_WEP_KEY_INDEX_1 = ((uint8_t) 1), + /*!< Index 1 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_2, + /*!< Index 2 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_3, + /*!< Index 3 for WEP key Authentication */ + M2M_WIFI_WEP_KEY_INDEX_4, + /*!< Index 4 for WEP key Authentication */ +} tenuM2mWepKeyIndex; + +/*! +@enum \ + tenuM2mDefaultConnErrcode + +@brief + +*/ +typedef enum { + M2M_DEFAULT_CONN_INPROGRESS = ((int8_t)-23), + /*!< Failure response due to another connection being already in progress */ + M2M_DEFAULT_CONN_FAIL, + /*!< Failure to connect to the cached network */ + M2M_DEFAULT_CONN_SCAN_MISMATCH, + /*!< Failure to find any of the cached networks in the scan results. */ + M2M_DEFAULT_CONN_EMPTY_LIST + /*!< Failure due to empty network list. */ +} tenuM2mDefaultConnErrcode; + + +/*! +@enum \ + tenuM2mConnChangedErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_SCAN_FAIL = ((uint8_t)1), + /*!< Failure to perform the scan operation. */ + M2M_ERR_JOIN_FAIL, + /*!< Failure to join the BSS. */ + M2M_ERR_AUTH_FAIL, + /*!< Failure to authenticate with the AP. */ + M2M_ERR_ASSOC_FAIL, + /*!< Failure to associate with the AP. */ + M2M_ERR_CONN_INPROGRESS, + /*!< Failure due to another connection being in progress. */ +} tenuM2mConnChangedErrcode; + + +/*! +@enum \ + tenuM2mSetGainsErrcode + +@brief + +*/ +typedef enum { + M2M_ERR_GAIN_TABLE_INVALID = ((int8_t)-10), + /*!< Failure response due to trying to use an invalid table */ + M2M_ERR_READ_GAIN_TABLE, + /*!< Failure to read gains from flash */ +} tenuM2mSetGainsErrcode; + +/*! +@enum \ + tenuM2mPwrMode + +@brief + +*/ +typedef enum { + PWR_AUTO = ((uint8_t) 1), + /*!< Automatic power mode. */ + PWR_LOW1, + /*!< Low power mode #1. RX current 60mA.*/ + PWR_LOW2, + /*!< Low power mode #2, RX current 55mA, sensitivity is less by 3dBm*/ + PWR_HIGH, + /*!< High power mode: RX current 100mA.*/ +} tenuM2mPwrMode; + +/*! +@enum \ + tenuM2mTxPwrLevel + +@brief + +*/ +typedef enum { + TX_PWR_HIGH = ((uint8_t) 1), + /*!< PPA Gain 6dbm PA Gain 18dbm */ + TX_PWR_MED, + /*!< PPA Gain 6dbm PA Gain 12dbm */ + TX_PWR_LOW, + /*!< PPA Gain 6dbm PA Gain 6dbm */ +} tenuM2mTxPwrLevel; + +/*! +@enum \ + tenuM2mConfigCmd + +@brief + This enum contains host commands used to configure the WINC board. + +*/ +typedef enum { + M2M_WIFI_REQ_RESTART = M2M_CONFIG_CMD_BASE, + /*!< Restart the WINC MAC layer, it's doesn't restart the IP layer. */ + M2M_WIFI_REQ_SET_MAC_ADDRESS, + /*!< Set the WINC mac address (not possible for production effused boards). */ + M2M_WIFI_REQ_CURRENT_RSSI, + /*!< Request the current connected AP RSSI. */ + M2M_WIFI_RESP_CURRENT_RSSI, + /*!< Response to M2M_WIFI_REQ_CURRENT_RSSI with the RSSI value. */ + M2M_WIFI_REQ_RESTRICT_BLE, + /*!< Request restrict ble. */ + M2M_WIFI_REQ_UNRESTRICT_BLE, + /*!< Request unrestrict ble. */ + M2M_WIFI_REQ_GET_CONN_INFO, + /*!< Request connection information. */ + M2M_WIFI_RESP_CONN_INFO, + /*!< Response to M2M_WIFI_REQ_GET_CONN_INFO with the connection information. */ + M2M_WIFI_REQ_SET_DEVICE_NAME, + /*!< Request to set WINC device name property. */ + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY, + /*!< Request to start provisioning mode. */ + M2M_WIFI_RESP_PROVISION_INFO, + /*!< Response to the host with the provisioning information.*/ + M2M_WIFI_REQ_STOP_PROVISION_MODE, + /*!< Request to stop provision mode. */ + M2M_WIFI_REQ_SET_SYS_TIME, + /*!< Request to set system time. */ + M2M_WIFI_REQ_ENABLE_SNTP_CLIENT, + /*!< Request to enable the simple network time protocol to get the + time from the Internet. This is required for security purposes. */ + M2M_WIFI_REQ_DISABLE_SNTP_CLIENT, + /*!< Request to disable the simple network time protocol for applications that + do not need it. */ + M2M_WIFI_RESP_MEMORY_RECOVER, + /*!< Reserved for debugging */ + M2M_WIFI_REQ_CUST_INFO_ELEMENT, + /*!< Request to add custom information to the Beacons IE. */ + M2M_WIFI_REQ_SCAN, + /*!< Request scan command. */ + M2M_WIFI_RESP_SCAN_DONE, + /*!< Response to notify scan complete. */ + M2M_WIFI_REQ_SCAN_RESULT, + /*!< Request for scan results. */ + M2M_WIFI_RESP_SCAN_RESULT, + /*!< Response to provide the scan results. */ + M2M_WIFI_REQ_SET_SCAN_OPTION, + /*!< Request to set scan options "slot time, slot number .. etc". */ + M2M_WIFI_REQ_SET_SCAN_REGION, + /*!< Request to set scan region. */ + M2M_WIFI_REQ_SET_POWER_PROFILE, + /*!< Request to set the Power Profile. */ + M2M_WIFI_REQ_SET_TX_POWER, + /*!< Request to set the TX Power. */ + M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, + /*!< Request to set the Battery Voltage. */ + M2M_WIFI_REQ_SET_ENABLE_LOGS, + /*!< Request to enable logs. */ + M2M_WIFI_REQ_GET_SYS_TIME, + /*!< Request to get system time. */ + M2M_WIFI_RESP_GET_SYS_TIME, + /*!< Response to retrieve the system time. */ + M2M_WIFI_REQ_SEND_ETHERNET_PACKET, + /*!< Request to send Ethernet packet in bypass mode. */ + M2M_WIFI_RESP_ETHERNET_RX_PACKET, + /*!< Response to receive an Ethernet packet in bypass mode. */ + M2M_WIFI_REQ_SET_MAC_MCAST, + /*!< Request to set multicast filters. */ + M2M_WIFI_REQ_BLE_API_SEND, + /*!< Request to send an Encapsulated BLE API MSG */ + M2M_WIFI_RESP_BLE_API_RECV, + /*!< Response to receive an Encapsulated BLE API MSG */ + M2M_WIFI_REQ_SET_GAIN_TABLE, + /*!< Request to use Gain table from Flash */ + M2M_WIFI_RESP_SET_GAIN_TABLE, + /*!< Response to fail to use Gain table from Flash */ + M2M_WIFI_REQ_PASSIVE_SCAN, + /*!< Request a passive scan. */ + M2M_WIFI_REQ_CONFIG_SNTP, + /*!< Configure NTP servers. */ + M2M_WIFI_REQ_START_PROVISION_MODE, + /*!< Request to start provisioning mode. */ + + /* This enum is now 'full' in the sense that (M2M_WIFI_REQ_START_PROVISION_MODE+1) == M2M_STA_CMD_BASE. + * Any new config values should be placed in tenuM2mGenCmd. */ + M2M_WIFI_MAX_CONFIG_ALL +} tenuM2mConfigCmd; + +/*! +@enum \ + tenuM2mStaCmd + +@brief + This enum contains WINC commands while in Station mode. +*/ +typedef enum { + M2M_WIFI_REQ_CONNECT = M2M_STA_CMD_BASE, + /*!< Request to connect with a specified AP. This command is deprecated in favour of @ref M2M_WIFI_REQ_CONN. + */ + M2M_WIFI_REQ_DEFAULT_CONNECT, + /*!< Request to connect with a cached AP. */ + M2M_WIFI_RESP_DEFAULT_CONNECT, + /*!< Response for the default connect.*/ + M2M_WIFI_REQ_DISCONNECT, + /*!< Request to disconnect from the AP. */ + M2M_WIFI_RESP_CON_STATE_CHANGED, + /*!< Response to indicate a change in the connection state. */ + M2M_WIFI_REQ_SLEEP, + /*!< Request to sleep. */ + M2M_WIFI_REQ_WPS_SCAN, + /*!< Request to WPS scan. */ + M2M_WIFI_REQ_WPS, + /*!< Request to start WPS. */ + M2M_WIFI_REQ_START_WPS, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_DISABLE_WPS, + /*!< Request to disable WPS. */ + M2M_WIFI_REQ_DHCP_CONF, + /*!< Response to indicate the obtained IP address.*/ + M2M_WIFI_RESP_IP_CONFIGURED, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_RESP_IP_CONFLICT, + /*!< Response to indicate a conflict in obtained IP address. + The user should re attempt the DHCP request. */ + M2M_WIFI_REQ_ENABLE_MONITORING, + /*!< Request to enable monitor mode. */ + M2M_WIFI_REQ_DISABLE_MONITORING, + /*!< Request to disable monitor mode. */ + M2M_WIFI_RESP_WIFI_RX_PACKET, + /*!< Response to indicate a packet was received in monitor mode. */ + M2M_WIFI_REQ_SEND_WIFI_PACKET, + /*!< Request to send a packet in monitor mode. */ + M2M_WIFI_REQ_LSN_INT, + /*!< Request to set the listen interval. */ + M2M_WIFI_REQ_DOZE, + /*!< Request to doze */ + M2M_WIFI_REQ_GET_PRNG, + /*!< Request PRNG. */ + M2M_WIFI_RESP_GET_PRNG, + /*!< Response for PRNG. */ + M2M_WIFI_REQ_CONN, + /*!< New command to connect with AP. + This replaces M2M_WIFI_REQ_CONNECT. (Firmware continues to handle + M2M_WIFI_REQ_CONNECT for backwards compatibility purposes.) + */ + M2M_WIFI_IND_CONN_PARAM, + /*!< Provide extra information (such as Enterprise client certificate) required for connection. */ + M2M_WIFI_MAX_STA_ALL +} tenuM2mStaCmd; + +/*! +@enum \ + tenuM2mApCmd + +@brief + This enum contains WINC commands while in AP mode. +*/ +typedef enum { + M2M_WIFI_REQ_ENABLE_AP_LEGACY = M2M_AP_CMD_BASE, + /*!< Request to enable AP mode. */ + M2M_WIFI_REQ_DISABLE_AP, + /*!< Request to disable AP mode. */ + M2M_WIFI_REQ_ENABLE_AP, + /*!< Request to enable AP mode. */ + M2M_WIFI_MAX_AP_ALL, +} tenuM2mApCmd; + +/*! +@enum \ + tenuM2mP2pCmd + +@brief + This enum contains WINC commands while in P2P mode. +*/ +typedef enum { + M2M_WIFI_REQ_P2P_INT_CONNECT = M2M_P2P_CMD_BASE, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. */ + M2M_WIFI_REQ_ENABLE_P2P, + /*!< Request to enable P2P mode.*/ + M2M_WIFI_REQ_DISABLE_P2P, + /*!< Request to disable P2P mode. */ + M2M_WIFI_REQ_P2P_REPOST, + /*!< This command is for internal use by the WINC and + should not be used by the host driver. + */ + M2M_WIFI_MAX_P2P_ALL, +} tenuM2mP2pCmd; + + +/*! +@enum \ + tenuM2mServerCmd + +@brief + These commands are currently not supported. +*/ +typedef enum { + M2M_WIFI_REQ_CLIENT_CTRL = M2M_SERVER_CMD_BASE, + /*!< Currently not supported.*/ + M2M_WIFI_RESP_CLIENT_INFO, + /*!< Currently not supported.*/ + M2M_WIFI_REQ_SERVER_INIT, + /*!< Currently not supported.*/ + M2M_WIFI_MAX_SERVER_ALL +} tenuM2mServerCmd; + +/*! +@enum \ + tenuM2mGenCmd + +@brief + This enum contains additional WINC commands (overflow of previous enums). +*/ +typedef enum { + M2M_WIFI_REQRSP_DELETE_APID = M2M_GEN_CMD_BASE, + /*!< Request/response to delete security credentials from WINC flash. + (Processing matches @ref tenuM2mConfigCmd.) */ + M2M_WIFI_REQ_ROAMING, + /*!< Request to enable/disable wifi roaming. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_REQ_SCAN_SSID_LIST, + /*!< Request scan with list of hidden SSID plus the broadcast scan. + */ + M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, + /*!< Set Scan option to stop on first result. + (Processing matches @ref tenuM2mConfigCmd.) + */ + M2M_WIFI_MAX_GEN_ALL +} tenuM2mGenCmd; + + +/*! +@enum \ + tenuM2mIpCmd + +@brief + This enum contains all the WINC commands related to IP. +*/ +typedef enum { + M2M_IP_REQ_STATIC_IP_CONF = ((uint8_t) 10), + /*!< Request to set static IP.*/ + M2M_IP_REQ_ENABLE_DHCP, + /*!< Request to enable DHCP.*/ + M2M_IP_REQ_DISABLE_DHCP + /*!< Request to disable DHCP.*/ +} tenuM2mIpCmd; + +/*! +@enum \ + tenuM2mSockCmd + +@brief + This enum contains all the WINC commands related to Sockets. +*/ +typedef enum { + SOCKET_CMD_BIND = 0x41, + /*!< Socket Binding command value. */ + SOCKET_CMD_LISTEN, + /*!< Socket Listening command value. */ + SOCKET_CMD_ACCEPT, + /*!< Socket Accepting command value. */ + SOCKET_CMD_CONNECT, + /*!< Socket Connecting command value. */ + SOCKET_CMD_SEND, + /*!< Socket send command value. */ + SOCKET_CMD_RECV, + /*!< Socket Receive command value. */ + SOCKET_CMD_SENDTO, + /*!< Socket sendTo command value. */ + SOCKET_CMD_RECVFROM, + /*!< Socket ReceiveFrom command value. */ + SOCKET_CMD_CLOSE, + /*!< Socket Close command value. */ + SOCKET_CMD_DNS_RESOLVE, + /*!< Socket DNS Resolve command value. */ + SOCKET_CMD_SSL_CONNECT, + /*!< SSL-Socket Connect command value. */ + SOCKET_CMD_SSL_SEND, + /*!< SSL-Socket Send command value. */ + SOCKET_CMD_SSL_RECV, + /*!< SSL-Socket Receive command value. */ + SOCKET_CMD_SSL_CLOSE, + /*!< SSL-Socket Close command value. */ + SOCKET_CMD_SET_SOCKET_OPTION, + /*!< Set Socket Option command value. */ + SOCKET_CMD_SSL_CREATE, + SOCKET_CMD_SSL_SET_SOCK_OPT, + SOCKET_CMD_PING, + SOCKET_CMD_SSL_CONNECT_ALPN, + /*!< SSL-Socket Connect with ALPN command value. */ + SOCKET_CMD_RAW_SET_SOCK_OPT, + SOCKET_CMD_SECURE + /*!< Make secure a previously opened socket. */ +} tenuM2mSockCmd; + +/*! +@enum \ + tenuM2mSigmaCmd + +@brief + This enum contains all the WINC commands related to Sigma. +*/ +typedef enum { + M2M_SIGMA_ENABLE = ((uint8_t) 3), + /*!< Enable Sigma.*/ + M2M_SIGMA_TA_START, + /*!< Start the traffic agent.*/ + M2M_SIGMA_TA_STATS, + /*!< Get traffic statistics.*/ + M2M_SIGMA_TA_RECEIVE_STOP, + /*!< Stop receiving from the traffic agent.*/ + M2M_SIGMA_ICMP_ARP, + /*!< Send ARP.*/ + M2M_SIGMA_ICMP_RX, + /*!< Receive ICMP.*/ + M2M_SIGMA_ICMP_TX, + /*!< Transmit ICMP.*/ + M2M_SIGMA_UDP_TX, + /*!< Transmit UDP.*/ + M2M_SIGMA_UDP_TX_DEFER, + /*!< Transmit UDP defer.*/ + M2M_SIGMA_SECURITY_POLICY, + /*!< Set security policy.*/ + M2M_SIGMA_SET_SYSTIME + /*!< Set system time.*/ +} tenuM2mSigmaCmd; + +/*! +@enum \ + tenuM2mConnState + +@brief + This enum contains all the Wi-Fi connection states. +*/ +typedef enum { + M2M_WIFI_DISCONNECTED = 0, + /*!< Wi-Fi state is disconnected. */ + M2M_WIFI_CONNECTED, + /*!< Wi-Fi state is connected. */ + M2M_WIFI_ROAMED, + /*!< Wi-Fi state is roamed to new AP. */ + M2M_WIFI_UNDEF = 0xff + /*!< Undefined Wi-Fi State. */ +} tenuM2mConnState; + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi security types. +*/ +typedef enum { + M2M_WIFI_SEC_INVALID = 0, + /*!< Invalid security type. */ + M2M_WIFI_SEC_OPEN, + /*!< Wi-Fi network is not secured. */ + M2M_WIFI_SEC_WPA_PSK, + /*!< Wi-Fi network is secured with WPA/WPA2 personal(PSK). */ + M2M_WIFI_SEC_WEP, + /*!< Security type WEP (40 or 104) OPEN OR SHARED. */ + M2M_WIFI_SEC_802_1X, + /*!< Wi-Fi network is secured with WPA/WPA2 Enterprise.IEEE802.1x. */ + M2M_WIFI_NUM_AUTH_TYPES + /*!< Upper limit for enum value. */ +} tenuM2mSecType; + + +/*! +@enum \ + tenuM2mSecType + +@brief + This enum contains all the supported Wi-Fi SSID types. +*/ +typedef enum { + SSID_MODE_VISIBLE = 0, + /*!< SSID is visible to others. */ + SSID_MODE_HIDDEN + /*!< SSID is hidden. */ +} tenuM2mSsidMode; + +/*! +@enum \ + tenuM2mScanCh + +@brief + This enum contains all the Wi-Fi RF channels. +*/ +typedef enum { + M2M_WIFI_CH_1 = ((uint8_t) 1), + /*!< Channel 1. */ + M2M_WIFI_CH_2, + /*!< Channel 2. */ + M2M_WIFI_CH_3, + /*!< Channel 3. */ + M2M_WIFI_CH_4, + /*!< Channel 4. */ + M2M_WIFI_CH_5, + /*!< Channel 5. */ + M2M_WIFI_CH_6, + /*!< Channel 6. */ + M2M_WIFI_CH_7, + /*!< Channel 7. */ + M2M_WIFI_CH_8, + /*!< Channel 8. */ + M2M_WIFI_CH_9, + /*!< Channel 9. */ + M2M_WIFI_CH_10, + /*!< Channel 10. */ + M2M_WIFI_CH_11, + /*!< Channel 11. */ + M2M_WIFI_CH_12, + /*!< Channel 12. */ + M2M_WIFI_CH_13, + /*!< Channel 13. */ + M2M_WIFI_CH_14, + /*!< Channel 14. */ + M2M_WIFI_CH_ALL = ((uint8_t) 255) +} tenuM2mScanCh; + +/*! +@enum \ + tenuM2mScanRegion + +@brief + This enum contains all the Wi-Fi channel regions. +*/ +typedef enum { + REG_CH_1 = ((uint16_t) 1 << 0), + /*!< Region channel 1. */ + REG_CH_2 = ((uint16_t) 1 << 1), + /*!< Region channel 2. */ + REG_CH_3 = ((uint16_t) 1 << 2), + /*!< Region channel 3. */ + REG_CH_4 = ((uint16_t) 1 << 3), + /*!< Region channel 4. */ + REG_CH_5 = ((uint16_t) 1 << 4), + /*!< Region channel 5. */ + REG_CH_6 = ((uint16_t) 1 << 5), + /*!< Region channel 6. */ + REG_CH_7 = ((uint16_t) 1 << 6), + /*!< Region channel 7. */ + REG_CH_8 = ((uint16_t) 1 << 7), + /*!< Region channel 8. */ + REG_CH_9 = ((uint16_t) 1 << 8), + /*!< Region channel 9. */ + REG_CH_10 = ((uint16_t) 1 << 9), + /*!< Region channel 10. */ + REG_CH_11 = ((uint16_t) 1 << 10), + /*!< Region channel 11. */ + REG_CH_12 = ((uint16_t) 1 << 11), + /*!< Region channel 12. */ + REG_CH_13 = ((uint16_t) 1 << 12), + /*!< Region channel 13. */ + REG_CH_14 = ((uint16_t) 1 << 13), + /*!< Region channel 14. */ + REG_CH_ALL = ((uint16_t) 0x3FFF), + /*!< Region for all channels. */ + NORTH_AMERICA = ((uint16_t) 0x7FF), + /*!< North America region with 11 channels*/ + EUROPE = ((uint16_t) 0x1FFF), + /*!u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + m2m_wifi_start_provision_mode(&apConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +@brief + Asynchronous API for control of Wi-Fi provisioning functionality with extended options. + +@details + This function allows the application to start the WINC in 'provisioning mode', a special mode + that triggers the WINC to create a Wi-Fi access point, DHCP server, and HTTP server. + + The HTTP server presents a provisioning page to a connected client which lists the access points + detected in the vicinity of the WINC, and allows one of these to be selected and any appropriate + credentials to be entered. This allows a headless system to be provisioned (configured to + connect with an access point). + + Provisioning status is returned in an event @ref M2M_WIFI_RESP_PROVISION_INFO. + +@param[in] pstrAPModeConfig + AP configuration parameters as defined in @ref tstrM2MAPModeConfig configuration structure. + A NULL value passed in, will result in a negative error @ref M2M_ERR_FAIL. + +@param[in] pcHttpServerDomainName + Domain name of the HTTP Provision WEB server which others will use to load the provisioning Home page. + The domain name can have one of the following 3 forms: + - 1. "wincprov.com" + - 2. "http://wincprov.com" + - 3. "https://wincprov.com" + + The forms 1 and 2 are equivalent, they both will start a plain http server, while form 3 + will start a secure HTTP provisioning Session (HTTP over SSL connection). + +@param[in] bEnableHttpRedirect + A flag to enable/disable the HTTP redirect feature. If Secure provisioning is enabled (i.e. the server + domain name uses "https" prefix) this flag is ignored (no meaning for redirect in HTTPS). + Possible values are: + - Zero: DO NOT use HTTP Redirect. In this case the associated device could open the + provisioning page ONLY when the HTTP Provision URL of the WINC HTTP Server is + correctly written on the browser. + - Non-Zero: Use HTTP Redirect. In this case, all http traffic (http://URL) from the + associated device (Phone, PC, ...etc) will be redirected to the WINC HTTP + Provisioning Home page. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at startup. + Registering the callback is done through passing it to the initialization @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the requested connection info. + +@warning + Do not use ".local" in the pcHttpServerDomainName. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_PROVISION_INFO + m2m_wifi_stop_provision_mode + tstrM2MAPModeConfig + +@section WIFIExample12 Example + The example demonstrates a code snippet for how provisioning is triggered and the response event + received accordingly. + +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_PROVISION_INFO: + { + tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo*)pvMsg; + if(pstrProvInfo->u8Status == M2M_SUCCESS) + { + tstrNetworkId strNetworkId = {NULL, pstrProvInfo->au8SSID, (uint8_t)strlen((char*)(pstrProvInfo->au8SSID)), M2M_WIFI_CH_ALL}; + tstrAuthPsk strAuthPsk = {NULL, pstrProvInfo->au8Password, (uint8_t)strlen((char*)(pstrProvInfo->au8Password))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + + printf("PROV SSID : %s\n",pstrProvInfo->au8SSID); + printf("PROV PSK : %s\n",pstrProvInfo->au8Password); + } + else + { + printf("(ERR) Provisioning Failed\n"); + } + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + uint8_t bEnableRedirect = 1; + + strcpy(apModeConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + m2m_wifi_start_provision_mode_ext(&apModeConfig, "atmelwincconf.com", bEnableRedirect); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect); + +/*! +@ingroup WLANPROVISION +@fn \ + int8_t m2m_wifi_stop_provision_mode(void); + +@brief + Synchronous API for terminating provisioning mode on the WINC. + +@details + This function will terminate any currently active provisioning mode on the WINC, returning the WINC to idle. + +@pre + An active provisioning session must be active before it is terminated through this function. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_start_provision_mode +*/ +int8_t m2m_wifi_stop_provision_mode(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_get_connection_info(void); + +@brief + Asynchronous API for retrieving the WINC connection status. + +@details + Requests the connection status from the WINC including information regarding any access + point to which it is currently connected, or any non-AP station that is connected to the WINC. + All information will be returned to the application via the Wi-Fi notification callback through + the event @ref M2M_WIFI_RESP_CONN_INFO. + + The connection info can be retrieved using the structure @ref tstrM2MConnInfo which contains: + - Connection Security + - Connection RSSI + - Remote MAC address + - Remote IP address + - SSID of the network (in cases where the WINC is in non-AP mode) + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to the initialization + @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_CONN_INFO must be handled in the callback to receive the + requested connection info. + +@warning + - In case the WINC is operating in AP mode or P2P mode, the SSID field will be returned as a NULL string. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + M2M_WIFI_RESP_CONN_INFO, + tstrM2MConnInfo +@section WIFIExample2 Example + The code snippet shows an example of how wi-fi connection information is retrieved . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CONN_INFO: + { + tstrM2MConnInfo *pstrConnInfo = (tstrM2MConnInfo*)pvMsg; + + printf("CONNECTED AP INFO\n"); + printf("SSID : %s\n",pstrConnInfo->acSSID); + printf("SEC TYPE : %d\n",pstrConnInfo->u8SecType); + printf("Signal Strength : %d\n", pstrConnInfo->s8RSSI); + printf("Local IP Address : %d.%d.%d.%d\n", + pstrConnInfo->au8IPAddr[0] , pstrConnInfo->au8IPAddr[1], pstrConnInfo->au8IPAddr[2], pstrConnInfo->au8IPAddr[3]); + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + // Get the current AP information. + m2m_wifi_get_connection_info(); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // connect to the default AP + m2m_wifi_default_connect(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_get_connection_info(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +@brief + Asynchronous API for assigning a MAC address to the WINC. + +@details + This function is intended to allow non-production software to assign a MAC address to the WINC. + +@warning + This function is intended for development use only and not for use in production software. + +@param[in] au8MacAddress + MAC Address to be provisioned to the WINC. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps(uint8_t u8TriggerType,const char * pcPinNumber); + +@brief + Asynchronous API to engage the WINC Wi-Fi Protected Setup (enrollee) function. + +@details + This function can be called to make the WINC enter WPS (Wi-Fi Protected Setup) mode. The result + is passed to the Wi-Fi notification callback with the event @ref M2M_WIFI_REQ_WPS. + +@param[in] u8TriggerType + WPS Trigger method. This may be: + - @ref WPS_PIN_TRIGGER Push button method + - @ref WPS_PBC_TRIGGER Pin method + +@param[in] pcPinNumber + Valid only if the u8TriggerType is @ref WPS_PIN_TRIGGER, this parameter contains the PIN number. + The number must follow the format as given in the WSC1.0 specification. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in AP or P2P modes. + +@pre + - A Wi-Fi notification callback of type (@ref tpfAppWifiCb MUST be implemented and registered at + startup. Registering the callback is done through passing it to @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_WPS must be handled in the callback to receive the WPS status. + - The WINC device MUST be in IDLE or STA mode. If AP or P2P mode is active, the WPS will not be performed. + - The @ref m2m_wifi_handle_events MUST be called periodically to receive + the responses in the callback. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_REQ_WPS + tenuWPSTrigger + tstrM2MWPSInfo + +@section WIFIExample3 Example + The code snippet shows an example of how wi-fi WPS is triggered . +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_WPS: + { + tstrM2MWPSInfo *pstrWPS = (tstrM2MWPSInfo*)pvMsg; + if(pstrWPS->u8AuthType != 0) + { + // establish Wi-Fi connection + tstrNetworkId strNetworkId = {NULL, pstrWPS->au8SSID, (uint8_t)strlen((char*)(pstrWPS->au8SSID)), pstrWPS->u8Ch}; + if(pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN) + { + m2m_wifi_connect_open(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId); + } + else + { + tstrAuthPsk strAuthPsk = {NULL, pstrWPS->au8PSK, (uint8_t)strlen((char*)(pstrWPS->au8PSK))}; + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); + } + + printf("WPS SSID : %s\n",pstrWPS->au8SSID); + printf("WPS PSK : %s\n",pstrWPS->au8PSK); + printf("WPS SSID Auth Type : %s\n",pstrWPS->u8AuthType == M2M_WIFI_SEC_OPEN ? "OPEN" : "WPA/WPA2"); + printf("WPS Channel : %d\n",pstrWPS->u8Ch); + } + else + { + printf("(ERR) WPS Is not enabled OR Timed out\n"); + } + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger WPS in Push button mode. + m2m_wifi_wps(WPS_PBC_TRIGGER, NULL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber); + +/*! +@ingroup WLANWPS +@fn \ + int8_t m2m_wifi_wps_disable(void); + +@brief + Asynchronous API that disables Wi-Fi Protected Setup mode in the WINC. + +@pre + WINC should be already in WPS mode using @ref m2m_wifi_wps. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_wps +*/ +int8_t m2m_wifi_wps_disable(void); + +/**@cond P2P_DOC + */ +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p(uint8_t u8Channel); + +@brief + Asynchronous API for enabling Wi-Fi Direct (P2P) mode in the WINC. + +@param[in] u8Channel + P2P Listen RF channel. According to the P2P standard, it must hold only one of the following values 1, 6 or 11. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registering the callback is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_CON_STATE_CHANGED and @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@warning + - This function is not available in the WINC 3400 + - This function is not allowed in AP or STA modes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tpfAppWifiCb + m2m_wifi_init + M2M_WIFI_RESP_CON_STATE_CHANGED + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + +@section WIFIExample4 Example + The code snippet shows an example of how the p2p mode operates. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CON_STATE_CHANGED: + { + tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged*)pvMsg; + M2M_INFO("Wifi State :: %s :: ErrCode %d\n", pstrWifiState->u8CurrState? "CONNECTED":"DISCONNECTED",pstrWifiState->u8ErrCode); + + // Do something + } + break; + + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("P2P IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Trigger P2P + m2m_wifi_p2p(M2M_WIFI_CH_1); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_p2p(uint8_t u8Channel); + +/*! +@ingroup WLANP2P +@fn \ + int8_t m2m_wifi_p2p_disconnect(void); + +@brief + Synchronous API to disable Wi-Fi Direct (P2P) Mode on the WINC. + +@pre + The p2p mode must be enabled and active before a disconnect can be called. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_p2p +*/ +int8_t m2m_wifi_p2p_disconnect(void); +/**@endcond*/ //P2P_DOC + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig* pstrM2MAPConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPConfig + +@section WIFIExample5 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPConfig apConfig; + + strcpy(apConfig.au8SSID, "WINC_SSID"); + apConfig.u8ListenChannel = 1; + apConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apConfig.u8SsidHide = 0; + + // IP Address + apConfig.au8DHCPServerIP[0] = 192; + apConfig.au8DHCPServerIP[1] = 168; + apConfig.au8DHCPServerIP[2] = 1; + apConfig.au8DHCPServerIP[3] = 1; + + // Trigger AP + m2m_wifi_enable_ap(&apConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +@brief + Asynchronous API to enable access point (AKA "hot-spot") mode on the WINC with extended options. + +@details + The WINC supports the ability to operate as an access point with the following limitations: + - Only 1 station may be associated at any given time. + - Open system and WEP are the only security suites supported. + +@param[in] pstrM2MAPModeConfig + A structure holding the AP configurations. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@warning + This function is not allowed in P2P or STA modes. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_REQ_DHCP_CONF must be handled in the callback. + - The @ref m2m_wifi_handle_events MUST be called to receive the responses in the callback. + +@see + tpfAppWifiCb + tenuM2mSecType + m2m_wifi_init + M2M_WIFI_REQ_DHCP_CONF + tstrM2mWifiStateChanged + tstrM2MAPModeConfig + +@section WIFIExample13 Example + The code snippet demonstrates how the AP mode is enabled after the driver is initialized in the application's main function and the handling + of the event @ref M2M_WIFI_REQ_DHCP_CONF, to indicate successful connection. +@code + #include "m2m_wifi.h" + #include "m2m_types.h" + + void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) + { + switch(u8WiFiEvent) + { + case M2M_WIFI_REQ_DHCP_CONF: + { + uint8_t *pu8IPAddress = (uint8_t*)pvMsg; + + printf("Associated STA has IP Address \"%u.%u.%u.%u\"\n",pu8IPAddress[0],pu8IPAddress[1],pu8IPAddress[2],pu8IPAddress[3]); + } + break; + + default: + break; + } + } + + int main() + { + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + tstrM2MAPModeConfig apModeConfig; + + strcpy(apModeConfig.strApConfig.au8SSID, "WINC_SSID"); + apModeConfig.strApConfig.u8ListenChannel = 1; + apModeConfig.strApConfig.u8SecType = M2M_WIFI_SEC_OPEN; + apModeConfig.strApConfig.u8SsidHide = 0; + + // IP Address + apModeConfig.strApConfig.au8DHCPServerIP[0] = 192; + apModeConfig.strApConfig.au8DHCPServerIP[1] = 168; + apModeConfig.strApConfig.au8DHCPServerIP[2] = 1; + apModeConfig.strApConfig.au8DHCPServerIP[3] = 1; + + // Default router IP + memcpy(apModeConfig.strApConfigExt.au8DefRouterIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // DNS Server IP + memcpy(apModeConfig.strApConfigExt.au8DNSServerIP, apModeConfig.strApConfig.au8DHCPServerIP, 4); + + // Subnet mask + apModeConfig.strApConfigExt.au8SubnetMask[0] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[1] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[2] = 255; + apModeConfig.strApConfigExt.au8SubnetMask[3] = 0; + + // Trigger AP + m2m_wifi_enable_ap_ext(&apModeConfig); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } + } +@endcode +*/ +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig); + +/*! +@ingroup WLANAP +@fn \ + int8_t m2m_wifi_disable_ap(void); + +@brief + Synchronous API to disable access point mode on the WINC. + +@details + Must be called only when the AP is enabled through the @ref m2m_wifi_enable_ap + function. Otherwise the call to this function will not be useful. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_ap +*/ +int8_t m2m_wifi_disable_ap(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig * pstrStaticIPConf); + +@brief + Asynchronous API to manually assign a (static) IP address to the WINC. + +@details + Assigns a static IP address to the WINC. + Typically an infrastructure access point will be able to provide an IP address to all clients + after they associate. The WINC will request configuration via DHCP automatically after + successfully connecting to an access point. + This function should only be called in the event that the network has no DHCP server or in case the application + wants to assign a predefined known IP address and the application. + This function can be used to assign a static IP address in case the application knows the specifics of the network. + The user must keep in mind that assigning a static IP address might + result in an IP address conflict. In case of an IP address conflict observed + by the WINC the user will get a response of @ref M2M_WIFI_RESP_IP_CONFLICT + in the wifi callback. The application is then responsible to either solve the + conflict or assign another IP address. + +@pre + The application must first call @ref m2m_wifi_enable_dhcp to request that DHCP functionality is + disabled prior to calling this function. + +@warning + Exercise caution using this function. + DHCP is the preferred method for configuring IP addresses. + +@param[in] pstrStaticIPConf + Pointer to a structure holding the static IP configuration (IP, Gateway, subnet mask and DNS address). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MIPConfig +*/ +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_client(void); + +@brief + Legacy (deprecated) Asynchronous API for starting a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@warning + This function has been deprecated. DHCP is used automatically when the WINC connects. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_client(void); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_request_dhcp_server(uint8_t* addr); + +@brief + Legacy (deprecated) asynchronous function to start a DHCP client on the WINC. + +@details + This is a legacy API and is no longer supported. Calls to this API will not result in any + changes being made to the state of the WINC. + +@param[in] addr + The address to issue to a connected client (only one client is supported) + +@warning + This function is legacy and exists only for compatibility with older applications. + DHCP server is started automatically when enabling the AP mode. + +@return + This function always returns @ref M2M_SUCCESS. +*/ +int8_t m2m_wifi_request_dhcp_server(uint8_t *addr); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +@brief + Asynchronous function to control the DHCP client functionality within the WINC. + +@details + This function allows the application to control the behaviour of the DHCP client function within + the WINC once it has associated with an access point. DHCP client functionality is enabled by + default. + +@param[in] u8DhcpEn + The state of the DHCP client feature after successful association with an access point: + - 1: Enables DHCP client after connection. + - 0: Disables DHCP client after connection. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + DHCP client is enabled by default. + This Function should be called to disable DHCP client operation before using @ref m2m_wifi_set_static_ip. + +@see + m2m_wifi_set_static_ip +*/ +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_options(tstrM2MScanOption* ptstrM2MScanOption); + +@brief + Synchronous API for configuring the behaviour of the WINC network scanning functions. + +@details + This function allows the application to tune the scanning behaviour of the WINC using the + parameters described in @ref tstrM2MScanOption. + +@param[in] ptstrM2MScanOption; + Pointer to the structure holding the Scan Parameters. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + m2m_wifi_request_scan + tstrM2MScanOption +*/ +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +@brief + Synchronous API for enabling/disabling the stop scan on first result of the WINC IC's network scanning functions. + +@details + Allows for enabling/disabling of stop scan on first result. When enabled, the WINC will stop the scan as soon as + it detects a network and return the results to the host. Setting is persistent and will need to be explicitly + reverted back by the application if it no longer wishes for it to be enabled. + +@param[in] u8StopScanOption; + Setting for enabling or disabling Stopping Scan on first result. + 1 = Enabled, 0 = Disabled (Default) + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanCh + tstrM2MScanOption + tstrM2MStopScanOption + m2m_wifi_request_scan + m2m_wifi_set_scan_options +*/ +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +@brief + Synchronous API for configuring the regulatory restrictions that may affect the WINC scanning behaviour. + +@details + This function sets a property called the scan region, a parameter that affects the range of + channels that the WINC may legally scan given a geographic region. + + For 2.4GHz, supported in the current release, the requested scan region cannot exceed the + maximum number of channels (14). + +@param[in] ScanRegion + @ref ASIA + @ref EUROPE + @ref NORTH_AMERICA + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tenuM2mScanRegion + m2m_wifi_request_scan +*/ +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan(uint8_t ch); + +@brief + Asynchronous API to request the WINC to scan for networks. + +@details + Scan statuses are delivered to the application via the Wi-Fi event callback (@ref tpfAppWifiCb) in + three stages. The first step involves the event @ref M2M_WIFI_RESP_SCAN_DONE which, if successful, + provides the number of detected networks (access points). The application must then read the list + of access points via multiple calls to the asynchronous @ref m2m_wifi_req_scan_result API. For + each call to this function, the application will receive (step three) the event + @ref M2M_WIFI_RESP_SCAN_RESULT. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh, with a + value of @ref M2M_WIFI_CH_ALL to scan all channels. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at + initialization. Registration of the callback is done via @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in + the (@ref tpfAppWifiCb) callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the + callback. + +@warning + This API is valid only for STA mode, it may be called regardless of connection state (connected or disconnected states). + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@section WIFIExample6 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult = (tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +@brief + Similar to @ref m2m_wifi_request_scan but performs passive scanning instead of active scanning. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + + +@warning + This function is not allowed in P2P or AP modes. It works only for STA mode (both connected or disconnected states). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2MScanOption + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_request_scan + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_request_scan_passive(uint8_t ch); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8SsidList); + +@brief + Asynchronous wi-fi scan request on the given channel and the hidden scan list. + +@details + The scan status is delivered in the wi-fi event callback and then the application + is to read the scan results sequentially. + The number of APs found (N) is returned in event @ref M2M_WIFI_RESP_SCAN_DONE with the number of found + APs. + The application could read the list of APs by calling the function @ref m2m_wifi_req_scan_result N times. + +@param[in] ch + RF Channel ID for SCAN operation. It should be set according to @ref tenuM2mScanCh. + With a value of @ref M2M_WIFI_CH_ALL, means to scan all channels. + +@param[in] u8SsidList + u8SsidList is a buffer containing a list of hidden SSIDs to + include during the scan. The first byte in the buffer, u8SsidList[0], + is the number of SSIDs encoded in the string. The number of hidden SSIDs + cannot exceed @ref MAX_HIDDEN_SITES. All SSIDs are concatenated in the following + bytes and each SSID is prefixed with a one-byte header containing its length. + The total number of bytes in u8SsidList buffer, including length byte, cannot + exceed 133 bytes (MAX_HIDDEN_SITES SSIDs x 32 bytes each, which is max SSID length). + For instance, encoding the two hidden SSIDs "DEMO_AP" and "TEST" + results in the following buffer content: + +@code + uint8_t u8SsidList[14]; + u8SsidList[0] = 2; // Number of SSIDs is 2 + u8SsidList[1] = 7; // Length of the string "DEMO_AP" without NULL termination + memcpy(&u8SsidList[2], "DEMO_AP", 7); // Bytes index 2-9 containing the string DEMO_AP + u8SsidList[9] = 4; // Length of the string "TEST" without NULL termination + memcpy(&u8SsidList[10], "TEST", 4); // Bytes index 10-13 containing the string TEST +@endcode + +@note + It works with STA/AP mode (connected or disconnected). + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The events @ref M2M_WIFI_RESP_SCAN_DONE and @ref M2M_WIFI_RESP_SCAN_RESULT. + must be handled in the callback. + - The @ref m2m_wifi_handle_events function MUST be called to receive the responses in the callback. + +@see + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + tpfAppWifiCb + tstrM2mWifiscanResult + tenuM2mScanCh + m2m_wifi_init + m2m_wifi_handle_events + m2m_wifi_req_scan_result + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +\section WIFIExample6b Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +static void request_scan_hidden_demo_ap(void); + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + request_scan_hidden_demo_ap(); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +static void request_scan_hidden_demo_ap(void) +{ + uint8_t list[9]; + char ssid[] = "DEMO_AP"; + uint8 len = (uint8_t)(sizeof(ssid)-1); + + list[0] = 1; + list[1] = len; + memcpy(&list[2], ssid, len); // copy 7 bytes + // Scan all channels + m2m_wifi_request_scan_ssid_list(M2M_WIFI_CH_ALL, list); +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + request_scan_hidden_demo_ap(); + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist); + +/*! +@ingroup WLANSCAN +@fn \ + uint8_t m2m_wifi_get_num_ap_found(void); + +@brief + Synchronous function to retrieve the number of AP's found during the last scan operation. + +@details + This function allows the application to recover the number of access points discovered during + the most recent scan activity. This is achieved via a global variable in the WINC driver that + is populated when receiving the @ref M2M_WIFI_RESP_SCAN_DONE event. + Function to be used in STA mode only. + +@see + m2m_wifi_request_scan + M2M_WIFI_RESP_SCAN_DONE + M2M_WIFI_RESP_SCAN_RESULT + +@pre + m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered at initialization. Registering the callback + is done through passing it to the @ref m2m_wifi_init. + - The event @ref M2M_WIFI_RESP_SCAN_DONE must be handled in the callback to receive the requested scan information. + +@warning + This function must be called only in the wi-fi callback function when the events + @ref M2M_WIFI_RESP_SCAN_DONE or @ref M2M_WIFI_RESP_SCAN_RESULT are received. + Calling this function in any other place will result in undefined/outdated numbers. + +@return + Returns the number of AP's found in the last Scan Request. + +@section WIFIExample7 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and the handling of + the events received in response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +uint8_t m2m_wifi_get_num_ap_found(void); + +/*! +@ingroup WLANSCAN +@fn \ + int8_t m2m_wifi_req_scan_result(uint8_t index); + +@brief + Asynchronous API to request the information of an access point discovered via scanning. + +@details + This function allows the information of any discovered access point to be retrieved. When a + scan is completed, the application is informed of the number of networks (access points) + discovered. Calling this function with an index, N, will return the information for the Nth + access point. The information will be returned to the application via a + @ref M2M_WIFI_RESP_SCAN_RESULT event, and the response data may be obtained through casting + the pointer (pvMsg) to @ref tstrM2mWifiscanResult. + +@param[in] index + Index for the requested result, the index range start from 0 till number of AP's found. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mWifiscanResult + m2m_wifi_get_num_ap_found + m2m_wifi_request_scan + +@pre + - @ref m2m_wifi_request_scan must be called first to ensure up to date results are available. + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + in order to receive scan data after calling this function. Registration of the callback + is done via the @ref m2m_wifi_init function. + - The event @ref M2M_WIFI_RESP_SCAN_RESULT must be handled in the callback to receive the + requested scan information. + +@warning + - This API is valid only for STA mode, it may be called regardless of the connection state (connected or disconnected). + - Calling this function without first issuing a scan request may lead to stale data being recovered. + - Application code should refrain from introducing significant delays between issuing the scan + request and scan result requests. + +@section WIFIExample8 Example + The code snippet demonstrates an example of how the scan request is called from the application's main function and + the handling of the events received in the response. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_SCAN_DONE: + { + tstrM2mScanDone *pstrInfo = (tstrM2mScanDone*)pvMsg; + + printf("Num of AP found %d\n",pstrInfo->u8NumofCh); + if(pstrInfo->s8ScanState == M2M_SUCCESS) + { + u8ScanResultIdx = 0; + if(pstrInfo->u8NumofCh >= 1) + { + m2m_wifi_req_scan_result(u8ScanResultIdx); + u8ScanResultIdx ++; + } + else + { + printf("No AP Found Rescan\n"); + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + } + } + else + { + printf("(ERR) Scan fail with error <%d>\n",pstrInfo->s8ScanState); + } + } + break; + + case M2M_WIFI_RESP_SCAN_RESULT: + { + tstrM2mWifiscanResult *pstrScanResult =(tstrM2mWifiscanResult*)pvMsg; + uint8_t u8NumFoundAPs = m2m_wifi_get_num_ap_found(); + + printf(">>%02d RI %d SEC %s CH %02d BSSID %02X:%02X:%02X:%02X:%02X:%02X SSID %s\n", + pstrScanResult->u8index,pstrScanResult->s8rssi, + pstrScanResult->u8AuthType, + pstrScanResult->u8ch, + pstrScanResult->au8BSSID[0], pstrScanResult->au8BSSID[1], pstrScanResult->au8BSSID[2], + pstrScanResult->au8BSSID[3], pstrScanResult->au8BSSID[4], pstrScanResult->au8BSSID[5], + pstrScanResult->au8SSID); + + if(u8ScanResultIdx < u8NumFoundAPs) + { + // Read the next scan result + m2m_wifi_req_scan_result(index); + u8ScanResultIdx ++; + } + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_request_scan(M2M_WIFI_CH_ALL); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_scan_result(uint8_t index); + +/*! +@ingroup WLANCONNECT +@fn \ + int8_t m2m_wifi_req_curr_rssi(void); + +@brief + Asynchronous API to request the current Receive Signal Strength (RSSI) of the current connection. + +@details + This function will result in the application receiving the RSSI via a + @ref M2M_WIFI_RESP_CURRENT_RSSI event. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done through passing it to @ref m2m_wifi_init + via the @ref tstrWifiInitParam initialization structure. + - The event @ref M2M_WIFI_RESP_CURRENT_RSSI must be handled in the callback to receive the requested Rssi information. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@section WIFIExample9 Example + The code snippet demonstrates how the RSSI request is called in the application's main function and the handling of the event received in the callback. +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +void wifi_event_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + static uint8_t u8ScanResultIdx = 0; + + switch(u8WiFiEvent) + { + case M2M_WIFI_RESP_CURRENT_RSSI: + { + int8_t *rssi = (int8_t*)pvMsg; + M2M_INFO("ch rssi %d\n",*rssi); + } + break; + default: + break; + } +} + +int main() +{ + tstrWifiInitParam param; + + param.pfAppWifiCb = wifi_event_cb; + if(!m2m_wifi_init(¶m)) + { + // Scan all channels + m2m_wifi_req_curr_rssi(); + + while(1) + { + m2m_wifi_handle_events(NULL); + } + } +} +@endcode +*/ +int8_t m2m_wifi_req_curr_rssi(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +@brief + Synchronous API to query the MAC address programmed into the WINC OTP memory. + +@details + This function attempts to read the device's MAC address from the One Time Programmable (OTP) + memory on the WINC. The presence (yes or no) of a MAC address in the OTP memory and, in the case + of it being present, its value is returned via RAM pointed to by the input arguments. + + Request the MAC address stored on the One Time Programmable(OTP) memory of the device. + The function is blocking until the response is received. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Output MAC address buffer 6 bytes in size. Valid only if *pu8Valid=1. + +@param[out] pu8IsValid + A boolean value set by the callee to indicate the validity of pu8MacAddr in OTP. If no MAC has + been programmed in the OTP the value of this parameter will be zero; otherwise it will be non-zero. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_get_mac_address +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) + +@brief + Synchronous API to retrieve the MAC address currently in use by the device. + +@details + This function obtains the MAC address that is currently in use by the device. If the function + returns with @ref M2M_SUCCESS then the content of the memory referenced by pu8MacAddr will be + populated with the 6 byte MAC address; otherwise, that memory will be left unchanged. + +@pre + Prior call to @ref m2m_wifi_init is required before any WIFI/socket function. + +@param[out] pu8MacAddr + Pointer to a buffer in memory containing a 6-byte MAC address (provided function returns @ref M2M_SUCCESS). + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + m2m_wifi_get_otp_mac_address +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +@brief + Synchronous API to set the power-save mode of the WINC. + +@details + This is one of the two synchronous power-save setting functions that allow the host MCU application + to tweak the system power consumption. Such tweaking can be done through one of two ways: + - 1) Changing the power save mode, to one of the allowed power save modes (see @ref tenuPowerSaveModes). This is done by setting the first parameter. + - 2) Configuring DTIM monitoring: Configuring beacon monitoring parameters by enabling or disabling the reception of broadcast/multicast data. + This is done by setting the second parameter. + +@param[in] PsTyp + Desired power saving mode. Supported types are enumerated in @ref tenuPowerSaveModes. + +@param[in] BcastEn + Broadcast reception enable flag. + If set to 1, the WINC will wake for each DTIM beacon to ensure broadcast traffic can be received. + If set to 0, the WINC will not wakeup at the DTIM beacon, ignoring broadcast traffic, instead it will + wake every N beacon periods, as per the negotiated Listen Interval. + +@warning + The function called once after initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@see + tenuPowerSaveModes + m2m_wifi_get_sleep_mode + m2m_wifi_set_lsn_int +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +@brief + Asynchronous API to place the WINC into sleep mode for a specified period of time. + +@details + Power-save sleep request function, which requests the WINC device to sleep in the currently configured + power save mode, as set using @ref m2m_wifi_set_sleep_mode, for a specific time as defined by the parameter + u32SlpReqTime (measured in milliseconds). + This function should be used when the WINC is running in @ref M2M_PS_MANUAL power save mode only. + A wake up request is automatically performed by the WINC device when any host driver API function, e.g. Wi-Fi or socket operation is called. + +@param[in] u32SlpReqTime + Request sleep time in ms.\n + The best recommended sleep duration is left to be determined by the application. + Taking into account that if the application sends notifications very rarely, + sleeping for a long time can be a power-efficient decision. + In contrast, applications that are sensitive for long periods of absence can experience + performance degradation in the connection if long sleeping times are used. + +@return + The function returns @ref M2M_SUCCESS for successful operation and a negative value otherwise. + +@warning + - This API is currently unsupported on the WINC3400 + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime); + +/*! +@ingroup WLANPS +@fn \ + uint8_t m2m_wifi_get_sleep_mode(void); + +@brief + Synchronous API to retrieve the current power save mode of the WINC. + +@return + The current operating power saving mode. The value will be one of those from the enumerated type @ref tenuPowerSaveModes. + +@see + tenuPowerSaveModes + m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +@brief + Asynchronous API to set the Wi-Fi Direct "Device Name" of the WINC. + +@details + Sets the WINC device name. The name string is used as a device name in DHCP + hostname (option 12). + If a device is not set through this function a default name is assigned. + The default name is WINC-XX-YY, where XX and YY are the last 2 octets of the OTP + MAC address. If OTP (eFuse) is programmed, then the default name is WINC-00-00. + +@warning + The function called once after initialization.\n + Used for DHCP client hostname option (12).\n + Device name shall contain only characters allowed in valid internet host name as + defined in RFC 952 and 1123. + +@param[in] pu8DeviceName + Buffer holding the device name. Device name is a null terminated C string. + +@param[in] u8DeviceNameLength + Length of the device name. Should not exceed the maximum device name's + length @ref M2M_DEVICE_NAME_MAX (including null character). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +@brief + Configures what NTP server the SNTP client should use. + +@details + Configures what NTP server the SNTP client should use. Only 1 server name can be provided, if the configured server name begins with an asterisk then it will be treated as a server pool. + The SNTP client can also use the NTP server provided by the DHCP server through option 42. + By default the NTP server provided by DHCP will be tried first, then the built-in default NTP server (time.nist.gov) will be used. + +@param[in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). + +@param[in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH. + +@param[in] useDHCP + Explicity tell the WINC if it should use the NTP server provided by the DHCP server or not. + +@warning + SNTP should be configured before the connection takes place. If SNTP is configured after the device connects to a + network, the new configuration can take a minimum of 24h to be applied. However, it can take even longer since it is + triggered by DHCP renewal. + Currently there is also a known issue in which if the WINC obtains the NTP server from DHCP and then connects to a + different network, it will still use the NTP from the previous network. + Configuring a server name will overwrite the built-in default server until next reboot. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt * pstrM2mLsnInt); + +@brief + Asynchronous API to set Wi-Fi listen interval for power save operation. + +@details + This is one of the two synchronous power-save setting functions that + allow the host MCU application to tweak the system power consumption. Such tweaking can be done by modifying the + Wi-Fi listen interval. The listen interval is how many beacon periods the station can sleep before it wakes up to receive data buffered in the AP. + It is represented in units of AP beacon periods(100ms). + +@warning + The function should be called once after initialization. + +@param[in] pstrM2mLsnInt + Structure holding the listen interval configuration. + +@pre + The function @ref m2m_wifi_set_sleep_mode shall be called first, to set the power saving mode required. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2mLsnInt + m2m_wifi_set_sleep_mode +*/ +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt); + +/**@cond MON_DOC + */ +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *, uint8_t *, uint16_t , uint16_t); + +@brief + Asynchronous call to enable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Wi-Fi monitoring mode (Promiscuous mode) enabling function. + This function enables the monitoring mode, thus allowing two operations to be + performed: + 1) Transmission of manually configured frames, through using the + @ref m2m_wifi_send_wlan_pkt function. + 2) Reception of frames based on a defined filtering criteria. + + Enabling monitoring mode allows for reception of all frames that satisfy the filter criteria in the input parameter and are received on the current wireless channel. + All packets that meet the filtering criteria are passed to the application layer, to + be handled by the assigned monitoring callback function. + The monitoring callback function must be implemented before starting the monitoring mode, + in-order to handle the packets received. + + A dedicated callback function, @ref tpfAppMonCb, must be registered to handle frames received in + promiscuous mode. This is done via an instance of a @ref tstrWifiInitParam structure and a call to + the @ref m2m_wifi_init function. + +@param[in] pstrMtrCtrl + Pointer to @ref tstrM2MWifiMonitorModeCtrl structure holding the filtering parameters. + +@param[in] pu8PayloadBuffer + Pointer to a Buffer allocated by the application. The buffer SHALL hold the Data field of + the WIFI RX Packet (Or a part from it). If it is set to NULL, the WIFI data payload will + be discarded by the monitoring driver. + +@param[in] u16BufferSize + The total size of the pu8PayloadBuffer in bytes. + +@param[in] u16DataOffset + Starting offset in the DATA FIELD of the received WIFI packet. The application may be interested + in reading specific information from the received packet. It must assign the offset to the starting + position of it relative to the DATA payload start.\n + \e Example, \e if \e the \e SSID \e is \e needed \e to \e be \e read \e from \e a \e PROBE \e REQ + \e packet, \e the \e u16Offset \e MUST \e be \e set \e to \e 0. + +@warning + This mode is available as sniffer ONLY, the WINC cannot be connected in any modes (Station, Access Point or P2P). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + tstrM2MWifiMonitorModeCtrl + tstrM2MWifiRxPacketInfo + tstrWifiInitParam + tenuM2mScanCh + m2m_wifi_disable_monitoring_mode + m2m_wifi_send_wlan_pkt + m2m_wifi_send_ethernet_pkt + +@section WIFIExample10 Example + The example demonstrates the main function where-by the monitoring enable function is called after + the initialization of the driver and the packets are handled in the callback function. + +@code +#include "m2m_wifi.h" +#include "m2m_types.h" + +//Declare receive buffer +uint8_t gmgmt[1600]; + +//Callback functions +void wifi_cb(uint8_t u8WiFiEvent, void * pvMsg) +{ + ; +} + +void wifi_monitoring_cb(tstrM2MWifiRxPacketInfo *pstrWifiRxPacket, uint8_t *pu8Payload, uint16_t u16PayloadSize) +{ + if((NULL != pstrWifiRxPacket) && (0 != u16PayloadSize)) { + if(MANAGEMENT == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# MGMT PACKET #***\n"); + } else if(DATA_BASICTYPE == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# DATA PACKET #***\n"); + } else if(CONTROL == pstrWifiRxPacket->u8FrameType) { + M2M_INFO("***# CONTROL PACKET #***\n"); + } + } +} + +int main() +{ + //Register wifi_monitoring_cb + tstrWifiInitParam param; + param.pfAppWifiCb = wifi_cb; + param.pfAppMonCb = wifi_monitoring_cb; + + nm_bsp_init(); + + if(!m2m_wifi_init(¶m)) { + //Enable Monitor Mode with filter to receive all data frames on channel 1 + tstrM2MWifiMonitorModeCtrl strMonitorCtrl = {0}; + strMonitorCtrl.u8ChannelID = M2M_WIFI_CH_1; + strMonitorCtrl.u8FrameType = DATA_BASICTYPE; + strMonitorCtrl.u8FrameSubtype = M2M_WIFI_FRAME_SUB_TYPE_ANY; //Receive any subtype of data frame + m2m_wifi_enable_monitoring_mode(&strMonitorCtrl, gmgmt, sizeof(gmgmt), 0); + + while(1) { + m2m_wifi_handle_events(NULL); + } + } + return 0; +} +@endcode +*/ +int8_t m2m_wifi_enable_monitoring_mode(tstrM2MWifiMonitorModeCtrl *pstrMtrCtrl, uint8_t *pu8PayloadBuffer, + uint16_t u16BufferSize, uint16_t u16DataOffset); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_disable_monitoring_mode(void); + +@brief + Asynchronous API to disable Wi-Fi monitoring (promiscuous receive) mode. + +@details + Disable Wi-Fi monitoring mode (Promiscuous mode). Expected to be called if the monitoring mode is already enabled, + but if it was called without enabling it, no negative impact will reside. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + */ +int8_t m2m_wifi_disable_monitoring_mode(void); + +/*! +@ingroup WLANMON +@fn \ + int8_t m2m_wifi_send_wlan_pkt(uint8_t *, uint16_t, uint16_t); + +@brief + Asynchronous API to queue a raw Wi-Fi packet for transmission by the WINC. + +@pre + Enable Monitoring mode first using @ref m2m_wifi_enable_monitoring_mode + +@note + The application is responsible for the packets. + +@warning + This function is only useful when operating in monitoring mode. + +@param[in] pu8WlanPacket + Pointer to a buffer holding the whole WIFI frame. + +@param[in] u16WlanHeaderLength + The size of the WIFI packet header ONLY. + +@param[in] u16WlanPktSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_monitoring_mode + m2m_wifi_disable_monitoring_mode +*/ +int8_t m2m_wifi_send_wlan_pkt(uint8_t *pu8WlanPacket, uint16_t u16WlanHeaderLength, uint16_t u16WlanPktSize); +/**@endcond*/ //MON_DOC + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_send_ethernet_pkt(uint8_t* pu8Packet,uint16_t u16PacketSize); + +@brief + Asynchronous API to queue an Ethernet packet for transmission by the WINC. + +@details + Transmit a packet directly in ETHERNET/bypass mode where the TCP/IP stack is disabled + and the implementation of this packet is left to the application developer. + The Ethernet packet composition is left to the application developer. + +@note + Packets are the user's responsibility. + +@warning + This function available in ETHERNET/Bypass mode ONLY. Make sure that application defines ETH_MODE. + +@param[in] pu8Packet + Pointer to a buffer holding the whole Ethernet frame. + +@param[in] u16PacketSize + The size of the whole packet in bytes. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_set_receive_buffer +*/ +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_enable_sntp(uint8_t); + +@brief + Asynchronous API to enable or disable the native Simple Network Time Protocol(SNTP) client running on the WINC. + +@details + The SNTP client is enabled by default during chip initialization. This function can be used to + disable or subsequently re-enable the service. + + The service is capable of synchronizing the WINC system clock to the UTC time from a well-known + (and trusted) time server, for example "time.nist.gov". By default the SNTP client will update the + system time once every 24 hours. The ability to track the time accurately is important for various + applications such as checking expiry of X509 certificates during TLS (Transport Layer Security) + session establishment. + + It is highly recommended to leave SNTP enabled if there is no alternative source of timing + information. For systems including an RTC device, SNTP may not be needed and the WINC's time + may be set using the @ref m2m_wifi_set_system_time function. + +@param[in] bEnable + Enables or disables the SNTP service + '0' :disable SNTP + '1' :enable SNTP + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_system_time + */ +int8_t m2m_wifi_enable_sntp(uint8_t bEnable); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_set_system_time(uint32_t); + +@brief + Asynchronous function for setting the system time within the WINC. + +@details + Function for setting the system time in time/date format (@ref uint32_t). + The @ref tstrSystemTime structure can be used as a reference to the time values that + should be set and pass its value as @ref uint32_t. + +@param[in] u32UTCSeconds + Seconds elapsed since January 1, 1900 (NTP Timestamp). + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + +@note + If there is an RTC on the host MCU, the SNTP may be disabled and the host may set the system + time within the firmware using the API @ref m2m_wifi_set_system_time. + */ +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds); + +/*! +@ingroup WLANTIME +@fn \ + int8_t m2m_wifi_get_system_time(void); + +@brief + Asynchronous API to obtain the system time in use by the WINC. + +@details + This function will request the WINC to report its current system time to the application. The + information will arrive at the application via the @ref tpfAppWifiCb and event @ref M2M_WIFI_RESP_GET_SYS_TIME. + Response time retrieved is parsed into the members defined in the structure @ref tstrSystemTime. + +@note + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. + - The event @ref M2M_WIFI_RESP_GET_SYS_TIME must be handled in the callback. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + tstrSystemTime + */ +int8_t m2m_wifi_get_system_time(void); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_cust_InfoElement(uint8_t*); + +@brief + Asynchronous API to add or remove a user-defined Information Element. + +@details + This function allows the application to provide a custom Information Element to the + WINC that will be included in all beacon and probe response frames, while in Access Point mode. + If it is required to delete these IEs, fill the buffer with zeros. + +@param[in] pau8M2mCustInfoElement + Pointer to Buffer containing the IE to be used. It is the application developer's + responsibility to ensure on the correctness of the information element's ordering + passed in. + If the pointer is null, this removes any current custom IE. If non-null, the pointer + must reference data in the following format: + +@verbatim + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- + | Byte[0] | Byte[1] | Byte[2] | Byte[3:length1+2] | ..... | Byte[n] | Byte[n+1] | Byte[n+2:lengthx+2] | + |---------------|----------|----------|-------------------|-------- --------|-----------|---------------------| + | #of all Bytes | IE1 ID | Length1 | Data1(Hex Coded) | ..... | IEx ID | Lengthx | Datax(Hex Coded) | + --------------- ---------- ---------- ------------------- -------- -------- ----------- ----------------------- +@endverbatim + +@warning + Size of All elements combined must not exceed 255 byte. + Used in Access Point Mode. + +@note + IEs Format will follow the above format. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_sntp + +@section WIFIExample11 Example + The example demonstrates how the information elements are set using this function. +@code +char elementData[21]; +static char state = 0; // To Add, Append, and Delete +if(0 == state) { //Add 3 IEs + state = 1; + //Total Number of Bytes + elementData[0]=12; + //First IE + elementData[1]=200; elementData[2]=1; elementData[3]='A'; + //Second IE + elementData[4]=201; elementData[5]=2; elementData[6]='B'; elementData[7]='C'; + //Third IE + elementData[8]=202; elementData[9]=3; elementData[10]='D'; elementData[11]=0; elementData[12]='F'; +} else if(1 == state) { + //Append 2 IEs to others, Notice that we keep old data in array starting with\n + //element 13 and total number of bytes increased to 20 + state = 2; + //Total Number of Bytes + elementData[0]=20; + //Fourth IE + elementData[13]=203; elementData[14]=1; elementData[15]='G'; + //Fifth IE + elementData[16]=204; elementData[17]=3; elementData[18]='X'; elementData[19]=5; elementData[20]='Z'; +} else if(2 == state) { //Delete All IEs + state = 0; + //Total Number of Bytes + elementData[0]=0; +} +m2m_wifi_set_cust_InfoElement(elementData); +@endcode + */ +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement); + +/*! +@ingroup WLANPS +@fn \ + int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +@brief + Change the power profile mode. + +@param[in] u8PwrMode + Change the WINC power profile to different mode based on the enumeration @ref tenuM2mPwrMode.\n + Not implemented in WINC3400 firmware. + +@warning + May only be called after initialization, before any connection request, and may not be used to change + the power mode thereafter. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mPwrMode + m2m_wifi_init +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +@brief + Set the TX power tenuM2mTxPwrLevel. + +@param[in] u8TxPwrLevel + Change the TX power based on the enumeration @ref tenuM2mTxPwrLevel. + +@pre + Must be called after the initialization and before any connection request and can't be changed in runtime. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + tenuM2mTxPwrLevel + m2m_wifi_init +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); + +/*! +@ingroup WLANLOG +@fn \ + int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +@brief + Enable or Disable logs in run time. + +@details + Enable or Disable logs in run time (Disable Firmware logs will enhance the firmware start-up time and performance). + +@param[in] u8Enable + Set 1 to enable the logs, 0 for disable. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); + +/*! +@ingroup WLANCONF +@fn \ + int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +@brief + Set the battery voltage to update the firmware calculations.\n + Not implemented in WINC3400 firmware. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@param [in] u16BattVoltx100 + Battery voltage multiplied by 100 + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +@brief + Asynchronous API to add or remove MAC addresses to the multicast filter. + +@details + This function will configure the WINC to receive/ignore multicast packets from certain + MAC address groups when operating in bypass mode. + This function requests the given MAC addresses to be added/removed from the multicast filter. + +@param[in] pu8MulticastMacAddress + Pointer to MAC address + +@param[in] u8AddRemove + A flag to add or remove the MAC ADDRESS, based on the following values: + - 0 : remove MAC address + - 1 : add MAC address + +@note + Maximum number of MAC addresses that could be added is 8. + +@warning + This function is available in ETHERNET/bypass mode ONLY. + Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_set_receive_buffer + m2m_wifi_send_ethernet_pkt + */ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove); + +/*! +@ingroup WLANETH +@fn \ + int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +@brief + Synchronous function for setting or modifying the receiver buffer's length. + +@details + Synchronous function for setting or modifying the receiver buffer's length. + In the ETHERNET/bypass mode the application should define a callback of type + @ref tpfAppEthCb, through which the application handles the received + ethernet frames. It is through this callback function that the user can + dynamically modify the length of the currently used receiver buffer. + +@param[in] pvBuffer + Pointer to Buffer to receive data. + NULL pointer causes a negative error @ref M2M_ERR_FAIL. + +@param[in] u16BufferLen + Length of data to be received. Maximum length of data should not exceed the size defined by TCP/IP + defined as @ref SOCKET_BUFFER_MAX_LENGTH + +@warning + This function is available in the Ethernet/bypass mode ONLY. Make sure that the application defines ETH_MODE. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC and a negative value otherwise. + +@see + m2m_wifi_enable_mac_mcast + m2m_wifi_send_ethernet_pkt +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen); + +/*! +@ingroup WLANCRYPTO +@fn \ + int8_t m2m_wifi_prng_get_random_bytes(uint8_t* pu8PrngBuff,uint16_t u16PrngSize); + +@brief + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes. + +@details + Asynchronous function for retrieving from the firmware a pseudo-random set of bytes as specified in the size passed in as a parameter. + The registered wifi-cb function retrieves the random bytes through the response @ref M2M_WIFI_RESP_GET_PRNG + +@param[in] pu8PrngBuff + Pointer to a buffer to receive data. + +@param[in] u16PrngSize + Request size in bytes + +@warning + Size greater than the maximum specified (@ref M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)) + causes a negative error @ref M2M_ERR_FAIL. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +@brief + Enable WiFi STA roaming. + +@details + m2m_wifi_enable_roaming enables the firmware to trigger the roaming algorithm/steps on link loss with the current AP. + If roaming is successful, the @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_ROAMED is sent to the host. + Additionally a @ref M2M_WIFI_REQ_DHCP_CONF message with new DHCP lease details is sent to host (only if bEnableDhcp=1). + If roaming is unsuccessful, a @ref M2M_WIFI_RESP_CON_STATE_CHANGED message with state as @ref M2M_WIFI_DISCONNECTED is sent to host. + +@param[in] bEnableDhcp + 0 : Disables DHCP client execution after roaming to new AP + 1 : Enables DHCP client execution after roaming to new AP + +@pre + Must be called after the initialization. + The roaming algorithm/procedure is internal to the firmware. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp); + +/*! +@ingroup WLANROAMING +@fn \ + int8_t m2m_wifi_disable_roaming(void); + +@brief + Disable WiFi STA roaming. + +@pre + Must be called after the initialization. + +@return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + +@see + m2m_wifi_init +*/ +int8_t m2m_wifi_disable_roaming(void); + +/*! +@ingroup WLANINIT +@fn \ + uint8_t m2m_wifi_get_state(void); + +@brief + Get the wifi state. + +@return + The function returns the current wifi state (see @ref tenuWifiState for the possible states). + +@note + Check the WINC state. See @ref tenuWifiState for possible states.\n + @ref WIFI_STATE_INIT state represents WINC initialized but not started, this is a suitable state + for safe flash access. + +@sa + m2m_wifi_init + m2m_wifi_download_mode +*/ +uint8_t m2m_wifi_get_state(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Asynchronous API to send an encapsulated Atmel BLE message over the Wifi Host Interface. + +@param[in] msg + Pointer to the start of the BLE message to transfer down to the WINC. + +@param[in] len + The length of the message in octets. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + */ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +@brief + Asynchronous API that notifies the WINC with the Gain Table index from Flash that should use to configure the WiFi and BLE gains. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_restrict_ble(void); + +@brief + Asynchronous API to request restricting of BLE functionality by placing the BLE processor in a low power state. + It is recommended to do this if it is known that BLE functionality will not be used for any significant length of time. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_restrict_ble(void); + +/*! +@ingroup BLEAPI +@fn \ + int8_t m2m_wifi_req_unrestrict_ble(void); + +@brief + Asynchronous API to request un-restricting of BLE functionality by reverting the BLE processor to full power mode. + +@return + The function returns @ref M2M_SUCCESS if the command has been successfully queued to the WINC, + and a negative value otherwise. + +@pre + - A Wi-Fi notification callback of type @ref tpfAppWifiCb MUST be implemented and registered + during initialization. Registration of the callback is done via the @ref m2m_wifi_init API. +*/ +int8_t m2m_wifi_req_unrestrict_ble(void); + +/** @defgroup VERSION Version + @brief + Describes the APIs for reading the version information of the WINC firmware. + @{ + @defgroup VERSIONDEF Defines + @brief + Specifies the macros and defines used by the version APIs. + + @defgroup VERSIONAPI Functions + @brief + Lists the APIs for reading the version information of the WINC firmware. + @} + */ + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev); + +@brief + Synchronous API to obtain the firmware version currently running on the WINC. + +@details + Get the Firmware version info from the active partition, as defined in the structure @ref tstrM2mRev. + +@param[out] pstrRev + Pointer to a variable of type @ref tstrM2mRev, which contains the firmware version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre + Must be called after initialization through the following function @ref m2m_wifi_init. + +@sa + m2m_wifi_init +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@ingroup VERSIONAPI +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@param[out] pstrRev + Pointer to variable of type @ref tstrM2mRev which contains the ota fw version parameters. + +@return + The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Synchronous API to obtain the firmware WINC chip ID. + +@return + The function returns chipID > 0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void); + +/*! +@ingroup OTAFUNCTIONS +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC. + +@return + The function returns @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void); + +#ifdef __cplusplus +} +#endif +#endif /* __M2M_WIFI_H__ */ + diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/nmasic.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmasic.h new file mode 100644 index 0000000..5b20c40 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmasic.h @@ -0,0 +1,148 @@ +/******************************************************************************* + This module contains WINC3400 ASIC specific internal APIs. + + File Name: + nmasic.h + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMASIC_H_ +#define _NMASIC_H_ + +#include "nm_common.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define rNMI_GP_REG_0 (0x149c) +#define rNMI_GP_REG_1 (0x14A0) +#define rNMI_GLB_RESET (0x1400) +#define rNMI_BOOT_RESET_MUX (0x1118) +#define NMI_STATE_REG (0x108c) +#define BOOTROM_REG (0xc000c) +#define NMI_REV_REG (0x207ac) /*Also, Used to load ATE firmware from SPI Flash and to ensure that it is running too*/ +#define M2M_WAIT_FOR_HOST_REG (0x207bc) +#define M2M_FINISH_INIT_STATE 0x02532636UL +#define M2M_FINISH_BOOT_ROM 0x10add09eUL +#define M2M_START_FIRMWARE 0xef522f61UL +#define M2M_START_PS_FIRMWARE 0x94992610UL + +#define M2M_ATE_FW_START_VALUE (0x3C1CD57D) /*Also, Change this value in boot_firmware if it will be changed here*/ +#define M2M_ATE_FW_IS_UP_VALUE (0xD75DC1C3) /*Also, Change this value in ATE (Burst) firmware if it will be changed here*/ + +#define REV_2B0 (0x2B0) +#define REV_B0 (0x2B0) +#define REV_3A0 (0x3A0) +#define CHIP_ID_3000D (0x3000D0) + +#define GET_CHIPID() nmi_get_chipid() +#define ISNMC1000(id) (((id & 0xfffff000) == 0x100000) ? 1 : 0) +#define ISNMC1500(id) (((id & 0xfffff000) == 0x150000) ? 1 : 0) +#define ISNMC3400(id) (((id & 0xfff0f000) == 0x300000) ? 1 : 0) +#define REV(id) ( ((id) & 0x00000fff ) ) +#define EFUSED_MAC(value) (value & 0xffff0000) + +#define rHAVE_SDIO_IRQ_GPIO_BIT (NBIT0) +#define rHAVE_USE_PMU_BIT (NBIT1) +#define rHAVE_SLEEP_CLK_SRC_RTC_BIT (NBIT2) +#define rHAVE_SLEEP_CLK_SRC_XO_BIT (NBIT3) +#define rHAVE_EXT_PA_INV_TX_RX (NBIT4) +#define rHAVE_LEGACY_RF_SETTINGS (NBIT5) +#define rHAVE_LOGS_DISABLED_BIT (NBIT6) +#define rHAVE_ETHERNET_MODE_BIT (NBIT7) + +typedef struct { + uint32_t u32Mac_efuse_mib; + uint32_t u32Firmware_Ota_rev; +} tstrGpRegs; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_clkless_wake + * @brief Wakeup the chip using clockless registers + * @return ZERO in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_clkless_wake(void); + +int8_t chip_wake(void); + +int8_t chip_sleep(void); + +void chip_idle(void); + +void enable_rf_blocks(void); + +int8_t enable_interrupts(void); + +int8_t cpu_start(void); + +uint32_t nmi_get_chipid(void); + +uint32_t nmi_get_rfrevid(void); + +void restore_pmu_settings_after_global_reset(void); + +void nmi_update_pll(void); + +void nmi_set_sys_clk_src_to_xo(void); + +int8_t chip_reset(void); + +int8_t wait_for_bootrom(uint8_t); + +int8_t wait_for_firmware_start(uint8_t); + +int8_t chip_deinit(void); + +int8_t chip_reset_and_cpu_halt(void); + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir); + +int8_t set_gpio_val(uint8_t gpio, uint8_t val); + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val); + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable); + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr); + +int8_t chip_apply_conf(uint32_t u32conf); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMASIC_H_*/ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/nmbus.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmbus.h new file mode 100644 index 0000000..dd13e9a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmbus.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.h + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMBUS_H_ +#define _NMBUS_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal); + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void); + +/** + * @fn nm_bus_reset + * @brief Reset bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void); + +/** + * @fn nm_bus_iface_reconfigure + * @brief Reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr); + +/** + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr); + +/** + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMBUS_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/nmdrv.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmdrv.h new file mode 100644 index 0000000..063e624 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmdrv.h @@ -0,0 +1,176 @@ +/******************************************************************************* + This module contains WINC3400 M2M driver APIs declarations. + + File Name: + nmdrv.h + + Summary: + This module contains WINC3400 M2M driver APIs declarations. + + Description: + This module contains WINC3400 M2M driver APIs declarations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMDRV_H_ +#define _NMDRV_H_ + +#include "nm_common.h" + +/*! +@enum \ + tenuNmState +@brief + Enumeration for WINC state + The following is used to track the state of the WINC (not initialized, initialized or started) + +@remarks + This is useful when putting the WINC in "download mode" to access the flash via SPI. By using + @ref nm_get_state and checking against the desired state, it is possible to validate whether + it is safe to proceed with SPI Flash access. +*/ +typedef enum { + NM_STATE_DEINIT, + /*!< WINC is not initialized */ + NM_STATE_INIT, + /*!< WINC has been initialized. SPI flash access is possible. */ + NM_STATE_START, + /*!< WINC has started */ +} tenuNmState; + +/** +* @struct tstrM2mRev +* @brief Structure holding firmware version parameters and build date/time +*/ +typedef struct { + uint16_t u16FirmwareHifInfo; /* Fw HIF Info */ + uint8_t u8FirmwareMajor; /* Version Major Number */ + uint8_t u8FirmwareRsvd; /* Reserved */ + uint8_t u8FirmwareMinor; /* Version Minor */ + uint8_t u8FirmwarePatch; /* Patch Number */ + uint8_t BuildDate[sizeof(__DATE__)]; // 12 bytes + uint8_t BuildTime[sizeof(__TIME__)]; // 9 bytes +} tstrM2mRev; + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the active partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_firmware_full_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] pstrRev + * Pointer holds address of structure @ref tstrM2mRev that contains the version parameters + * of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev* pstrRev); + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void); + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg); + +/** + * @fn nm_drv_init_hold + * @brief First part of nm_drv_init, up to the point of initializing spi for flash access. + * @see nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_hold(void); + +/** + * @fn nm_drv_init_start + * @brief Second part of nm_drv_init, continuing from where nm_drv_init_hold left off. + * @see nm_drv_init + * @param[in] arg + * Parameter inherited from nm_drv_init + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_start(void* arg); + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + * @param[in] arg + * Generic argument unused. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_deinit(void* arg); + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void); + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void); + +#ifdef __cplusplus +} +#endif + +#endif /*_NMDRV_H_*/ + + diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/include/nmspi.h b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmspi.h new file mode 100644 index 0000000..75fd0e8 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/include/nmspi.h @@ -0,0 +1,137 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.h + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NMSPI_H_ +#define _NMSPI_H_ + +#include "nm_common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @fn nm_spi_init + * @brief Initialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_spi_init(void); + +/** +* @fn nm_spi_lock_init +* @brief Initialize the SPI lock +* @return None +*/ +void nm_spi_lock_init(void); + +/** + * @fn nm_spi_reset + * @brief Reset the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_reset(void); + +/** + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_deinit(void); + +/** + * @fn nm_spi_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_spi_read_reg(uint32_t u32Addr); + +/** + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal); + +/** + * @fn nm_spi_write_reg + * @brief Write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val); + +/** + * @fn nm_spi_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +/** + * @fn nm_spi_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return @ref M2M_SUCCESS in case of success and @ref M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz); + +#ifdef __cplusplus +} +#endif + +#endif /* _NMSPI_H_ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_flash.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_flash.c new file mode 100644 index 0000000..3ff97dc --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_flash.c @@ -0,0 +1,354 @@ +/******************************************************************************* + File Name: + m2m_flash.c + + Summary: + This module contains the WINC flash interface. + + Description: + This module contains the WINC flash interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "m2m_flash.h" +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nmdrv.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +TYPEDEFS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +typedef struct +{ + uint32_t address; + uint32_t size; +} tstrFlashMapEntry; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static const tstrFlashMapEntry flashMap[] = +{ + {0 , 0 }, // WINC_FLASH_REGION_RAW, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_ACTIVE, + {0 , OTA_IMAGE_SIZE }, // WINC_FLASH_REGION_FIRMWARE_INACTIVE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ }, // WINC_FLASH_REGION_PLL_TABLE, + {M2M_GAIN_FLASH_OFFSET , M2M_GAIN_FLASH_SZ }, // WINC_FLASH_REGION_GAIN_TABLE, + {M2M_PLL_FLASH_OFFSET , M2M_PLL_FLASH_SZ+M2M_GAIN_FLASH_SZ}, // WINC_FLASH_REGION_PLL_AND_GAIN_TABLES, + {M2M_TLS_ROOTCER_FLASH_OFFSET , M2M_TLS_ROOTCER_FLASH_SZ }, // WINC_FLASH_REGION_ROOT_CERTS, + {M2M_TLS_SERVER_FLASH_OFFSET , M2M_TLS_SERVER_FLASH_SZ }, // WINC_FLASH_REGION_LOCAL_CERTS, + {M2M_CACHED_CONNS_FLASH_OFFSET , M2M_CACHED_CONNS_FLASH_SZ }, // WINC_FLASH_REGION_CONN_PARAM, + {0 , M2M_HTTP_MEM_FLASH_SZ }, // WINC_FLASH_REGION_HTTP_FILES, +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +static int8_t winc_flash_compare(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_SUCCESS; + uint8_t buf[128]; + uint32_t offset = 0; + + while(offset < u32Size) + { + uint32_t chunk_sz = sizeof(buf); + if(chunk_sz > u32Size - offset) + chunk_sz = u32Size - offset; + ret = spi_flash_read(buf, u32Offset + offset, chunk_sz); + if(ret != M2M_SUCCESS) + break; + ret = memcmp(buf, pu8Buf + offset, chunk_sz); + if(ret != 0) + break; + offset += chunk_sz; + } + return ret; +} +static int8_t winc_flash_write_verify(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Size) +{ + int8_t ret = M2M_ERR_FAIL; + uint8_t count = 20; + + while((ret != M2M_SUCCESS) && (count-- > 0)) + { + ret = spi_flash_write(pu8Buf, u32Offset, u32Size); + if(ret == M2M_SUCCESS) + ret = winc_flash_compare(pu8Buf, u32Offset, u32Size); + } + return ret; +} + +/* Some internal functions for accessing the control structure. */ +static uint8_t crc7(uint8_t crc, const uint8_t *buff, uint16_t len) +{ + uint8_t reg = crc; + uint16_t i; + for(i = 0; i < len; i++) + { + uint16_t g; + for(g = 0; g < 8; g++) + { + uint8_t inv = (((buff[i] << g) & 0x80) >> 7) ^ ((reg >> 6) & 1); + reg = ((reg << 1) & 0x7f) ^ (9 * inv); + } + } + return reg; +} +static int8_t verify_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret = M2M_SUCCESS; + + if(pstrControlSec->u32OtaMagicValue != OTA_MAGIC_VALUE) + s8Ret = M2M_ERR_FAIL; + if(pstrControlSec->u32OtaControlSecCrc != crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4)) + s8Ret = M2M_ERR_FAIL; + + return s8Ret; +} +static int8_t read_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t s8Ret; + + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + + if(s8Ret != M2M_SUCCESS) + { + s8Ret = spi_flash_read((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(s8Ret == M2M_SUCCESS) + s8Ret = verify_control_structure(pstrControlSec); + } + + return s8Ret; +} +static int8_t update_control_structure(tstrOtaControlSec *pstrControlSec) +{ + int8_t ret = M2M_ERR_FAIL; + + ret = spi_flash_erase(M2M_BACKUP_FLASH_OFFSET, M2M_BACKUP_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_BACKUP_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + if(ret == M2M_SUCCESS) + { + ret = spi_flash_erase(M2M_CONTROL_FLASH_OFFSET, M2M_CONTROL_FLASH_SZ); + if(ret == M2M_SUCCESS) + { + pstrControlSec->u32OtaSequenceNumber++; + pstrControlSec->u32OtaControlSecCrc = crc7(0x7f, (uint8_t *)pstrControlSec, sizeof(tstrOtaControlSec) - 4); + ret = winc_flash_write_verify((uint8_t *)pstrControlSec, M2M_CONTROL_FLASH_OFFSET, sizeof(tstrOtaControlSec)); + } + } + } + return ret; +} + +static bool find_flash_section(tenuWincFlashRegion enuRegion, uint32_t *pu32StartAddr, uint32_t *pu32Size) +{ + /* Ensure the pointers and region are valid. */ + if((NULL == pu32StartAddr) || (NULL == pu32Size) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return false; + + /* For the raw region resolve the full flash space, otherwise lookup + the region location and size from the flexible flash map. */ + switch(enuRegion) + { + case WINC_FLASH_REGION_RAW: + *pu32StartAddr = 0; + *pu32Size = spi_flash_get_size() << 17; + break; + case WINC_FLASH_REGION_FIRMWARE_ACTIVE: + case WINC_FLASH_REGION_FIRMWARE_INACTIVE: + case WINC_FLASH_REGION_HTTP_FILES: + { + /* In these cases we need to read the control structure to find the appropriate flash address. */ + tstrOtaControlSec strControl; + + /* Check the WINC is initialised and not running. */ + if (NM_STATE_INIT != nm_get_state()) + return false; + + /* Read control structure from flash. */ + if (M2M_SUCCESS != read_control_structure(&strControl)) + return false; + + if (WINC_FLASH_REGION_FIRMWARE_INACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaRollbackImageOffset; + else if (WINC_FLASH_REGION_FIRMWARE_ACTIVE == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset; + else if (WINC_FLASH_REGION_HTTP_FILES == enuRegion) + *pu32StartAddr = strControl.u32OtaCurrentWorkingImagOffset + (M2M_HTTP_MEM_FLASH_OFFSET - M2M_OTA_IMAGE1_OFFSET); + + *pu32Size = flashMap[enuRegion].size; + break; + } + default: + *pu32StartAddr = flashMap[enuRegion].address; + *pu32Size = flashMap[enuRegion].size; + break; + } + + M2M_INFO("Flash lookup %2d: 0x%06" PRIx32 " %0" PRId32 "\r\n", enuRegion, *pu32StartAddr, *pu32Size); + + return true; +} + +int8_t m2m_flash_erase_sector(tenuWincFlashRegion enuRegion, uint8_t u8StartSector, uint8_t u8NumSectors) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the region is valid. */ + if(enuRegion >= WINC_FLASH_NUM_REGIONS) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Erase is only supported for regions which begin on a sector boundary. */ + if(flashAddress & (FLASH_SECTOR_SZ-1)) + return M2M_ERR_INVALID_ARG; + + /* Check requested size fits within region size. */ + if((((uint32_t)u8StartSector + u8NumSectors) * FLASH_SECTOR_SZ) > flashRegionSize) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += (u8StartSector * FLASH_SECTOR_SZ); + + /* Erase the requested sectors. */ + if(M2M_SUCCESS != spi_flash_erase(flashAddress, u8NumSectors * FLASH_SECTOR_SZ)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_write(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Write data to flash. */ + if(M2M_SUCCESS != spi_flash_write(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_read(tenuWincFlashRegion enuRegion, void *pvBuffer, uint32_t u32Offset, uint32_t u32Size) +{ + uint32_t flashAddress; + uint32_t flashRegionSize; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Check the buffer pointer and region are valid. */ + if((NULL == pvBuffer) || (enuRegion >= WINC_FLASH_NUM_REGIONS)) + return M2M_ERR_INVALID_ARG; + + /* Find region address and size. */ + if(false == find_flash_section(enuRegion, &flashAddress, &flashRegionSize)) + return M2M_ERR_FAIL; + + /* Check requested size fits within region size. Also check for wraparound. */ + if(((u32Offset + u32Size) > flashRegionSize) || ((uint32_t)(u32Offset + u32Size) < u32Offset)) + return M2M_ERR_FAIL; + + /* Find start address of area within requested region. */ + flashAddress += u32Offset; + + /* Read data from flash. */ + if(M2M_SUCCESS != spi_flash_read(pvBuffer, flashAddress, u32Size)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +int8_t m2m_flash_switch_firmware(void) +{ + tstrOtaControlSec strControl; + uint32_t u32Tmp; + + /* Check the WINC is initialised and not running. */ + if(NM_STATE_INIT != nm_get_state()) + return M2M_ERR_FAIL; + + /* Read control structure from flash. */ + if(M2M_SUCCESS != read_control_structure(&strControl)) + return M2M_ERR_FAIL; + + /* Switch active and inactive. */ + u32Tmp = strControl.u32OtaRollbackImageOffset; + strControl.u32OtaRollbackImageOffset = strControl.u32OtaCurrentWorkingImagOffset; + strControl.u32OtaCurrentWorkingImagOffset = u32Tmp; + + /* Ensure the inactive image is marked as invalid. This protects m2m_ota_switch_firmware from + switching to an image whose validity is unknown. Switching remains possible via this API. */ + strControl.u32OtaRollbackImageValidStatus = OTA_STATUS_INVALID; + + if(M2M_SUCCESS != update_control_structure(&strControl)) + return M2M_ERR_FAIL; + + return M2M_SUCCESS; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_hif.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_hif.c new file mode 100644 index 0000000..774645b --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_hif.c @@ -0,0 +1,857 @@ +/******************************************************************************* + File Name: + m2m_hif.c + + Summary: + This module contains M2M host interface API implementations. + + Description: + This module contains M2M host interface API implementations. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nmdrv.h" +#include "nm_bsp.h" +#include "m2m_hif.h" +#include "m2m_types.h" +#include "nmasic.h" +#include "m2m_periph.h" +//#include "wdrv_winc_common.h" +//#include "osal/osal.h" + +#define NMI_AHB_DATA_MEM_BASE 0x30000 +#define NMI_AHB_SHARE_MEM_BASE 0xd0000 + +#define WIFI_HOST_RCV_CTRL_0 (0x1070) +#define WIFI_HOST_RCV_CTRL_1 (0x1084) +#define WIFI_HOST_RCV_CTRL_2 (0x1078) +#define WIFI_HOST_RCV_CTRL_3 (0x106c) +#define WIFI_HOST_RCV_CTRL_4 (0x150400) + + +#define INTERRUPT_CORTUS_0_3000D0 (0x10a8) +#define INTERRUPT_CORTUS_1_3000D0 (0x10ac) +#define INTERRUPT_CORTUS_2_3000D0 (0x10b0) +#define INTERRUPT_CORTUS_3_3000D0 (0x10b4) + +//static OSAL_SEM_HANDLE_TYPE hifSemaphore; + +typedef struct { + uint8_t u8ChipMode; + uint8_t u8ChipSleep; + uint8_t u8HifRXDone; + uint8_t u8Interrupt; + uint32_t u32RxAddr; + uint32_t u32RxSize; + tpfHifCallBack pfWifiCb; + tpfHifCallBack pfIpCb; + tpfHifCallBack pfOtaCb; + tpfHifCallBack pfSigmaCb; + tpfHifCallBack pfHifCb; + //tpfHifCallBack pfCryptoCb; + tpfHifCallBack pfSslCb; +} tstrHifContext; + +volatile tstrHifContext gstrHifCxt; + +/* + Special codes for managing HIF restriction to OTA rollback/switch only +*/ +#define HIF_OTA_RB_ONLY 0xFFFF +#define HIFCODE_OTA_RB ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_ROLLBACK) +#define HIFCODE_OTA_SW ((M2M_REQ_GROUP_OTA << 8) | M2M_OTA_REQ_SWITCH_FIRMWARE) +/* + Codes for new HIF messages (since last HIF major increase). + Only need ones which are host->winc. + Each entry is formed of ((GroupId << 8) | OpCode) +*/ +#define HIFCODE_SSL_WRITECERT ((M2M_REQ_GROUP_SSL << 8) | M2M_SSL_REQ_WRITE_OWN_CERTS) +#define HIFCODE_WIFI_PASSIVESCAN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_PASSIVE_SCAN) +#define HIFCODE_WIFI_CONN ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_CONN) +#define HIFCODE_WIFI_CONN_PARAM ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_IND_CONN_PARAM) +#define HIFCODE_WIFI_DELETE_CRED ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQRSP_DELETE_APID) +#define HIFCODE_WIFI_START_PROV_MODE ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_START_PROVISION_MODE) +#define HIFCODE_WIFI_ENABLE_AP ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ENABLE_AP) +#define HIFCODE_IP_RAW_SOCK_OPT ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_RAW_SET_SOCK_OPT) +#define HIFCODE_WIFI_ROAMING ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_ROAMING) +#define HIFCODE_IP_SECURE ((M2M_REQ_GROUP_IP << 8) | SOCKET_CMD_SECURE) +#define HIFCODE_WIFI_SCAN_SSID_LIST ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SCAN_SSID_LIST) +#define HIFCODE_WIFI_SET_STOP_SCAN_OPTION ((M2M_REQ_GROUP_WIFI << 8) | M2M_WIFI_REQ_SET_STOP_SCAN_OPTION) + +/* + List of new HIF messages (since last HIF major increase). + Only need to list ones which are host->winc. + Additionally, entry 0 used to indicate OTA RB/SW only. +*/ +#define NEW_HIF_LIST \ + HIF_OTA_RB_ONLY, \ + HIFCODE_SSL_WRITECERT, \ + HIFCODE_WIFI_PASSIVESCAN, \ + HIFCODE_WIFI_CONN, \ + HIFCODE_WIFI_CONN_PARAM, \ + HIFCODE_WIFI_DELETE_CRED, \ + HIFCODE_WIFI_START_PROV_MODE, \ + HIFCODE_WIFI_ENABLE_AP, \ + HIFCODE_IP_RAW_SOCK_OPT, \ + HIFCODE_WIFI_ROAMING, \ + HIFCODE_IP_SECURE, \ + HIFCODE_WIFI_SCAN_SSID_LIST, \ + HIFCODE_WIFI_SET_STOP_SCAN_OPTION +/* + Array of HIF messages which are not supported by Firmware. + During hif_init() this array is rebased using an offset determined by Firmware HIF level. +*/ +static uint16_t gau16HifBlacklist[] = {NEW_HIF_LIST}; +#define HIF_BLACKLIST_SZ (sizeof(gau16HifBlacklist)/sizeof(gau16HifBlacklist[0])) +static uint8_t gu8HifBlOffset = 0; + + +static int8_t hif_set_rx_done(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + gstrHifCxt.u8HifRXDone = 0; + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_0_3000D0, 1); + if(ret != M2M_SUCCESS)goto ERR1; + } else { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + + /* Set RX Done */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +/** + * @fn static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) + * @brief WiFi call back function + * @param[in] u8OpCode + * HIF Opcode type. + * @param[in] u16DataSize + * HIF data length. + * @param[in] u32Addr + * HIF address. + */ +static void m2m_hif_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ +} + +/** + * @fn int8_t hif_chip_wake(void); + * @brief To Wakeup the chip. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + if(gstrHifCxt.u8HifRXDone) + { + /* chip already wake for the rx not done no need to send wake request */ + return ret; + } + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + { + ret = chip_wake(); + if(ret != M2M_SUCCESS)goto ERR1; + } + } + gstrHifCxt.u8ChipSleep++; +ERR1: + return ret; +} +/*! +@fn \ + void hif_set_sleep_mode(uint8_t u8Pstype); + +@brief + Set the sleep mode of the HIF layer. + +@param [in] u8Pstype + Sleep mode. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ + +void hif_set_sleep_mode(uint8_t u8Pstype) +{ + gstrHifCxt.u8ChipMode = u8Pstype; +} + +/*! +@fn \ + uint8_t hif_get_sleep_mode(void); + +@brief + Get the sleep mode of the HIF layer. + +@return + The function SHALL return the sleep mode of the HIF layer. +*/ +uint8_t hif_get_sleep_mode(void) +{ + return gstrHifCxt.u8ChipMode; +} + +/** + * @fn int8_t hif_chip_sleep_sc(void); + * @brief To clear the chip sleep but keep the chip sleep + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +static int8_t hif_chip_sleep_sc(void) +{ + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + return M2M_SUCCESS; +} + + +/** + * @fn int8_t hif_chip_sleep(void); + * @brief To make the chip sleep. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_chip_sleep(void) +{ + int8_t ret = M2M_SUCCESS; + + if(gstrHifCxt.u8ChipSleep >= 1) + { + gstrHifCxt.u8ChipSleep--; + } + + if(gstrHifCxt.u8ChipSleep == 0) + { + if(gstrHifCxt.u8ChipMode != M2M_NO_PS) + ret = chip_sleep(); + } + return ret; +} + +/** + * @fn int8_t hif_init(void * arg); + * @brief To initialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_init(void *arg) +{ + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + +// if (OSAL_RESULT_TRUE != OSAL_SEM_Create(&hifSemaphore, OSAL_SEM_TYPE_BINARY, 1, 1)) +// return M2M_ERR_INIT; + + hif_register_cb(M2M_REQ_GROUP_HIF, m2m_hif_cb); + return hif_chip_sleep(); +} + +/** + * @fn int8_t hif_deinit(void * arg); + * @brief To Deinitialize HIF layer. + * @param[in] arg + * Pointer to the arguments. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_deinit(void *arg) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + memset((uint8_t*)&gstrHifCxt, 0, sizeof(tstrHifContext)); + return ret; +} + +/** + * @fn int8_t hif_check_compatibility(uint16_t u16HifInfo); + * @brief + * To check the compatibility of an image with the current driver. + * @param [in] u16HifInfo + * HIF info of image to be checked. + * @return The function shall return ZERO for compatible image and a negative value otherwise. + */ +int8_t hif_check_compatibility(uint16_t u16HifInfo) +{ + int8_t ret = M2M_ERR_FW_VER_MISMATCH; + if((M2M_GET_HIF_BLOCK(u16HifInfo) == M2M_HIF_BLOCK_VALUE) && (M2M_GET_HIF_MAJOR(u16HifInfo) == M2M_HIF_MAJOR_VALUE)) + { + ret = M2M_SUCCESS; + } + return ret; +} + +/** + * @fn int8_t hif_enable_access(void); + * @brief + * To enable access to HIF layer, based on HIF level of Firmware. + * This function reads HIF level directly from a register written by Firmware. + * @return The function shall return ZERO for full match operation and a negative value if operation is restricted. + */ +int8_t hif_enable_access(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t fw_hif_info = 0; + + ret = nm_get_hif_info(&fw_hif_info, NULL); + if(ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(fw_hif_info); + if(ret == M2M_SUCCESS) + { + switch(M2M_GET_HIF_MINOR(fw_hif_info)) + { + case 0: + gu8HifBlOffset = 1; + break; + case 1: + gu8HifBlOffset = 2; + break; + case 2: + gu8HifBlOffset = 2; + break; + case 3: + gu8HifBlOffset = 3; + break; + case 4: + gu8HifBlOffset = 10; + break; + case 5: + gu8HifBlOffset = 13; + break; + // Additional case to be added each time hif minor increments. + // All additional cases to be removed in the event of a hif major increment. + // Default catches all cases in which hif minor is greater in Firmware than in Driver. + default: + gu8HifBlOffset = HIF_BLACKLIST_SZ; + break; + } + } + else + { + gu8HifBlOffset = 0; + M2M_ERR("HIF access limited to OTA Switch/Rollback only\r\n"); + } + } + return ret; +} + +/** + * @fn int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode); + * @brief + * To check that a particular hif message is supported with the current driver/firmware pair. + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise. + */ +int8_t hif_check_code(uint8_t u8Gid, uint8_t u8OpCode) +{ + uint8_t u8BlId; + uint16_t u16HifCode = ((uint16_t)u8Gid<<8) | u8OpCode; + if((u16HifCode == HIFCODE_OTA_RB) || (u16HifCode == HIFCODE_OTA_SW)) + { + return M2M_SUCCESS; + } + if(gu8HifBlOffset == 0) + { + M2M_ERR("HIF OTA rb/sw only\r\n"); + return M2M_ERR_SEND; + } + for(u8BlId = gu8HifBlOffset; u8BlId < HIF_BLACKLIST_SZ; u8BlId++) + { + if(u16HifCode == gau16HifBlacklist[u8BlId]) + { + M2M_ERR("HIF message unsupported\r\n"); + return M2M_ERR_SEND; + } + } + return M2M_SUCCESS; +} + +/** + * @fn int8_t hif_send(uint8_t u8Gid,uint8_t u8Opcode,uint8_t *pu8CtrlBuf,uint16_t u16CtrlBufSize, + * uint8_t *pu8DataBuf,uint16_t u16DataSize, uint16_t u16DataOffset) + * @brief Send packet using host interface. + * + * @param[in] u8Gid + * Group ID. + * @param[in] u8Opcode + * Operation ID. + * @param[in] pu8CtrlBuf + * Pointer to the Control buffer. + * @param[in] u16CtrlBufSize + * Control buffer size. + * @param[in] u16DataOffset + * Packet Data offset. + * @param[in] pu8DataBuf + * Packet buffer Allocated by the caller. + * @param[in] u16DataSize + * Packet buffer size (including the HIF header). + * @return The function shall return @ref M2M_SUCCESS for successful operation and a negative value otherwise. + */ +int8_t hif_send(uint8_t u8Gid, uint8_t u8Opcode, uint8_t *pu8CtrlBuf, uint16_t u16CtrlBufSize, + uint8_t *pu8DataBuf, uint16_t u16DataSize, uint16_t u16DataOffset) +{ + int8_t ret = M2M_ERR_SEND; + tstrHifHdr strHif; + uint32_t u32CtrlDataGap = u16DataOffset; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + strHif.u8Opcode = u8Opcode&(~NBIT7); + strHif.u8Gid = u8Gid; + strHif.u16Length = M2M_HIF_HDR_OFFSET; + + if(pu8CtrlBuf != NULL) + { + if(u16CtrlBufSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%dB) exceeds max (%dB)\n", "Ctrl", u16CtrlBufSize, M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u16CtrlBufSize; + u32CtrlDataGap -= u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + if((uint32_t)u16DataOffset + u16DataSize > M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET) + { + M2M_ERR("HIF %s (%luB) exceeds max (%luB)\n", "Data", (uint32_t)u16DataOffset + u16DataSize, (uint32_t)M2M_HIF_MAX_PACKET_SIZE-M2M_HIF_HDR_OFFSET); + goto ERR2; + } + strHif.u16Length += u32CtrlDataGap + u16DataSize; + } + + ret = hif_check_code(strHif.u8Gid, strHif.u8Opcode); + if(ret != M2M_SUCCESS) + { + goto ERR2; + } + + if(strHif.u16Length <= M2M_HIF_MAX_PACKET_SIZE) + { + ret = hif_chip_wake(); + if(ret == M2M_SUCCESS) + { + volatile uint32_t reg, dma_addr = 0; + volatile uint16_t cnt = 0; + + reg = 0UL; + reg |= (uint32_t)u8Gid; + reg |= ((uint32_t)u8Opcode<<8); + reg |= ((uint32_t)strHif.u16Length<<16); + ret = nm_write_reg(NMI_STATE_REG, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + reg = 0UL; + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_2, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + + if (ISNMC3400(nmi_get_chipid())) { + + ret = nm_write_reg(INTERRUPT_CORTUS_1_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + + dma_addr = 0; + + for(cnt = 0; cnt < 1000*5; cnt ++) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_2, (uint32_t *)®); + if(ret != M2M_SUCCESS) break; + /* + * If it takes too long to get a response, the slow down to + * avoid back-to-back register read operations. + */ + if(cnt >= 1000) { + if(cnt == 1000) { + M2M_INFO("Slowing down...\n"); + } + nm_sleep(5); + } + if(!(reg & NBIT1)) + { + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_4, (uint32_t *)&dma_addr); + if(ret != M2M_SUCCESS) { + /*in case of read error clear the DMA address and return error*/ + dma_addr = 0; + goto ERR1; + } + /*in case of success break */ + break; + } + } + + if (dma_addr != 0) + { + volatile uint32_t u32CurrAddr; + u32CurrAddr = dma_addr; + strHif.u16Length=NM_BSP_B_L_16(strHif.u16Length); + M2M_DBG("Writing into %" PRIx32 " %d\r\n", dma_addr, strHif.u16Length); + ret = nm_write_block(u32CurrAddr, (uint8_t*)&strHif, M2M_HIF_HDR_OFFSET); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += M2M_HIF_HDR_OFFSET; + if(pu8CtrlBuf != NULL) + { + ret = nm_write_block(u32CurrAddr, pu8CtrlBuf, u16CtrlBufSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16CtrlBufSize; + } + if(pu8DataBuf != NULL) + { + u32CurrAddr += u32CtrlDataGap; + ret = nm_write_block(u32CurrAddr, pu8DataBuf, u16DataSize); + if(M2M_SUCCESS != ret) goto ERR1; + u32CurrAddr += u16DataSize; + } + + reg = dma_addr << 2; + + /* Following line of code is to generate the interrupt which is not strictly needed for 3400, + but has no noticeable side effects + */ + reg |= NBIT1; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_3, reg); + if(M2M_SUCCESS != ret) goto ERR1; + + if (ISNMC3400(nmi_get_chipid())) { + ret = nm_write_reg(INTERRUPT_CORTUS_2_3000D0, 1); + if(M2M_SUCCESS != ret) goto ERR1; + } + } + else + { + ret = hif_chip_sleep(); + M2M_DBG("Failed to alloc rx size\r\n"); + ret = M2M_ERR_MEM_ALLOC; + goto ERR2; + } + } + else + { + M2M_ERR("(HIF)Failed to wakeup the chip\r\n"); + goto ERR2; + } + } + else + { + M2M_ERR("HIF message length (%d) exceeds max length (%d)\r\n", strHif.u16Length, M2M_HIF_MAX_PACKET_SIZE); + ret = M2M_ERR_SEND; + goto ERR2; + } +// OSAL_SEM_Post(&hifSemaphore); + /*actual sleep ret = M2M_SUCCESS*/ + ret = hif_chip_sleep(); + return ret; +ERR1: + /*reset the count but no actual sleep as it already bus error*/ + hif_chip_sleep_sc(); +ERR2: + /*logical error*/ +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} +/** + * @fn hif_isr + * @brief Host interface interrupt service routine + * @return @ref M2M_SUCCESS in case of success or a negative vale otherwise + */ +static int8_t hif_isr(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg; + volatile tstrHifHdr strHif; + +// while (OSAL_RESULT_FALSE == OSAL_SEM_Pend(&hifSemaphore, OSAL_WAIT_FOREVER)) + { + } + + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS == ret) + { + if(reg & 0x1) /* New interrupt has been received */ + { + uint16_t size; + + /*Clearing RX interrupt*/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(ret != M2M_SUCCESS)goto ERR1; + reg &= ~NBIT0; + ret = nm_write_reg(WIFI_HOST_RCV_CTRL_0, reg); + if(ret != M2M_SUCCESS)goto ERR1; + /* read the rx size */ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_0, ®); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_0 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u8HifRXDone = 1; + size = (uint16_t)((reg >> 2) & 0xfff); + if (size > 0) { + uint32_t address = 0; + /** + start bus transfer + **/ + ret = nm_read_reg_with_ret(WIFI_HOST_RCV_CTRL_1, &address); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) WIFI_HOST_RCV_CTRL_1 bus fail\r\n"); + goto ERR1; + } + gstrHifCxt.u32RxAddr = address; + gstrHifCxt.u32RxSize = size; + ret = nm_read_block(address, (uint8_t*)&strHif, sizeof(tstrHifHdr)); + strHif.u16Length = NM_BSP_B_L_16(strHif.u16Length); + if(M2M_SUCCESS != ret) + { + M2M_ERR("(hif) address bus fail\r\n"); + goto ERR1; + } + if(strHif.u16Length != size) + { + if((size - strHif.u16Length) > 4) + { + M2M_ERR("(hif) Corrupted packet Size = %u \r\n", + size, strHif.u16Length, strHif.u8Gid, strHif.u8Opcode); + ret = M2M_ERR_BUS_FAIL; + goto ERR1; + } + } + +// OSAL_SEM_Post(&hifSemaphore); + + if(M2M_REQ_GROUP_WIFI == strHif.u8Gid) + { + if(gstrHifCxt.pfWifiCb) + gstrHifCxt.pfWifiCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("WIFI callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_IP == strHif.u8Gid) + { + if(gstrHifCxt.pfIpCb) + gstrHifCxt.pfIpCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Socket callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_OTA == strHif.u8Gid) + { + if(gstrHifCxt.pfOtaCb) + gstrHifCxt.pfOtaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("OTA callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SIGMA == strHif.u8Gid) + { + if(gstrHifCxt.pfSigmaCb) + gstrHifCxt.pfSigmaCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("Sigma callback is not registered\r\n"); + } + else if(M2M_REQ_GROUP_SSL == strHif.u8Gid) + { + if(gstrHifCxt.pfSslCb) + gstrHifCxt.pfSslCb(strHif.u8Opcode, strHif.u16Length - M2M_HIF_HDR_OFFSET, address + M2M_HIF_HDR_OFFSET); + else + M2M_ERR("SSL callback is not registered\r\n"); + } + else + { + M2M_ERR("(hif) invalid group ID\r\n"); + return M2M_ERR_BUS_FAIL; + } + if(gstrHifCxt.u8HifRXDone) + { + M2M_ERR("(hif) host app didn't set RX Done <%u><%X>\n", strHif.u8Gid, strHif.u8Opcode); + return hif_set_rx_done(); + } + + return M2M_SUCCESS; + } + else + { + ret = M2M_ERR_RCV; + M2M_ERR("(hif) Wrong Size\r\n"); + goto ERR1; + } + } + else + { + M2M_ERR("(hif) False interrupt %lx\r\n",reg); + ret = M2M_ERR_FAIL; + } + } + else + { + M2M_ERR("(hif) Failed to read interrupt reg\r\n"); + } + +ERR1: +// OSAL_SEM_Post(&hifSemaphore); + return ret; +} + +/** +* @fn hif_handle_isr(void) +* @brief Handle interrupt received from WINC3400 firmware. +* @return The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t hif_handle_isr(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = hif_isr(); + if (M2M_SUCCESS != ret) + { + M2M_ERR("(hif) Failed to handle interrupt %d try Again..\r\n",ret); + } + + return ret; +} + +/** + * @fn hif_receive + * @brief Host interface interrupt service routine + * @param[in] u32Addr + * Receive start address + * @param[out] pu8Buf + * Pointer to receive buffer. Allocated by the caller + * @param[in] u16Sz + * Receive buffer size + * @param[in] isDone + * If you don't need any more packets send True otherwise send false + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t hif_receive(uint32_t u32Addr, uint8_t *pu8Buf, uint16_t u16Sz, uint8_t isDone) +{ + int8_t ret = M2M_SUCCESS; + + if((u32Addr == 0) || (pu8Buf == NULL) || (u16Sz == 0)) + { + if(isDone) + { + ret = hif_set_rx_done(); + } + else + { + ret = M2M_ERR_FAIL; + M2M_ERR(" hif_receive: Invalid argument\r\n"); + } + goto ERR1; + } + + if(u16Sz > gstrHifCxt.u32RxSize) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Size is larger than the received buffer size <%d><%" PRId32 ">\r\n", u16Sz, gstrHifCxt.u32RxSize); + goto ERR1; + } + if((u32Addr < gstrHifCxt.u32RxAddr)||((u32Addr + u16Sz)>(gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize))) + { + ret = M2M_ERR_FAIL; + M2M_ERR("APP Requested Address beyond the received buffer address and length\r\n"); + goto ERR1; + } + + /* Receive the payload */ + ret = nm_read_block(u32Addr, pu8Buf, u16Sz); + if(ret != M2M_SUCCESS)goto ERR1; + + /* check if this is the last packet */ + if( + isDone + || (((gstrHifCxt.u32RxAddr+gstrHifCxt.u32RxSize) - (u32Addr+u16Sz)) <= 3) + /* Length in the RCV CTRL 0 register is rounded off to 4 by the firmware, + but length inside the HIF header is not, hence consider done if fewer than + 4 bytes left to read */ + ) + { + /* set RX done */ + ret = hif_set_rx_done(); + } +ERR1: + return ret; +} + +/** + * @fn hif_register_cb + * @brief To set Callback function for every component + * @param[in] u8Grp + * Group to which the Callback function should be set. + * @param[in] fn + * function to be set + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ + +int8_t hif_register_cb(uint8_t u8Grp, tpfHifCallBack fn) +{ + int8_t ret = M2M_SUCCESS; + switch(u8Grp) + { + case M2M_REQ_GROUP_IP: + gstrHifCxt.pfIpCb = fn; + break; + case M2M_REQ_GROUP_WIFI: + gstrHifCxt.pfWifiCb = fn; + break; + case M2M_REQ_GROUP_OTA: + gstrHifCxt.pfOtaCb = fn; + break; + case M2M_REQ_GROUP_HIF: + gstrHifCxt.pfHifCb = fn; + break; + case M2M_REQ_GROUP_SIGMA: + gstrHifCxt.pfSigmaCb = fn; + break; + case M2M_REQ_GROUP_SSL: + gstrHifCxt.pfSslCb = fn; + break; + default: + M2M_ERR("GRp ? %d\r\n", u8Grp); + ret = M2M_ERR_FAIL; + break; + } + return ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ota.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ota.c new file mode 100644 index 0000000..a38285d --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ota.c @@ -0,0 +1,190 @@ +/******************************************************************************* + WINC3400 IoT OTA Interface. + + File Name: + m2m_ota.c + + Summary: + WINC3400 IoT OTA Interface + + Description: + WINC3400 IoT OTA Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#include "nm_common.h" +#include "m2m_types.h" +#include "m2m_ota.h" +#include "m2m_wifi.h" +#include "m2m_hif.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfOtaUpdateCb gpfOtaUpdateCb = NULL; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** +@fn m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +@brief Internal OTA call back function. +@param[in] u8OpCode + HIF Opcode type. +@param[in] u16DataSize + HIF data length. +@param[in] u32Addr + HIF address. +*/ +static void m2m_ota_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + int8_t s8Ret = M2M_SUCCESS; + if (u8OpCode == M2M_OTA_RESP_UPDATE_STATUS) + { + tstrOtaUpdateStatusResp strOtaUpdateStatusResp; + memset((uint8_t*)&strOtaUpdateStatusResp, 0, sizeof(tstrOtaUpdateStatusResp)); + s8Ret = hif_receive(u32Addr, (uint8_t*)&strOtaUpdateStatusResp, sizeof(tstrOtaUpdateStatusResp), 0); + if(s8Ret == M2M_SUCCESS) + { + if(gpfOtaUpdateCb) + gpfOtaUpdateCb(strOtaUpdateStatusResp.u8OtaUpdateStatusType, strOtaUpdateStatusResp.u8OtaUpdateStatus); + } + } + else + { + M2M_ERR("Invalid OTA resp %d ?\r\n", u8OpCode); + } +} + +/*! +@fn int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb) +@brief Initialize the OTA layer. +@param[in] pfOtaUpdateCb + OTA Update callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_init(tpfOtaUpdateCb pfOtaUpdateCb) +{ + int8_t ret = M2M_SUCCESS; + + if (pfOtaUpdateCb) { + gpfOtaUpdateCb = pfOtaUpdateCb; + } else { + M2M_ERR("Invalid OTA update callback\r\n"); + } + + hif_register_cb(M2M_REQ_GROUP_OTA, m2m_ota_cb); + + return ret; +} + +/*! +@fn int8_t m2m_ota_start_update(unsigned char * pcDownloadUrl) +@brief Request OTA start update using the downloaded URL. +@param[in] pcDownloadUrl + The download firmware URL, you get it from device info. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_start_update(unsigned char *pcDownloadUrl) +{ + int8_t ret = M2M_SUCCESS; + uint16_t u16DurlSize = strlen((char*)pcDownloadUrl) + 1; + + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_START_UPDATE, pcDownloadUrl, u16DurlSize, NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_ota_rollback(void) +@brief Request OTA Rollback image. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_rollback(void) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ROLLBACK, NULL, 0, NULL, 0, 0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + +/*! +@fn int8_t m2m_ota_abort(void) +@brief Request OTA Abort. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_abort(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_ABORT, NULL, 0, NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_ota_switch_firmware(void) +@brief Switch to the upgraded Firmware. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_switch_firmware(void) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mRev strRev; + + ret = m2m_ota_get_firmware_version(&strRev); + if(ret == M2M_SUCCESS) + { + if(M2M_GET_HIF_BLOCK(strRev.u16FirmwareHifInfo) == M2M_HIF_BLOCK_VALUE) + { + ret = hif_send(M2M_REQ_GROUP_OTA, M2M_OTA_REQ_SWITCH_FIRMWARE, NULL, 0, NULL, 0, 0); + } + else + { + ret = M2M_ERR_FAIL; + } + } + return ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_periph.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_periph.c new file mode 100644 index 0000000..c524ebd --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_periph.c @@ -0,0 +1,144 @@ +/******************************************************************************* + WINC3400 Peripherials Application Interface. + + File Name: + m2m_periph.c + + Summary: + WINC3400 Peripherals Application Interface + + Description: + WINC3400 Peripherals Application Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_periph.h" +#include "nmasic.h" +#include "m2m_hif.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +#define GPIO_OP_DIR 0 +#define GPIO_OP_SET 1 +#define GPIO_OP_GET 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +STATIC FUNCTIONS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static int8_t get_gpio_idx(uint8_t u8GpioNum) +{ + if(u8GpioNum >= M2M_PERIPH_GPIO_MAX) return -1; + else if(u8GpioNum == M2M_PERIPH_GPIO3) + { + return 3; + } + else if(u8GpioNum == M2M_PERIPH_GPIO4) + { + return 4; + } + if(u8GpioNum == M2M_PERIPH_GPIO15) + { + return 15; + } + else if(u8GpioNum == M2M_PERIPH_GPIO16) + { + return 16; + } + else if(u8GpioNum == M2M_PERIPH_GPIO18) + { + return 18; + } + else + { + return -2; + } +} +/* + * GPIO read/write skeleton with wakeup/sleep capability. + */ +static int8_t gpio_ioctl(uint8_t op, uint8_t u8GpioNum, uint8_t u8InVal, uint8_t *pu8OutVal) +{ + int8_t ret, gpio; + + ret = hif_chip_wake(); + if(ret != M2M_SUCCESS) goto _EXIT; + + gpio = get_gpio_idx(u8GpioNum); + if(gpio < 0) goto _EXIT1; + + if(op == GPIO_OP_DIR) { + ret = set_gpio_dir((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_SET) { + ret = set_gpio_val((uint8_t)gpio, u8InVal); + } else if(op == GPIO_OP_GET) { + ret = get_gpio_val((uint8_t)gpio, pu8OutVal); + } + if(ret != M2M_SUCCESS) goto _EXIT1; + +_EXIT1: + ret = hif_chip_sleep(); +_EXIT: + return ret; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION IMPLEMENTATION +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +int8_t m2m_periph_init(tstrPerphInitParam *param) +{ + return M2M_SUCCESS; +} + +int8_t m2m_periph_gpio_set_dir(uint8_t u8GpioNum, uint8_t u8GpioDir) +{ + return gpio_ioctl(GPIO_OP_DIR, u8GpioNum, u8GpioDir, NULL); +} + +int8_t m2m_periph_gpio_set_val(uint8_t u8GpioNum, uint8_t u8GpioVal) +{ + return gpio_ioctl(GPIO_OP_SET, u8GpioNum, u8GpioVal, NULL); +} + +int8_t m2m_periph_gpio_get_val(uint8_t u8GpioNum, uint8_t *pu8GpioVal) +{ + return gpio_ioctl(GPIO_OP_GET, u8GpioNum, 0, pu8GpioVal); +} + +int8_t m2m_periph_pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + return pullup_ctrl(pinmask, enable); +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ssl.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ssl.c new file mode 100644 index 0000000..f4a5f44 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_ssl.c @@ -0,0 +1,495 @@ +/******************************************************************************* + File Name: + m2m_ssl.c + + Summary: + WINC SSL Interface. + + Description: + WINC SSL Interface. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_ssl.h" +#include "m2m_hif.h" +#include "nmasic.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +static tpfAppSSLCb gpfAppSSLCb = NULL; +static uint32_t gu32HIFAddr = 0; +static tenuTlsFlashStatus genuStatus = TLS_FLASH_ERR_UNKNOWN; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/*! +@fn void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +@brief Internal SSL callback function. +@param [in] u8OpCode + HIF Opcode type. +@param [in] u16DataSize + HIF data length. +@param [in] u32Addr + HIF address. +*/ +static void m2m_ssl_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + int8_t s8tmp = M2M_SUCCESS; + switch(u8OpCode) + { + case M2M_SSL_REQ_ECC: + { + tstrEccReqInfo strEccREQ; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strEccREQ, sizeof(tstrEccReqInfo), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + { + gu32HIFAddr = u32Addr + sizeof(tstrEccReqInfo); + gpfAppSSLCb(M2M_SSL_REQ_ECC, &strEccREQ); + } + } + } + break; + case M2M_SSL_RESP_SET_CS_LIST: + { + tstrSslSetActiveCsList strCsList; + s8tmp = hif_receive(u32Addr, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), 0); + if(s8tmp == M2M_SUCCESS) + { + if(gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_SET_CS_LIST, &strCsList); + } + } + break; + case M2M_SSL_RESP_WRITE_OWN_CERTS: + { + tstrTlsSrvChunkHdr strTlsSrvChunkRsp; + uint8_t bCallApp = 1; + + s8tmp = hif_receive(u32Addr, (uint8_t *)&strTlsSrvChunkRsp, sizeof(tstrTlsSrvChunkHdr), 0); + if(s8tmp == M2M_SUCCESS) + { + uint16_t offset = strTlsSrvChunkRsp.u16Offset32; + uint16_t chunk_size = strTlsSrvChunkRsp.u16Size32; + uint16_t total_size = strTlsSrvChunkRsp.u16TotalSize32; + tenuTlsFlashStatus status = (tenuTlsFlashStatus)(strTlsSrvChunkRsp.u16Sig); + + /* If first chunk, reset status. */ + if(offset == 0) + genuStatus = TLS_FLASH_OK_NO_CHANGE; + /* Only send status to app when processing last chunk. */ + if(offset + chunk_size != total_size) + bCallApp = 0; + + switch(status) + { + case TLS_FLASH_OK: + // Good flash write. Update status if no errors yet. + if(genuStatus == TLS_FLASH_OK_NO_CHANGE) + genuStatus = status; + break; + case TLS_FLASH_OK_NO_CHANGE: + // No change, don't update status. + break; + case TLS_FLASH_ERR_CORRUPT: + // Corrupt. Always update status. + genuStatus = status; + break; + case TLS_FLASH_ERR_NO_CHANGE: + // Failed flash write. Update status if no more serious error. + if((genuStatus != TLS_FLASH_ERR_CORRUPT) && (genuStatus != TLS_FLASH_ERR_UNKNOWN)) + genuStatus = status; + break; + default: + // Don't expect any other case. Ensure we don't mask a previous corrupt error. + if(genuStatus != TLS_FLASH_ERR_CORRUPT) + genuStatus = TLS_FLASH_ERR_UNKNOWN; + break; + } + } + if(bCallApp && gpfAppSSLCb) + gpfAppSSLCb(M2M_SSL_RESP_WRITE_OWN_CERTS, &genuStatus); + } + break; + } + if(s8tmp != M2M_SUCCESS) + { + M2M_ERR("Error receiving SSL from the HIF\n"); + } +} + +/*! +@fn int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +@brief Initializes the SSL layer. +@param [in] pfAppSslCb + Application SSL callback function. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_init(tpfAppSSLCb pfAppSSLCb) +{ + int8_t s8Ret = M2M_SUCCESS; + gpfAppSSLCb = pfAppSSLCb; + gu32HIFAddr = 0; + genuStatus = TLS_FLASH_ERR_UNKNOWN; + s8Ret = hif_register_cb(M2M_REQ_GROUP_SSL, m2m_ssl_cb); + if(s8Ret != M2M_SUCCESS) + { + M2M_ERR("hif_register_cb() failed with ret=%d", s8Ret); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo* strECCResp, uint8_t* pu8RspDataBuff, uint16_t u16RspDataSz) +@brief Sends ECC responses to the WINC. +@param[in] strECCResp + ECC Response struct. +@param[in] pu8RspDataBuff + Pointer of the response data to be sent. +@param[in] u16RspDataSz + Response data size. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_handshake_rsp(tstrEccReqInfo *strECCResp, uint8_t *pu8RspDataBuff, uint16_t u16RspDataSz) +{ + int8_t s8Ret = M2M_SUCCESS; + + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_RESP_ECC | M2M_REQ_DATA_PKT), (uint8_t *)strECCResp, sizeof(tstrEccReqInfo), pu8RspDataBuff, u16RspDataSz, sizeof(tstrEccReqInfo)); + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +@brief Sends certificates to the WINC +@param[in] pu8Buffer + Pointer to the certificates. +@param[in] u32BufferSz + Size of the certificates. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ssl_send_certs_to_winc(uint8_t *pu8Buffer, uint32_t u32BufferSz) +{ + int8_t s8Ret = M2M_SUCCESS; +#define TXLIMIT (256 * 6) + + if(u32BufferSz <= TXLIMIT) + { + // set chunk header for one chunk + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)pu8Buffer; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = (u32BufferSz + 3) >> 2; + pchkhdr->u16Offset32 = 0; + pchkhdr->u16Size32 = (u32BufferSz + 3) >> 2; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, pu8Buffer, u32BufferSz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data NON-CHUNKED\r\n", u32BufferSz); + } + else + { + // chunk it + // We are sneaking in a header - tstrTlsSrvChunkHdr +#define CHUNKHDRSZ (sizeof(tstrTlsSrvChunkHdr)) +#define CHUNKSZ (TXLIMIT - 256) // divisible by 4 + uint8_t saveblob[CHUNKHDRSZ]; + uint32_t ofs = 0; + uint32_t thischunksz = 0; + + // first is special - over writing our header + memcpy(saveblob, &pu8Buffer[ofs], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); // no need to round up to quad words this time + + tstrTlsSrvChunkHdr *pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs], thischunksz, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\r\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + + while(ofs < u32BufferSz) + { + // Subsequent chunks write header before and send a little more + memcpy(saveblob, &pu8Buffer[ofs-CHUNKHDRSZ], CHUNKHDRSZ); + thischunksz = min(CHUNKSZ, u32BufferSz-ofs); + thischunksz = (thischunksz + 3) & 0xFFFFFFFC; // needs to round up to quad word length + pchkhdr = (tstrTlsSrvChunkHdr *)&pu8Buffer[ofs - CHUNKHDRSZ]; + pchkhdr->u16Sig = TLS_CERTS_CHUNKED_SIG_VALUE; + pchkhdr->u16TotalSize32 = ((u32BufferSz + 3) >> 2); + pchkhdr->u16Offset32 = ((ofs + 3) >> 2); + pchkhdr->u16Size32 = ((thischunksz + 3) >> 2); + s8Ret = hif_send(M2M_REQ_GROUP_SSL, (M2M_SSL_REQ_WRITE_OWN_CERTS | M2M_REQ_DATA_PKT), NULL, 0, &pu8Buffer[ofs - CHUNKHDRSZ], thischunksz + CHUNKHDRSZ, 0); + M2M_INFO("Transferred %" PRIu32 " bytes of cert data CHUNKED to offset %" PRIu32 " total %" PRIu32 "\n", thischunksz, ofs, u32BufferSz); + memcpy(&pu8Buffer[ofs - CHUNKHDRSZ], saveblob, CHUNKHDRSZ); + ofs += thischunksz; + } + } + + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] penuCurve + The named curve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. +@param[inout] pu16ValueSz + in: Size of value buffer provided by caller. + out: Size of value retrieved (provided for convenience; the value size is in fact determined by the curve). +@param[out] pu8Sig + Signature retrieved for verification. +@param[inout] pu16SigSz + in: Size of signature buffer provided by caller. + out: Size of signature retrieved (provided for convenience; the signature size is in fact determined by the curve). +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. +*/ +int8_t m2m_ssl_retrieve_next_for_verifying(tenuEcNamedCurve *penuCurve, uint8_t *pu8Value, uint16_t *pu16ValueSz, uint8_t *pu8Sig, uint16_t *pu16SigSz, tstrECPoint *pstrKey) +{ + int8_t s8Ret = M2M_ERR_FAIL; + uint16_t u16HashSz, u16SigSz, u16KeySz; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if((NULL == penuCurve) || (NULL == pu8Value) || (NULL == pu16ValueSz) || (NULL == pu8Sig) || (NULL == pu16SigSz) || (NULL == pstrKey)) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + *penuCurve = _htons(u16KeySz); + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16KeySz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16KeySz = _htons(u16KeySz); + if(u16KeySz > sizeof(pstrKey->X)) goto __ERR; + pstrKey->u16Size = u16KeySz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16HashSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16HashSz = _htons(u16HashSz); + if(u16HashSz > *pu16ValueSz) goto __ERR; + *pu16ValueSz = u16HashSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, (uint8_t *)&u16SigSz, 2, 0) != M2M_SUCCESS) goto __ERR; + u16SigSz = _htons(u16SigSz); + if(u16SigSz > *pu16SigSz) goto __ERR; + *pu16SigSz = u16SigSz; + gu32HIFAddr += 2; + + if(hif_receive(gu32HIFAddr, pstrKey->X, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + if(hif_receive(gu32HIFAddr, pstrKey->Y, u16KeySz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16KeySz; + + if(hif_receive(gu32HIFAddr, pu8Value, u16HashSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16HashSz; + + if(hif_receive(gu32HIFAddr, pu8Sig, u16SigSz, 0) != M2M_SUCCESS) goto __ERR; + gu32HIFAddr += u16SigSz; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey); +@brief Retrieve the next set of information from the WINC for ECDSA verification. +@param[out] pu16Curve + The named curve, to be cast to type @ref tenuEcNamedCurve. +@param[out] pu8Value + Value retrieved for verification. This is the digest of the message, truncated/prepended to the appropriate size. + The size of the value is equal to the field size of the curve, hence is determined by pu16Curve. +@param[out] pu8Sig + Signature retrieved for verification. + The size of the signature is equal to twice the field size of the curve, hence is determined by pu16Curve. +@param[out] pstrKey + Public key retrieved for verification. +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + verification information is ready via @ref ECC_REQ_SIGN_VERIFY. + +@warning If this function returns @ref M2M_ERR_FAIL, then any remaining verification info from + the WINC is lost. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_retrieve_next_for_verifying is used instead. +*/ +int8_t m2m_ssl_retrieve_cert(uint16_t *pu16Curve, uint8_t *pu8Value, uint8_t *pu8Sig, tstrECPoint *pstrKey) +{ + uint16_t u16ValueSz = 32, u16SigSz = 64; + + return m2m_ssl_retrieve_next_for_verifying((tenuEcNamedCurve *)pu16Curve, pu8Value, &u16ValueSz, pu8Sig, &u16SigSz, pstrKey); +} + +/*! +@fn int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +@brief Retrieve the value from the WINC for ECDSA signing. +@param[out] pu8Value + Value retrieved for signing. This is the digest of the message, truncated/prepended to the appropriate size. +@param[in] u16ValueSz + Size of value to be retrieved. (The application should obtain this information, + along with the curve, from the associated @ref ECC_REQ_SIGN_GEN notification.) +@return The function returns @ref M2M_SUCCESS for success and a negative value otherwise. + +@pre This function should only be called after the application has been notified that + signing information is ready via @ref ECC_REQ_SIGN_GEN. + +@warning If this function returns @ref M2M_ERR_FAIL, then the value for signing is lost. +*/ +int8_t m2m_ssl_retrieve_hash(uint8_t *pu8Value, uint16_t u16ValueSz) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if(gu32HIFAddr == 0) return M2M_ERR_FAIL; + + if(NULL == pu8Value) + { + s8Ret = M2M_ERR_INVALID_ARG; + goto __ERR; + } + + if(hif_receive(gu32HIFAddr, pu8Value, u16ValueSz, 0) != M2M_SUCCESS) goto __ERR; + + return M2M_SUCCESS; + +__ERR: + hif_receive(0, NULL, 0, 1); + return s8Ret; +} + +/*! +@fn void m2m_ssl_stop_retrieving(void); +@brief Allow SSL driver to tidy up when the application chooses not to retrieve all available + information. + +@return None. + +@warning The application must call this function if it has been notified (via + @ref ECC_REQ_SIGN_GEN or @ref ECC_REQ_SIGN_VERIFY) that information is available for + retrieving from the WINC, but chooses not to retrieve it all. + The application must not call this function if it has retrieved all the available + information, or if a retrieve function returned @ref M2M_ERR_FAIL indicating that any + remaining information has been lost. + +@see m2m_ssl_retrieve_next_for_verifying\n + m2m_ssl_retrieve_cert\n + m2m_ssl_retrieve_hash +*/ +void m2m_ssl_stop_retrieving(void) +{ + hif_receive(0, NULL, 0, 1); +} + +/*! +@fn void m2m_ssl_stop_processing_certs(void); +@brief Allow SSL driver to tidy up in case application does not read all available certificates. +@return None. + +@warning This API has been deprecated and is kept for legacy purposes only. It is recommended + that @ref m2m_ssl_stop_retrieving is used instead. +*/ +void m2m_ssl_stop_processing_certs(void) +{ + m2m_ssl_stop_retrieving(); +} + +/*! +@fn void m2m_ssl_ecc_process_done(void); +@brief Allow SSL driver to tidy up after application has finished processing ECC message. + +@return None. + +@warning The application should call this function after receiving an SSL callback with message + type @ref M2M_SSL_REQ_ECC, after retrieving any related information, and before + calling @ref m2m_ssl_handshake_rsp. +*/ +void m2m_ssl_ecc_process_done(void) +{ + gu32HIFAddr = 0; +} + +/*! +@fn int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +@brief Sets the active ciphersuites. +@details Override the default Active SSL ciphers in the SSL module with a certain combination selected by the caller in the form of + a bitmap containing the required ciphers to be on. + There is no need to call this function if the application will not change the default ciphersuites. + +@param [in] u32SslCsBMP + Bitmap containing the desired ciphers to be enabled for the SSL module. The ciphersuites are defined in + @ref SSLCipherSuiteID. + The default ciphersuites are all ciphersuites supported by the firmware with the exception of ECC ciphersuites. + The caller can override the default with any desired combination. + If u32SslCsBMP does not contain any ciphersuites supported by firmware, then the current active list will not + change. + +@return + - @ref SOCK_ERR_NO_ERROR + - @ref SOCK_ERR_INVALID_ARG +*/ +int8_t m2m_ssl_set_active_ciphersuites(uint32_t u32SslCsBMP) +{ + int8_t s8Ret = M2M_SUCCESS; + tstrSslSetActiveCsList strCsList; + + strCsList.u32CsBMP = u32SslCsBMP; + s8Ret = hif_send(M2M_REQ_GROUP_SSL, M2M_SSL_REQ_SET_CS_LIST, (uint8_t *)&strCsList, sizeof(tstrSslSetActiveCsList), NULL, 0, 0); + + return s8Ret; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_wifi.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_wifi.c new file mode 100644 index 0000000..45d2b13 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/m2m_wifi.c @@ -0,0 +1,2061 @@ +/******************************************************************************* + File Name: + m2m_wifi.c + + Summary: + This module contains M2M Wi-Fi APIs implementation. + + Description: + This module contains M2M Wi-Fi APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "m2m_wifi.h" +#include "m2m_hif.h" +#include "nmasic.h" + +#define WIFI_1X_TLS_HS_FLAGS_PEER_AUTH NBIT1 +#define WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK NBIT2 +#define WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME NBIT3 +#define WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING NBIT4 +#define WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT NBIT6 + +#define WIFI_1X_TLS_HS_FLAGS_DEFAULT ( \ + WIFI_1X_TLS_HS_FLAGS_PEER_AUTH \ + | WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK \ + | WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING \ +) + +static volatile uint8_t gu8ChNum; +static tpfAppWifiCb gpfAppWifiCb = NULL; + +static uint32_t gu321xTlsHsFlags = WIFI_1X_TLS_HS_FLAGS_DEFAULT; +static uint8_t gau81xRootSha1[20] = {0}; + +static tpfAppEthCb gpfAppEthCb = NULL; +static uint8_t *gau8ethRcvBuf = NULL; +static uint16_t gu16ethRcvBufSize; + +/** +* @fn m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr, uint8_t grp) +* @brief WiFi call back function +* @param [in] u8OpCode +* HIF Opcode type. +* @param [in] u16DataSize +* HIF data length. +* @param [in] u32Addr +* HIF address. +* @param [in] grp +* HIF group type. +*/ +static void m2m_wifi_cb(uint8_t u8OpCode, uint16_t u16DataSize, uint32_t u32Addr) +{ + uint8_t rx_buf[8]; + if (u8OpCode == M2M_WIFI_RESP_CON_STATE_CHANGED) + { + tstrM2mWifiStateChanged strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mWifiStateChanged), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CON_STATE_CHANGED, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_SYS_TIME) + { + tstrSystemTime strSysTime; + if (hif_receive(u32Addr, (uint8_t*)&strSysTime, sizeof(tstrSystemTime), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_GET_SYS_TIME, &strSysTime); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CONN_INFO) + { + tstrM2MConnInfo strConnInfo; + if (hif_receive(u32Addr, (uint8_t*)&strConnInfo, sizeof(tstrM2MConnInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CONN_INFO, &strConnInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_MEMORY_RECOVER) + { + } + else if (u8OpCode == M2M_WIFI_REQ_DHCP_CONF) + { + tstrM2MIPConfig strIpConfig; + if (hif_receive(u32Addr, (uint8_t*)&strIpConfig, sizeof(tstrM2MIPConfig), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_DHCP_CONF, (uint8_t*)&strIpConfig); + } + } + else if (u8OpCode == M2M_WIFI_REQ_WPS) + { + tstrM2MWPSInfo strWps; + memset((uint8_t*)&strWps, 0, sizeof(tstrM2MWPSInfo)); + if (hif_receive(u32Addr, (uint8_t*)&strWps, sizeof(tstrM2MWPSInfo), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQ_WPS, &strWps); + } + } + else if (u8OpCode == M2M_WIFI_RESP_IP_CONFLICT) + { + uint32_t u32ConflictedIP; + if (hif_receive(u32Addr, (uint8_t*)&u32ConflictedIP, sizeof(u32ConflictedIP), 0) == M2M_SUCCESS) + { + M2M_INFO("Conflicted IP \" %u.%u.%u.%u \"\r\n", + BYTE_0(u32ConflictedIP), BYTE_1(u32ConflictedIP), BYTE_2(u32ConflictedIP), BYTE_3(u32ConflictedIP)); + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_IP_CONFLICT, NULL); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_DONE) + { + tstrM2mScanDone strState; + if (hif_receive(u32Addr, (uint8_t*)&strState, sizeof(tstrM2mScanDone), 0) == M2M_SUCCESS) + { + gu8ChNum = strState.u8NumofCh; + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_DONE, &strState); + } + } + else if (u8OpCode == M2M_WIFI_RESP_SCAN_RESULT) + { + tstrM2mWifiscanResult strScanResult; + if (hif_receive(u32Addr, (uint8_t*)&strScanResult, sizeof(tstrM2mWifiscanResult), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SCAN_RESULT, &strScanResult); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CURRENT_RSSI) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CURRENT_RSSI, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_CLIENT_INFO) + { + if (hif_receive(u32Addr, rx_buf, 4, 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_CLIENT_INFO, rx_buf); + } + } + else if (u8OpCode == M2M_WIFI_RESP_PROVISION_INFO) + { + tstrM2MProvisionInfo strProvInfo; + if (hif_receive(u32Addr, (uint8_t*)&strProvInfo, sizeof(tstrM2MProvisionInfo), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_PROVISION_INFO, &strProvInfo); + } + } + else if (u8OpCode == M2M_WIFI_RESP_DEFAULT_CONNECT) + { + tstrM2MDefaultConnResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MDefaultConnResp), 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_DEFAULT_CONNECT, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_REQRSP_DELETE_APID) + { + tstrM2MGenericResp strResp; + if (hif_receive(u32Addr, (uint8_t*)&strResp, sizeof(tstrM2MGenericResp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_REQRSP_DELETE_APID, &strResp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_BLE_API_RECV) + { + //Read the length + if (hif_receive(u32Addr, rx_buf, 2, 0) == M2M_SUCCESS) + { + uint16_t u16BleMsgLen = (rx_buf[1] << 8) + rx_buf[0]; + tstrM2mBleApiMsg bleRx;// = (tstrM2mBleApiMsg*)OSAL_Malloc(u16BleMsgLen + sizeof(tstrM2mBleApiMsg)); + + // if (bleRx == NULL) + // M2M_ERR("No Mem for BLE msg\r\n"); + // else + { + bleRx.u16Len = u16BleMsgLen; + + //Read the rest of the message + if (hif_receive(u32Addr+2, bleRx.data, bleRx.u16Len, 1)== M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_BLE_API_RECV, &bleRx); + } + // OSAL_Free(bleRx); + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_GET_PRNG) + { + tstrPrng strPrng; + if (hif_receive(u32Addr, (uint8_t*)&strPrng, sizeof(tstrPrng), 0) == M2M_SUCCESS) + { + if (hif_receive(u32Addr + sizeof(tstrPrng), strPrng.pu8RngBuff, strPrng.u16PrngSize, 1) == M2M_SUCCESS) + { + if (gpfAppWifiCb) { + gpfAppWifiCb(M2M_WIFI_RESP_GET_PRNG, &strPrng); + } + } + } + } + else if (u8OpCode == M2M_WIFI_RESP_SET_GAIN_TABLE) + { + tstrM2MGainTableRsp strGainRsp; + if (hif_receive(u32Addr, (uint8_t*)&strGainRsp, sizeof(tstrM2MGainTableRsp), 0) == M2M_SUCCESS) + { + if (gpfAppWifiCb) + gpfAppWifiCb(M2M_WIFI_RESP_SET_GAIN_TABLE, &strGainRsp); + } + } + else if (u8OpCode == M2M_WIFI_RESP_ETHERNET_RX_PACKET) + { + tstrM2mIpRsvdPkt strM2mRsvd; + if (hif_receive(u32Addr, (uint8_t*)&strM2mRsvd, sizeof(tstrM2mIpRsvdPkt), 0) == M2M_SUCCESS) + { + tstrM2mIpCtrlBuf strM2mIpCtrlBuf; + uint16_t u16Offset = strM2mRsvd.u16PktOffset; + + strM2mIpCtrlBuf.u16RemainingDataSize = strM2mRsvd.u16PktSz; + if ((gpfAppEthCb) &&(gau8ethRcvBuf)&& (gu16ethRcvBufSize > 0)) + { + while (strM2mIpCtrlBuf.u16RemainingDataSize > 0) + { + if (strM2mIpCtrlBuf.u16RemainingDataSize > gu16ethRcvBufSize) + { + strM2mIpCtrlBuf.u16DataSize = gu16ethRcvBufSize ; + } + else + { + strM2mIpCtrlBuf.u16DataSize = strM2mIpCtrlBuf.u16RemainingDataSize; + } + + if (hif_receive(u32Addr+u16Offset, gau8ethRcvBuf, strM2mIpCtrlBuf.u16DataSize, 0) == M2M_SUCCESS) + { + strM2mIpCtrlBuf.u16RemainingDataSize -= strM2mIpCtrlBuf.u16DataSize; + u16Offset += strM2mIpCtrlBuf.u16DataSize; + gpfAppEthCb(M2M_WIFI_RESP_ETHERNET_RX_PACKET, gau8ethRcvBuf, &(strM2mIpCtrlBuf)); + } + else + { + break; + } + } + } + } + } + else + { + M2M_ERR("REQ Not defined %d\r\n", u8OpCode); + } +} + +int8_t m2m_wifi_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + /* Apply device specific initialization. */ + ret = nm_drv_init_download_mode(); + if (ret != M2M_SUCCESS) goto _EXIT0; + + enable_interrupts(); + +_EXIT0: + return ret; +} + +static int8_t m2m_validate_ap_parameters(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (pstrM2MAPModeConfig == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for SSID */ + if ((strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8SSID) >= M2M_MAX_SSID_LEN)) + { + M2M_ERR("INVALID SSID\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for Channel */ + if (pstrM2MAPModeConfig->strApConfig.u8ListenChannel > M2M_WIFI_CH_14 || pstrM2MAPModeConfig->strApConfig.u8ListenChannel < M2M_WIFI_CH_1) + { + M2M_ERR("INVALID CH\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for DHCP Server IP address */ + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[0] || pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[1])) + { + if (!(pstrM2MAPModeConfig->strApConfig.au8DHCPServerIP[2])) + { + M2M_ERR("INVALID DHCP SERVER IP\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + /* Check for Security */ + if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_OPEN) + { + goto ERR1; + } + else if (pstrM2MAPModeConfig->strApConfig.u8SecType == M2M_WIFI_SEC_WEP) + { + /* Check for WEP Key index */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeyIndx == 0) || (pstrM2MAPModeConfig->strApConfig.u8KeyIndx > WEP_KEY_MAX_INDEX)) + { + M2M_ERR("INVALID KEY INDEX\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key size */ + if ((pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_40_KEY_STRING_SIZE) && + (pstrM2MAPModeConfig->strApConfig.u8KeySz != WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID KEY SIZE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + /* Check for WEP Key */ + if ((pstrM2MAPModeConfig->strApConfig.au8WepKey == NULL) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) <= 0) || (strlen((const char*)pstrM2MAPModeConfig->strApConfig.au8WepKey) > WEP_104_KEY_STRING_SIZE)) + { + M2M_ERR("INVALID WEP KEY\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + } + else + { + M2M_ERR("INVALID AUTHENTICATION MODE\r\n"); + s8Ret = M2M_ERR_FAIL; + goto ERR1; + } + +ERR1: + return s8Ret; +} + +static int8_t m2m_validate_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_SUCCESS; + /* Check for incoming pointer */ + if (ptstrM2MScanOption == NULL) + { + M2M_ERR("INVALID POINTER\r\n"); + s8Ret = M2M_ERR_FAIL; + } + else + { + /* Check for valid No of slots */ + if (ptstrM2MScanOption->u8NumOfSlot == 0) + { + M2M_ERR("INVALID No of scan slots!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid time of slots */ + if ((ptstrM2MScanOption->u8SlotTime < 10) || (ptstrM2MScanOption->u8SlotTime > 250)) + { + M2M_ERR("INVALID scan slot time!\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid No of probe requests per slot */ + if ((ptstrM2MScanOption->u8ProbesPerSlot == 0) || (ptstrM2MScanOption->u8ProbesPerSlot > M2M_SCAN_DEFAULT_NUM_PROBE)) + { + M2M_ERR("INVALID No of probe requests per scan slot\r\n"); + s8Ret = M2M_ERR_FAIL; + } + /* Check for valid RSSI threshold */ + if (ptstrM2MScanOption->s8RssiThresh >= 0) + { + M2M_ERR("INVALID RSSI threshold %d\r\n", ptstrM2MScanOption->s8RssiThresh); + s8Ret = M2M_ERR_FAIL; + } + } + return s8Ret; +} + +int8_t m2m_wifi_ble_set_gain_table(uint8_t table_idx) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MGainTable strGainTable = {0}; + + strGainTable.u8GainTable = table_idx; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_GAIN_TABLE, (uint8_t*)&strGainTable, sizeof(tstrM2MGainTable), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_init_hold(void) +{ + int8_t ret = M2M_ERR_FAIL; + + /* Apply device specific initialization. */ + ret = nm_drv_init_hold(); + + return ret; +} + +int8_t m2m_wifi_init_start(tstrWifiInitParam *pWifiInitParam) +{ + tstrM2mRev strtmp; + int8_t ret = M2M_SUCCESS; + uint8_t u8WifiMode = M2M_WIFI_MODE_NORMAL; + + if (pWifiInitParam == NULL) { + ret = M2M_ERR_FAIL; + goto _EXIT0; + } + + gpfAppWifiCb = pWifiInitParam->pfAppWifiCb; + + gpfAppEthCb = pWifiInitParam->strEthInitParam.pfAppEthCb; + gau8ethRcvBuf = pWifiInitParam->strEthInitParam.au8ethRcvBuf; + gu16ethRcvBufSize = pWifiInitParam->strEthInitParam.u16ethRcvBufSize; + u8WifiMode = pWifiInitParam->strEthInitParam.u8EthernetEnable; + + if (pWifiInitParam->strEthInitParam.u8EthernetEnable) + u8WifiMode = M2M_WIFI_MODE_ETHERNET; + + + /* Initialize host interface module */ + /* Do this before bringing up the WINC as it can send HIF messages very quickly from bootup and we need to be ready */ + ret = hif_init(NULL); + if (ret != M2M_SUCCESS) goto _EXIT1; + + hif_register_cb(M2M_REQ_GROUP_WIFI, m2m_wifi_cb); + + /* Apply device specific initialization. */ + ret = nm_drv_init_start(&u8WifiMode); + if (ret != M2M_SUCCESS) goto _EXIT0; + + M2M_INFO("Curr driver ver: %u.%u.%u\r\n", M2M_DRIVER_VERSION_MAJOR_NO, M2M_DRIVER_VERSION_MINOR_NO, M2M_DRIVER_VERSION_PATCH_NO); + M2M_INFO("Curr driver HIF Level: (%u) %u.%u\r\n", M2M_HIF_BLOCK_VALUE, M2M_HIF_MAJOR_VALUE, M2M_HIF_MINOR_VALUE); + ret = m2m_wifi_get_firmware_version(&strtmp); + m2m_ota_get_firmware_version(&strtmp); + + if (ret == M2M_SUCCESS) + { + ret = hif_enable_access(); + if (ret == M2M_SUCCESS) + { + m2m_wifi_ble_set_gain_table(pWifiInitParam->GainTableIndex); + } + } + goto _EXIT0; + +_EXIT1: + nm_drv_deinit(NULL); + +_EXIT0: + return ret; +} + +int8_t m2m_wifi_init(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_SUCCESS; + + ret = m2m_wifi_init_hold(); + if (ret == M2M_SUCCESS) + { + ret = m2m_wifi_init_start(pWifiInitParam); + } + return ret; +} + +int8_t m2m_wifi_deinit(void *arg) +{ + hif_deinit(NULL); + nm_drv_deinit(NULL); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_reinit_hold(void) +{ + m2m_wifi_deinit(NULL); + return m2m_wifi_init_hold(); +} + +int8_t m2m_wifi_reinit_start(tstrWifiInitParam *pWifiInitParam) +{ + return m2m_wifi_init_start(pWifiInitParam); +} + +int8_t m2m_wifi_reinit(tstrWifiInitParam *pWifiInitParam) +{ + int8_t ret = M2M_ERR_FAIL; + ret = m2m_wifi_reinit_hold(); + if (ret == M2M_SUCCESS) { + ret = m2m_wifi_reinit_start(pWifiInitParam); + } + return ret; +} + +uint8_t m2m_wifi_get_state(void) +{ + switch(nm_get_state()) + { + case NM_STATE_DEINIT: + return WIFI_STATE_DEINIT; + case NM_STATE_INIT: + return WIFI_STATE_INIT; + case NM_STATE_START: + return WIFI_STATE_START; + } + return WIFI_STATE_DEINIT; +} + +int8_t m2m_wifi_handle_events(void) +{ + if(WIFI_STATE_START == m2m_wifi_get_state()) + return hif_handle_isr(); + + return M2M_SUCCESS; +} + +int8_t m2m_wifi_delete_sc(char *pcSsid, uint8_t u8SsidLen) +{ + tstrM2mWifiApId strApId; + memset((uint8_t*)&strApId, 0, sizeof(strApId)); + strApId.au8SSID[0] = 0xFF; // Special value used to cause fw to delete all entries. + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQRSP_DELETE_APID, (uint8_t*)&strApId, sizeof(tstrM2mWifiApId), NULL, 0, 0); +} + +int8_t m2m_wifi_default_connect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DEFAULT_CONNECT, NULL, 0, NULL, 0, 0); +} + +/*************************************************************************************************/ +/* WIFI CONNECT INTERNAL FUNCTIONS */ +/*************************************************************************************************/ +static int8_t m2m_wifi_connect_prepare_msg( + tenuCredStoreOption enuCredStoreOption, + tenuM2mSecType enuAuthType, + uint16_t u16AuthSize, + tstrNetworkId *pstrNetworkId, + tstrM2mWifiConnHdr *pstrWifiConn +) +{ + int8_t ret = M2M_ERR_FAIL; + uint16_t u16CredSize = sizeof(tstrM2mConnCredCmn) + u16AuthSize; + /* Check application params. */ + if ( + (pstrNetworkId == NULL) + || (pstrNetworkId->pu8Ssid == NULL) + || (pstrNetworkId->u8SsidLen >= M2M_MAX_SSID_LEN) + ) + goto INVALID_ARG; + + if (pstrWifiConn != NULL) + { + tstrM2mConnCredHdr *pstrHdr = &pstrWifiConn->strConnCredHdr; + tstrM2mConnCredCmn *pstrCmn = &pstrWifiConn->strConnCredCmn; + + memset((uint8_t*)pstrWifiConn, 0, sizeof(tstrM2mWifiConnHdr)); + + pstrHdr->u16CredSize = u16CredSize; + switch(enuCredStoreOption) + { + case WIFI_CRED_SAVE_ENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_ENCRYPT_FLAG; + // intentional fall through... + case WIFI_CRED_SAVE_UNENCRYPTED: + pstrHdr->u8CredStoreFlags |= M2M_CRED_STORE_FLAG; + // intentional fall through... + case WIFI_CRED_DONTSAVE: + break; + default: + goto INVALID_ARG; + } + + if (pstrNetworkId->enuChannel == M2M_WIFI_CH_ALL) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel); + else if ((pstrNetworkId->enuChannel <= M2M_WIFI_CH_14) && (pstrNetworkId->enuChannel >= M2M_WIFI_CH_1)) + pstrHdr->u8Channel = (uint8_t)(pstrNetworkId->enuChannel) - 1; + else + goto INVALID_ARG; + + if ((enuAuthType == M2M_WIFI_SEC_INVALID) || (enuAuthType >= M2M_WIFI_NUM_AUTH_TYPES)) + goto INVALID_ARG; + pstrCmn->u8AuthType = (uint8_t)enuAuthType; + + pstrCmn->u8SsidLen = pstrNetworkId->u8SsidLen; + memcpy(pstrCmn->au8Ssid, pstrNetworkId->pu8Ssid, pstrNetworkId->u8SsidLen); + if (pstrNetworkId->pu8Bssid != NULL) + { + pstrCmn->u8Options = M2M_WIFI_CONN_BSSID_FLAG; + memcpy(pstrCmn->au8Bssid, pstrNetworkId->pu8Bssid, M2M_MAC_ADDRES_LEN); + } + /* Everything is ok, set return value. */ + ret = M2M_SUCCESS; + } + return ret; +INVALID_ARG: + return M2M_ERR_INVALID_ARG; +} + +static int8_t legacy_connect_prepare_msg(tstrM2mWifiConnHdr *pstrConnHdr, tstrM2mWifiConnectLegacy_1_2 *pstrConnect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ( + !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_ENCRYPT_FLAG) + && !(pstrConnHdr->strConnCredCmn.u8Options & M2M_WIFI_CONN_BSSID_FLAG) + ) + { + memset((uint8_t*)pstrConnect, 0, sizeof(tstrM2mWifiConnectLegacy_1_2)); + memcpy(pstrConnect->au8SSID, pstrConnHdr->strConnCredCmn.au8Ssid, pstrConnHdr->strConnCredCmn.u8SsidLen); + pstrConnect->au8SSID[pstrConnHdr->strConnCredCmn.u8SsidLen] = 0; + pstrConnect->u16Ch = pstrConnHdr->strConnCredHdr.u8Channel; + pstrConnect->u8NoSaveCred = !(pstrConnHdr->strConnCredHdr.u8CredStoreFlags & M2M_CRED_STORE_FLAG); + pstrConnect->strSec.u8SecType = pstrConnHdr->strConnCredCmn.u8AuthType; + s8Ret = M2M_SUCCESS; + } + return s8Ret; +} + +/*************************************************************************************************/ +/* WIFI CONNECT APIS */ +/*************************************************************************************************/ +int8_t m2m_wifi_connect_open( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, M2M_WIFI_SEC_OPEN, 0, pstrNetworkId, &strConnHdr); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN, + (uint8_t*)&strConnHdr, sizeof(strConnHdr), + NULL, 0, 0); + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_wep( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthWep *pstrAuthWep +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if ( + (pstrAuthWep != NULL) && (pstrAuthWep->pu8WepKey != NULL) + && (pstrAuthWep->u8KeyIndx > 0) && (pstrAuthWep->u8KeyIndx <= WEP_KEY_MAX_INDEX) + && ((pstrAuthWep->u8KeySz == WEP_104_KEY_STRING_SIZE) || (pstrAuthWep->u8KeySz == WEP_40_KEY_STRING_SIZE)) + ) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WEP, + sizeof(tstrM2mWifiWep), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWep pstrWep;// = (tstrM2mWifiWep *)OSAL_Malloc(sizeof(tstrM2mWifiWep)); + // if (pstrWep == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + pstrWep.u8KeyIndex = pstrAuthWep->u8KeyIndx - 1; + pstrWep.u8KeyLen = pstrAuthWep->u8KeySz/2; + hexstr_2_bytes(pstrWep.au8WepKey, (pstrAuthWep->pu8WepKey), pstrWep.u8KeyLen); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrWep, sizeof(tstrM2mWifiWep), sizeof(tstrM2mWifiConnHdr)); +// OSAL_Free(pstrWep); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + tstrM2mWifiWepParamsLegacy_1_2 *pstrWepLegacy = &strConnectLegacy.strSec.uniAuth.strWepInfo; + pstrWepLegacy->u8KeyIndx = pstrAuthWep->u8KeyIndx - 1; + pstrWepLegacy->u8KeySz = pstrAuthWep->u8KeySz; + memcpy(pstrWepLegacy->au8WepKey, pstrAuthWep->pu8WepKey, pstrAuthWep->u8KeySz); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_psk( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuthPsk *pstrAuthPsk +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + + if (pstrAuthPsk != NULL) + { + tstrM2mWifiConnHdr strConnHdr; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_WPA_PSK, + sizeof(tstrM2mWifiPsk), + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifiPsk pstrPsk;// = (tstrM2mWifiPsk *)OSAL_Malloc(sizeof(tstrM2mWifiPsk)); + // if (pstrPsk == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + memset((uint8_t*)&pstrPsk, 0, sizeof(tstrM2mWifiPsk)); + if (pstrAuthPsk->pu8Psk != NULL) + { + if (pstrAuthPsk->pu8Passphrase != NULL) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = M2M_MAX_PSK_LEN-1; + /* Use hexstr_2_bytes to verify pu8Psk input. */ + if (M2M_SUCCESS != hexstr_2_bytes(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen/2)) + ret = M2M_ERR_INVALID_ARG; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Psk, pstrPsk.u8PassphraseLen); + } + } + else if (pstrAuthPsk->pu8Passphrase != NULL) + { + if (pstrAuthPsk->u8PassphraseLen > M2M_MAX_PSK_LEN-1) + ret = M2M_ERR_INVALID_ARG; + else + { + pstrPsk.u8PassphraseLen = pstrAuthPsk->u8PassphraseLen; + memcpy(pstrPsk.au8Passphrase, pstrAuthPsk->pu8Passphrase, pstrPsk.u8PassphraseLen); + } + } + else + ret = M2M_ERR_INVALID_ARG; + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstrPsk, sizeof(tstrM2mWifiPsk), sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstrPsk); + } + if (ret != M2M_SUCCESS) + { + /* Might just be that we are talking to legacy firmware - try the legacy connect message instead. */ + tstrM2mWifiConnectLegacy_1_2 strConnectLegacy; + ret = legacy_connect_prepare_msg(&strConnHdr, &strConnectLegacy); + if (ret == M2M_SUCCESS) + { + uint8_t *pu8PskLegacy = strConnectLegacy.strSec.uniAuth.au8PSK; + memcpy(pu8PskLegacy, pstrAuthPsk->pu8Passphrase, pstrAuthPsk->u8PassphraseLen); + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONNECT, + (uint8_t*)&strConnectLegacy, sizeof(tstrM2mWifiConnectLegacy_1_2), + NULL, 0, 0); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_1x_set_option(tenu1xOption enuOptionName, const void *pOptionValue, size_t OptionLen) +{ + if((pOptionValue == NULL) && (OptionLen > 0)) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + case 0: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_AUTH; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_TIME_VERIF_MODE: + if(OptionLen != sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + switch(*(tenuTlsCertExpSettings*)pOptionValue) + { + case TLS_CERT_EXP_CHECK_DISABLE: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_ENABLE: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + case TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK; + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SESSION_CACHING: + if(OptionLen != sizeof(int)) + return M2M_ERR_INVALID_ARG; + switch(*(int*)pOptionValue) + { + case 1: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING; + break; + default: + return M2M_ERR_INVALID_ARG; + } + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + switch(OptionLen) + { + case 20: + gu321xTlsHsFlags |= WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memcpy(gau81xRootSha1, (uint8_t*)pOptionValue, sizeof(gau81xRootSha1)); + break; + case 0: + gu321xTlsHsFlags &= ~WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT; + memset(gau81xRootSha1, 0, sizeof(gau81xRootSha1)); + default: + return M2M_ERR_INVALID_ARG; + } + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_1x_get_option(tenu1xOption enuOptionName, void *pOptionValue, size_t *pOptionLen) +{ + if(pOptionValue == NULL) + return M2M_ERR_INVALID_ARG; + switch(enuOptionName) + { + case WIFI_1X_BYPASS_SERVER_AUTH: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_AUTH) ? 0 : 1; + break; + case WIFI_1X_TIME_VERIF_MODE: + if(*pOptionLen < sizeof(tenuTlsCertExpSettings)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(tenuTlsCertExpSettings); + if(!(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_PEER_CERTTIMECHECK)) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_DISABLE; + else if(gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_REQUIRE_TIME) + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_ENABLE; + else + *(tenuTlsCertExpSettings*)pOptionValue = TLS_CERT_EXP_CHECK_EN_IF_SYS_TIME; + break; + case WIFI_1X_SESSION_CACHING: + if(*pOptionLen < sizeof(int)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(int); + *(int*)pOptionValue = (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SESSION_CACHING) ? 1 : 0; + break; + case WIFI_1X_SPECIFIC_ROOTCERT: + if (gu321xTlsHsFlags & WIFI_1X_TLS_HS_FLAGS_SPECIFY_ROOTCERT) + { + if (*pOptionLen < sizeof(gau81xRootSha1)) + return M2M_ERR_INVALID_ARG; + *pOptionLen = sizeof(gau81xRootSha1); + memcpy((uint8_t*)pOptionValue, gau81xRootSha1, sizeof(gau81xRootSha1)); + } + else + *pOptionLen = 0; + break; + default: + return M2M_ERR_INVALID_ARG; + } + return M2M_SUCCESS; +} + +int8_t m2m_wifi_connect_1x_mschap2( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xMschap2 *pstrAuth1xMschap2 +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xMschap2 != NULL) + { + if (pstrAuth1xMschap2->pu8Domain == NULL) + pstrAuth1xMschap2->u16DomainLen = 0; + if ( + (pstrAuth1xMschap2->pu8UserName != NULL) + && (pstrAuth1xMschap2->pu8Password != NULL) + && ((uint32_t)(pstrAuth1xMschap2->u16DomainLen) + pstrAuth1xMschap2->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xMschap2->u16PasswordLen <= M2M_AUTH_1X_PASSWORD_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xMschap2->u16DomainLen + + pstrAuth1xMschap2->u16UserNameLen + + pstrAuth1xMschap2->u16PasswordLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16AuthSize); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16AuthSize); + + pstr1xHdr.u8Flags = M2M_802_1X_MSCHAP2_FLAG; + if (pstrAuth1xMschap2->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xMschap2->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xMschap2->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xMschap2->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xMschap2->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xMschap2->u16PasswordLen; + memcpy(pu8AuthPtr, pstrAuth1xMschap2->pu8Password, pstr1xHdr.u16PrivateKeyLength); + + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16AuthSize, + sizeof(tstrM2mWifiConnHdr)); + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect_1x_tls( + tenuCredStoreOption enuCredStoreOption, + tstrNetworkId *pstrNetworkId, + tstrAuth1xTls *pstrAuth1xTls +) +{ + int8_t ret = M2M_ERR_INVALID_ARG; + if (pstrAuth1xTls != NULL) + { + if (pstrAuth1xTls->pu8Domain == NULL) + pstrAuth1xTls->u16DomainLen = 0; + if ( + (pstrAuth1xTls->pu8UserName != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Mod != NULL) + && (pstrAuth1xTls->pu8PrivateKey_Exp != NULL) + && (pstrAuth1xTls->pu8Certificate != NULL) + && ((uint32_t)(pstrAuth1xTls->u16DomainLen) + pstrAuth1xTls->u16UserNameLen <= M2M_AUTH_1X_USER_LEN_MAX) + && (pstrAuth1xTls->u16PrivateKeyLen <= M2M_AUTH_1X_PRIVATEKEY_LEN_MAX) + && (pstrAuth1xTls->u16CertificateLen <= M2M_AUTH_1X_CERT_LEN_MAX) + ) + { + tstrM2mWifiConnHdr strConnHdr; + uint16_t u16AuthSize = sizeof(tstrM2mWifi1xHdr) + + pstrAuth1xTls->u16DomainLen + + pstrAuth1xTls->u16UserNameLen + + (2 * pstrAuth1xTls->u16PrivateKeyLen) + + pstrAuth1xTls->u16CertificateLen; + + ret = m2m_wifi_connect_prepare_msg(enuCredStoreOption, + M2M_WIFI_SEC_802_1X, + u16AuthSize, + pstrNetworkId, + &strConnHdr); + + if (ret == M2M_SUCCESS) + { + uint16_t u16Payload1Size = u16AuthSize - pstrAuth1xTls->u16CertificateLen; + tstrM2mWifi1xHdr pstr1xHdr;// = (tstrM2mWifi1xHdr *)OSAL_Malloc(u16Payload1Size); + // if (pstr1xHdr == NULL) + // ret = M2M_ERR_MEM_ALLOC; + // else + { + tstrM2mWifiAuthInfoHdr strInfoHdr = {0}; + + uint8_t *pu8AuthPtr = pstr1xHdr.au81xAuthDetails; + memset((uint8_t*)&pstr1xHdr, 0, u16Payload1Size); + + pstr1xHdr.u8Flags = M2M_802_1X_TLS_FLAG; + if (pstrAuth1xTls->bUnencryptedUserName == true) + pstr1xHdr.u8Flags |= M2M_802_1X_UNENCRYPTED_USERNAME_FLAG; + if (pstrAuth1xTls->bPrependDomain == true) + pstr1xHdr.u8Flags |= M2M_802_1X_PREPEND_DOMAIN_FLAG; + + pstr1xHdr.u8HdrLength = sizeof(tstrM2mWifi1xHdr); + pstr1xHdr.u32TlsHsFlags = gu321xTlsHsFlags; + memcpy(pstr1xHdr.au8TlsSpecificRootNameSha1, gau81xRootSha1, sizeof(gau81xRootSha1)); + + pstr1xHdr.u8DomainLength = 0; + if (pstrAuth1xTls->pu8Domain != NULL) + { + pstr1xHdr.u8DomainLength = (uint8_t)(pstrAuth1xTls->u16DomainLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8Domain, pstr1xHdr.u8DomainLength); + pu8AuthPtr += pstr1xHdr.u8DomainLength; + } + + pstr1xHdr.u8UserNameLength = (pstrAuth1xTls->u16UserNameLen); + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8UserName, pstr1xHdr.u8UserNameLength); + pu8AuthPtr += pstr1xHdr.u8UserNameLength; + + pstr1xHdr.u16PrivateKeyOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16PrivateKeyLength = pstrAuth1xTls->u16PrivateKeyLen; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Mod, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + memcpy(pu8AuthPtr, pstrAuth1xTls->pu8PrivateKey_Exp, pstr1xHdr.u16PrivateKeyLength); + pu8AuthPtr += pstr1xHdr.u16PrivateKeyLength; + + pstr1xHdr.u16CertificateOffset = pu8AuthPtr - pstr1xHdr.au81xAuthDetails; + pstr1xHdr.u16CertificateLength = pstrAuth1xTls->u16CertificateLen; + + strInfoHdr.u8Type = M2M_802_1X_TLS_CLIENT_CERTIFICATE; + strInfoHdr.u16InfoPos = pstr1xHdr.u16CertificateOffset; + strInfoHdr.u16InfoLen = pstr1xHdr.u16CertificateLength; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_IND_CONN_PARAM | M2M_REQ_DATA_PKT, + (uint8_t*)&strInfoHdr, sizeof(tstrM2mWifiAuthInfoHdr), + pstrAuth1xTls->pu8Certificate, pstrAuth1xTls->u16CertificateLen, + sizeof(tstrM2mWifiAuthInfoHdr)); + + if (ret == M2M_SUCCESS) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONN | M2M_REQ_DATA_PKT, + (uint8_t*)&strConnHdr, sizeof(tstrM2mWifiConnHdr), + (uint8_t*)&pstr1xHdr, u16Payload1Size, + sizeof(tstrM2mWifiConnHdr)); + } + // OSAL_Free(pstr1xHdr); + } + } + } + } + return ret; +} + +int8_t m2m_wifi_connect(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch) +{ + return m2m_wifi_connect_sc(pcSsid, u8SsidLen, u8SecType, pvAuthInfo, u16Ch, 0); +} + +int8_t m2m_wifi_connect_sc(char *pcSsid, uint8_t u8SsidLen, uint8_t u8SecType, void *pvAuthInfo, uint16_t u16Ch, uint8_t u8NoSaveCred) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + tstrNetworkId strNetworkId = {NULL, (uint8_t*)pcSsid, u8SsidLen, (tenuM2mScanCh)u16Ch}; + tenuCredStoreOption enuCredStoreOption = u8NoSaveCred ? WIFI_CRED_DONTSAVE : WIFI_CRED_SAVE_ENCRYPTED; + + /* This API does not support SSIDs which contain '\0'. If there is a '\0' character within the + * first u8SsidLen characters, then assume that the input u8SsidLen was incorrect - set length + * to strlen(pcSsid) and continue. This is to avoid a change from the behaviour of previously + * released drivers. */ + if (u8SsidLen < M2M_MAX_SSID_LEN) + while(u8SsidLen--) + if (strNetworkId.pu8Ssid[u8SsidLen] == 0) + strNetworkId.u8SsidLen = u8SsidLen; + + switch((tenuM2mSecType)u8SecType) + { + case M2M_WIFI_SEC_OPEN: + s8Ret = m2m_wifi_connect_open(enuCredStoreOption, &strNetworkId); + break; + case M2M_WIFI_SEC_WPA_PSK: + if (pvAuthInfo != NULL) + { + tstrAuthPsk strAuthPsk = {NULL, NULL, 0}; + uint16_t len = strlen((const char*)pvAuthInfo); + + if (len == M2M_MAX_PSK_LEN-1) + { + strAuthPsk.pu8Psk = (uint8_t*)pvAuthInfo; + } + else + { + strAuthPsk.pu8Passphrase = (uint8_t*)pvAuthInfo; + strAuthPsk.u8PassphraseLen = len; + } + s8Ret = m2m_wifi_connect_psk(enuCredStoreOption, &strNetworkId, &strAuthPsk); + } + break; + case M2M_WIFI_SEC_WEP: + if (pvAuthInfo != NULL) + { + tstrM2mWifiWepParams *pstrWepParams = (tstrM2mWifiWepParams *)pvAuthInfo; + tstrAuthWep strAuthWep = {pstrWepParams->au8WepKey, pstrWepParams->u8KeySz-1, pstrWepParams->u8KeyIndx}; + + s8Ret = m2m_wifi_connect_wep(enuCredStoreOption, &strNetworkId, &strAuthWep); + } + break; + default: + break; + } + return s8Ret; +} + +int8_t m2m_wifi_disconnect(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISCONNECT, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_mac_address(uint8_t au8MacAddress[6]) +{ + tstrM2mSetMacAddress strTmp; + memcpy((uint8_t*)strTmp.au8Mac, (uint8_t*)au8MacAddress, 6); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_ADDRESS, + (uint8_t*)&strTmp, sizeof(tstrM2mSetMacAddress), NULL, 0, 0); +} + +int8_t m2m_wifi_set_static_ip(tstrM2MIPConfig *pstrStaticIPConf) +{ + pstrStaticIPConf->u32DNS = NM_BSP_B_L_32(pstrStaticIPConf->u32DNS); + pstrStaticIPConf->u32Gateway = NM_BSP_B_L_32(pstrStaticIPConf->u32Gateway); + pstrStaticIPConf->u32StaticIP = NM_BSP_B_L_32( + pstrStaticIPConf->u32StaticIP); + pstrStaticIPConf->u32SubnetMask = NM_BSP_B_L_32( + pstrStaticIPConf->u32SubnetMask); + return hif_send(M2M_REQ_GROUP_IP, M2M_IP_REQ_STATIC_IP_CONF, + (uint8_t*)pstrStaticIPConf, sizeof(tstrM2MIPConfig), NULL, 0, 0); +} + +int8_t m2m_wifi_enable_dhcp(uint8_t u8DhcpEn) +{ + uint8_t u8Req; + u8Req = u8DhcpEn ? M2M_IP_REQ_ENABLE_DHCP : M2M_IP_REQ_DISABLE_DHCP; + return hif_send(M2M_REQ_GROUP_IP, u8Req, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_lsn_int(tstrM2mLsnInt *pstrM2mLsnInt) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_LSN_INT, (uint8_t*)pstrM2mLsnInt, sizeof(tstrM2mLsnInt), NULL, 0, 0); +} + +int8_t m2m_wifi_set_cust_InfoElement(uint8_t *pau8M2mCustInfoElement) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CUST_INFO_ELEMENT, (uint8_t*)pau8M2mCustInfoElement, pau8M2mCustInfoElement[0]+1, NULL, 0, 0); +} + +int8_t m2m_wifi_set_scan_options(tstrM2MScanOption *ptstrM2MScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + if (m2m_validate_scan_options(ptstrM2MScanOption) == M2M_SUCCESS) + { + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_OPTION, (uint8_t*)ptstrM2MScanOption, sizeof(tstrM2MScanOption), NULL, 0, 0); + } + return s8Ret; +} + +int8_t m2m_wifi_set_stop_scan_on_first(uint8_t u8StopScanOption) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + tstrM2MStopScanOption StopScanOption = { 0 }; + + if(1 >= u8StopScanOption) + { + StopScanOption.u8StopOnFirstResult = u8StopScanOption; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_STOP_SCAN_OPTION, (uint8_t*)&StopScanOption, sizeof(tstrM2MStopScanOption), NULL, 0, 0); + + M2M_INFO("Scan will %sstop on first result.\r\n", StopScanOption.u8StopOnFirstResult ? "" : "NOT "); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + + return s8Ret; +} + +int8_t m2m_wifi_set_scan_region(uint16_t ScanRegion) +{ + int8_t s8Ret = M2M_ERR_FAIL; + tstrM2MScanRegion strScanRegion; + strScanRegion.u16ScanRegion = ScanRegion; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SCAN_REGION, (uint8_t*)&strScanRegion, sizeof(tstrM2MScanRegion), NULL, 0, 0); + return s8Ret; +} + +int8_t m2m_wifi_request_scan(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_passive(uint8_t ch) +{ + int8_t s8Ret = M2M_SUCCESS; + + if (((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL)) + { + tstrM2MScan strtmp; + strtmp.u8ChNum = ch; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_PASSIVE_SCAN, (uint8_t*)&strtmp, sizeof(tstrM2MScan), NULL, 0, 0); + } + else + { + s8Ret = M2M_ERR_INVALID_ARG; + } + return s8Ret; +} + +int8_t m2m_wifi_request_scan_ssid_list(uint8_t ch, uint8_t *u8Ssidlist) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((((ch >= M2M_WIFI_CH_1) && (ch <= M2M_WIFI_CH_14)) || (ch == M2M_WIFI_CH_ALL))&&(u8Ssidlist != NULL)) + { + tstrM2MScan strtmp; + uint16_t u16Lsize = 0; + uint8_t u8Apnum = u8Ssidlist[u16Lsize]; + if(u8Apnum <= MAX_HIDDEN_SITES) + { + u16Lsize++; + while(u8Apnum) + { + if(u8Ssidlist[u16Lsize] >= M2M_MAX_SSID_LEN) { + goto EXIT; + } else { + u16Lsize += u8Ssidlist[u16Lsize] + 1; + u8Apnum--; + } + } + strtmp.u8ChNum = ch; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_SSID_LIST|M2M_REQ_DATA_PKT, (uint8_t*)&strtmp, sizeof(tstrM2MScan), u8Ssidlist, u16Lsize, sizeof(tstrM2MScan)); + } + } +EXIT: + return s8Ret; +} +int8_t m2m_wifi_wps(uint8_t u8TriggerType, const char *pcPinNumber) +{ + tstrM2MWPSConnect strtmp; + + strtmp.u8TriggerType = u8TriggerType; + /*If WPS is using PIN METHOD*/ + if (u8TriggerType == WPS_PIN_TRIGGER) + memcpy((uint8_t*)strtmp.acPinNumber, (uint8_t*)pcPinNumber, 8); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_WPS, (uint8_t*)&strtmp, sizeof(tstrM2MWPSConnect), NULL, 0, 0); +} + +int8_t m2m_wifi_wps_disable(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_WPS, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_p2p(uint8_t u8Channel) +{ + int8_t ret = M2M_SUCCESS; + if ((u8Channel == M2M_WIFI_CH_1) || (u8Channel == M2M_WIFI_CH_6) || (u8Channel == M2M_WIFI_CH_11)) + { + tstrM2MP2PConnect strtmp; + strtmp.u8ListenChannel = u8Channel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_P2P, (uint8_t*)&strtmp, sizeof(tstrM2MP2PConnect), NULL, 0, 0); + } + else + { + M2M_ERR("Listen channel should only be 1, 6 or 11\r\n"); + ret = M2M_ERR_FAIL; + } + return ret; +} + +int8_t m2m_wifi_p2p_disconnect(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_P2P, NULL, 0, NULL, 0, 0); + return ret; +} +int8_t m2m_wifi_enable_ap(const tstrM2MAPConfig *pstrM2MAPConfig) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, (uint8_t*)pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_enable_ap_ext(&strM2MAPModeConfig); +} + +int8_t m2m_wifi_enable_ap_ext(const tstrM2MAPModeConfig *pstrM2MAPModeConfig) +{ + int8_t ret = M2M_ERR_FAIL; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrM2MAPModeConfig)) + { + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ENABLE_AP, (uint8_t*)pstrM2MAPModeConfig, sizeof(tstrM2MAPModeConfig), NULL, 0, 0); + + if (ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. + ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_ENABLE_AP_LEGACY, + (uint8_t*)&pstrM2MAPModeConfig->strApConfig, + sizeof(tstrM2MAPConfig), + NULL, + 0, + 0 + ); + } + } + return ret; +} + +int8_t m2m_wifi_disable_ap(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DISABLE_AP, NULL, 0, NULL, 0, 0); + return ret; +} +/*! +@fn int8_t m2m_wifi_req_curr_rssi(void); +@brief Request the current RSSI for the current connected AP, + the response received in wifi_cb M2M_WIFI_RESP_CURRENT_RSSI +@sa M2M_WIFI_RESP_CURRENT_RSSI +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_req_curr_rssi(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CURRENT_RSSI, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_restrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_RESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_req_unrestrict_ble(void) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_UNRESTRICT_BLE, NULL, 0, NULL, 0, 0); + return ret; +} + +int8_t m2m_wifi_send_ethernet_pkt(uint8_t *pu8Packet, uint16_t u16PacketSize) +{ + int8_t s8Ret = -1; + if ((pu8Packet != NULL)&&(u16PacketSize>0)) + { + tstrM2MWifiTxPacketInfo strTxPkt; + + strTxPkt.u16PacketSize = u16PacketSize; + strTxPkt.u16HeaderLength = M2M_ETHERNET_HDR_LEN; + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SEND_ETHERNET_PACKET | M2M_REQ_DATA_PKT, + (uint8_t*)&strTxPkt, sizeof(tstrM2MWifiTxPacketInfo), pu8Packet, u16PacketSize, M2M_ETHERNET_HDR_OFFSET - M2M_HIF_HDR_OFFSET); + } + return s8Ret; +} + +/*! +@fn int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t * pu8IsValid); +@brief Request the MAC address stored on the OTP (one time programmable) memory of the device. + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. Valid only if *pu8Valid=1. +@param [out] pu8IsValid + A output boolean value to indicate the validity of pu8MacAddr in OTP. + Output zero if the OTP memory is not programmed, non-zero otherwise. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_otp_mac_address(pu8MacAddr, pu8IsValid); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +@brief Request the current MAC address of the device (the working mac address). + (the function is Blocking until response received) +@param [out] pu8MacAddr + Output MAC address buffer of 6 bytes size. +@return The function shall return M2M_SUCCESS for success and a negative value otherwise. +@sa m2m_wifi_get_otp_mac_address +@pre m2m_wifi_init required to call any WIFI/socket function +*/ +int8_t m2m_wifi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nmi_get_mac_address(pu8MacAddr); + hif_chip_sleep(); + } + + return ret; +} + +/*! +@fn int8_t m2m_wifi_req_scan_result(uint8_t index); +@brief Reads the AP information from the Scan Result list with the given index, + the response received in wifi_cb M2M_WIFI_RESP_SCAN_RESULT, + the response pointer should be casted with tstrM2mWifiscanResult structure +@param [in] index + Index for the requested result, the index range start from 0 till number of AP's found +@sa tstrM2mWifiscanResult,m2m_wifi_get_num_ap_found,m2m_wifi_request_scan +@return The function shall return @ref M2M_SUCCESS for success and a negative value otherwise +@pre m2m_wifi_request_scan need to be called first, then m2m_wifi_get_num_ap_found + to get the number of AP's found +@warning Function used only in STA mode only. the scan result updated only if scan request called, + else it will be cashed in firmware for the host scan request result, + which mean if large delay occur between the scan request and the scan result request, + the result will not be up-to-date +*/ + +int8_t m2m_wifi_req_scan_result(uint8_t index) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mReqScanResult strReqScanRlt; + strReqScanRlt.u8Index = index; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SCAN_RESULT, (uint8_t*)&strReqScanRlt, sizeof(tstrM2mReqScanResult), NULL, 0, 0); + return ret; +} + +/*! +@fn uint8_t m2m_wifi_get_num_ap_found(void); +@brief Reads the number of AP's found in the last Scan Request, + The function read the number of AP's from global variable which updated in the + wifi_cb in M2M_WIFI_RESP_SCAN_DONE. +@sa m2m_wifi_request_scan +@return Return the number of AP's found in the last Scan Request. +@pre m2m_wifi_request_scan need to be called first +@warning That function need to be called in the wifi_cb in M2M_WIFI_RESP_SCAN_DONE, + calling that function in any other place will return undefined/undated numbers. + Function used only in STA mode only. +*/ +uint8_t m2m_wifi_get_num_ap_found(void) +{ + return gu8ChNum; +} + +/*! +@fn uint8_t m2m_wifi_get_sleep_mode(void); +@brief Get the current Power save mode. +@return The current operating power saving mode. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +*/ +uint8_t m2m_wifi_get_sleep_mode(void) +{ + return hif_get_sleep_mode(); +} + +/*! +@fn int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn); +@brief Set the power saving mode for the WINC3400. +@param [in] PsTyp + Desired power saving mode. Supported types are defined in tenuPowerSaveModes. +@param [in] BcastEn + Broadcast reception enable flag. + If it is 1, the WINC3400 must be awake each DTIM Beacon for receiving Broadcast traffic. + If it is 0, the WINC3400 will not wakeup at the DTIM Beacon, but its wakeup depends only + on the the configured Listen Interval. +@return The function SHALL return 0 for success and a negative value otherwise. +@sa tenuPowerSaveModes +@warning The function called once after initialization. +*/ +int8_t m2m_wifi_set_sleep_mode(uint8_t PsTyp, uint8_t BcastEn) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPsType strPs; + strPs.u8PsType = PsTyp; + strPs.u8BcastEn = BcastEn; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SLEEP, (uint8_t*)&strPs, sizeof(tstrM2mPsType), NULL, 0, 0); + M2M_INFO("POWER SAVE %d\r\n", PsTyp); + hif_set_sleep_mode(PsTyp); + return ret; +} + +/*! +@fn int8_t m2m_wifi_request_sleep(void) +@brief Request from WINC3400 device to Sleep for specific time in the M2M_PS_MANUAL Power save mode (only). +@param [in] u32SlpReqTime + Request Sleep in ms +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@sa tenuPowerSaveModes , m2m_wifi_set_sleep_mode +@warning This API is currently unsupported on the WINC3400 +*/ +int8_t m2m_wifi_request_sleep(uint32_t u32SlpReqTime) +{ + int8_t ret = M2M_SUCCESS; + uint8_t psType; + psType = hif_get_sleep_mode(); + if (psType == M2M_PS_MANUAL) + { + tstrM2mSlpReqTime strPs; + strPs.u32SleepTime = u32SlpReqTime; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_DOZE, (uint8_t*)&strPs, sizeof(tstrM2mSlpReqTime), NULL, 0, 0); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength); +@brief Set the WINC3400 device name which is used as P2P device name. +@param [in] pu8DeviceName + Buffer holding the device name. +@param [in] u8DeviceNameLength + Length of the device name. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +@warning The Function called once after initialization. +*/ +int8_t m2m_wifi_set_device_name(uint8_t *pu8DeviceName, uint8_t u8DeviceNameLength) +{ + tstrM2MDeviceNameConfig strDeviceName; + if (u8DeviceNameLength >= M2M_DEVICE_NAME_MAX) + { + u8DeviceNameLength = M2M_DEVICE_NAME_MAX; + } + //pu8DeviceName[u8DeviceNameLength] = '\0'; + u8DeviceNameLength ++; + memcpy(strDeviceName.au8DeviceName, pu8DeviceName, u8DeviceNameLength); + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_DEVICE_NAME, + (uint8_t*)&strDeviceName, sizeof(tstrM2MDeviceNameConfig), NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP); +@brief Configures what NTP server the SNTP client should use. +@param [in] pu8NTPServerName + Buffer holding the NTP server name. If the first character is an asterisk (*) then it will be treated as a server pool, where the asterisk will + be replaced with an incrementing value from 0 to 3 each time a server fails (example: *.pool.ntp.org). +@param [in] u8NTPServerNameLength + Length of the NTP server name. Should not exceed the maximum NTP server name length of @ref M2M_NTP_MAX_SERVER_NAME_LENGTH +@param [in] useDHCP + Should the NTP server provided by the DHCP server be used. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_configure_sntp(uint8_t *pu8NTPServerName, uint8_t u8NTPServerNameLength, tenuSNTPUseDHCP useDHCP) +{ + tstrM2MSNTPConfig strSNTPConfig; + if (u8NTPServerNameLength > M2M_NTP_MAX_SERVER_NAME_LENGTH) + return M2M_ERR_FAIL; + + memcpy((uint8_t*)strSNTPConfig.acNTPServer, pu8NTPServerName, u8NTPServerNameLength); + strSNTPConfig.acNTPServer[u8NTPServerNameLength] = '\0'; + + strSNTPConfig.enuUseDHCP = useDHCP; + + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_CONFIG_SNTP, + (uint8_t*)&strSNTPConfig, sizeof(tstrM2MSNTPConfig), NULL, 0, 0); +} + +/*! +@fn \ + uint32_t m2m_wifi_get_chipId(void) + +@brief + Get the WINC Chip ID. + +@return + The function SHALL return chipID >0 or 0 for failure. +*/ +uint32_t m2m_wifi_get_chipId(void) +{ + return nmi_get_chipid(); +} + +/*! +@fn int8_t m2m_wifi_get_firmware_version(tstrM2mRev* pstrRev) + +@brief + Synchronous API to obtain the firmware version currently running on the WINC IC + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the firmware version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_firmware_full_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +/*! +@fn int8_t m2m_wifi_check_ota_rb(void); + +@brief + Synchronous API to check presence and compatibility of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@return + The function SHALL return @ref M2M_SUCCESS for compatible image and a negative value otherwise. +*/ +int8_t m2m_wifi_check_ota_rb(void) +{ + int8_t ret = M2M_SUCCESS; + uint16_t ota_hif_info = 0; + + ret = nm_get_hif_info(NULL, &ota_hif_info); + if (ret == M2M_SUCCESS) + { + ret = hif_check_compatibility(ota_hif_info); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev); + +@brief + Synchronous API to obtain the firmware version of the WINC image that is stored in the inactive flash partition. + This is the image that would run on the WINC IC if @ref m2m_ota_switch_firmware or @ref m2m_ota_rollback were called, + followed by a reset of the WINC IC. + +@param [out] pstrRev + pointer holds address of structure "tstrM2mRev" that contains the ota fw version parameters + +@return + The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_ota_get_firmware_version(tstrM2mRev *pstrRev) +{ + int8_t ret = M2M_SUCCESS; + ret = hif_chip_wake(); + if (ret == M2M_SUCCESS) + { + ret = nm_get_ota_firmware_info(pstrRev); + hif_chip_sleep(); + } + return ret; +} + +int8_t m2m_wifi_start_provision_mode(tstrM2MAPConfig *pstrM2MAPConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + tstrM2MAPModeConfig strM2MAPModeConfig; + + memcpy((uint8_t*)&strM2MAPModeConfig.strApConfig, (uint8_t*)pstrM2MAPConfig, sizeof(tstrM2MAPConfig)); + + memcpy(strM2MAPModeConfig.strApConfigExt.au8DefRouterIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + memcpy(strM2MAPModeConfig.strApConfigExt.au8DNSServerIP, pstrM2MAPConfig->au8DHCPServerIP, 4); + strM2MAPModeConfig.strApConfigExt.au8SubnetMask[0] = 0; + + return m2m_wifi_start_provision_mode_ext(&strM2MAPModeConfig, pcHttpServerDomainName, bEnableHttpRedirect); +} + +int8_t m2m_wifi_start_provision_mode_ext(tstrM2MAPModeConfig *pstrAPModeConfig, char *pcHttpServerDomainName, uint8_t bEnableHttpRedirect) +{ + int8_t s8Ret = M2M_ERR_FAIL; + + if ((pstrAPModeConfig != NULL)) + { + tstrM2MProvisionModeConfig strProvConfig; + if (M2M_SUCCESS == m2m_validate_ap_parameters(pstrAPModeConfig)) + { + memcpy((uint8_t*)&strProvConfig.strApConfig, (uint8_t*)&pstrAPModeConfig->strApConfig, sizeof(tstrM2MAPConfig)); + memcpy((uint8_t*)&strProvConfig.strApConfigExt, (uint8_t*)&pstrAPModeConfig->strApConfigExt, sizeof(tstrM2MAPConfigExt)); + if ((strlen((const char*)pcHttpServerDomainName) <= 0) || (NULL == pcHttpServerDomainName)) + { + M2M_ERR("INVALID DOMAIN NAME\r\n"); + goto ERR1; + } + memcpy((uint8_t*)strProvConfig.acHttpServerDomainName, (uint8_t*)pcHttpServerDomainName, 64); + strProvConfig.u8EnableRedirect = bEnableHttpRedirect; + + s8Ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_START_PROVISION_MODE | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, sizeof(tstrM2MProvisionModeConfig), NULL, 0, 0); + + if (s8Ret == M2M_ERR_SEND) + { + // Send again using legacy HIF message. We can use the same structure here as + // the firmware only uses to the HIF message to determine whether or not the + // structure contains a tstrM2MAPConfigExt structure. + s8Ret = hif_send( + M2M_REQ_GROUP_WIFI, + M2M_WIFI_REQ_START_PROVISION_MODE_LEGACY | M2M_REQ_DATA_PKT, + (uint8_t*)&strProvConfig, + sizeof(tstrM2MProvisionModeConfig), + NULL, + 0, + 0 + ); + } + } + else + { + /*goto ERR1;*/ + } + } +ERR1: + return s8Ret; +} + +int8_t m2m_wifi_stop_provision_mode(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_STOP_PROVISION_MODE, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_get_connection_info(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_CONN_INFO, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_set_system_time(uint32_t u32UTCSeconds) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_SYS_TIME, (uint8_t*)&u32UTCSeconds, sizeof(tstrSystemTime), NULL, 0, 0); +} + +/*! + * @fn int8_t m2m_wifi_get_system_time(void); + * @see m2m_wifi_enable_sntp + tstrSystemTime + * @note get the system time from the sntp client + * using the API \ref m2m_wifi_get_system_time. + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_wifi_get_system_time(void) +{ + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_SYS_TIME, NULL, 0, NULL, 0, 0); +} + +int8_t m2m_wifi_enable_sntp(uint8_t bEnable) +{ + uint8_t u8Req; + + u8Req = bEnable ? M2M_WIFI_REQ_ENABLE_SNTP_CLIENT : M2M_WIFI_REQ_DISABLE_SNTP_CLIENT; + return hif_send(M2M_REQ_GROUP_WIFI, u8Req, NULL, 0, NULL, 0, 0); +} + +/*! +@fn int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode); +@brief Change the power profile mode\n + Not implemented in WINC3400 firmware. +@param [in] u8PwrMode + Change the WINC power profile to different mode + PWR_LOW1/PWR_LOW2/PWR_HIGH/PWR_AUTO (tenuM2mPwrMode) +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mPwrMode +@pre m2m_wifi_init +@warning must be called after the initializations and before any connection request and can't be changed in run time, +*/ +int8_t m2m_wifi_set_power_profile(uint8_t u8PwrMode) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mPwrMode strM2mPwrMode; + strM2mPwrMode.u8PwrMode = u8PwrMode; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_POWER_PROFILE, (uint8_t*)&strM2mPwrMode, sizeof(tstrM2mPwrMode), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel); +@brief set the TX power tenuM2mTxPwrLevel +@param [in] u8TxPwrLevel + change the TX power tenuM2mTxPwrLevel +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa tenuM2mTxPwrLevel +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_tx_power(uint8_t u8TxPwrLevel) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mTxPwrLevel strM2mTxPwrLevel; + strM2mTxPwrLevel.u8TxPwrLevel = u8TxPwrLevel; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_TX_POWER, (uint8_t*)&strM2mTxPwrLevel, sizeof(tstrM2mTxPwrLevel), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable); +@brief Enable or Disable logs in run time (Disable Firmware logs will + enhance the firmware start-up time and performance) +@param [in] u8Enable + Set 1 to enable the logs 0 for disable +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_enable_firmware_logs(uint8_t u8Enable) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mEnableLogs strM2mEnableLogs; + strM2mEnableLogs.u8Enable = u8Enable; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_ENABLE_LOGS, (uint8_t*)&strM2mEnableLogs, sizeof(tstrM2mEnableLogs), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100); +@brief Set the battery voltage to update the firmware calculations. \n + Not implemented in WINC3400 firmware. +@param [in] u16BattVoltx100 + battery voltage multiplied by 100 +@return The function SHALL return @ref M2M_SUCCESS for success and a negative value otherwise. +@sa __DISABLE_FIRMWARE_LOGS__ (build option to disable logs from initializations) +@pre m2m_wifi_init +@warning +*/ +int8_t m2m_wifi_set_battery_voltage(uint16_t u16BattVoltx100) +{ + int8_t ret = M2M_SUCCESS; + tstrM2mBatteryVoltage strM2mBattVol = {0}; + strM2mBattVol.u16BattVolt = u16BattVoltx100; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_BATTERY_VOLTAGE, (uint8_t*)&strM2mBattVol, sizeof(tstrM2mBatteryVoltage), NULL, 0, 0); + return ret; +} + +/*! +@fn int8_t m2m_wifi_prng_get_random_bytes(uint8_t * pu8PrngBuff,uint16_t u16PrngSize) +@brief Get random bytes using the PRNG bytes. +@param [in] u16PrngSize + Size of the required random bytes to be generated. +@param [in] pu8PrngBuff + Pointer to user allocated buffer. +@return The function SHALL return M2M_SUCCESS for success and a negative value otherwise. +*/ +int8_t m2m_wifi_prng_get_random_bytes(uint8_t *pu8PrngBuff, uint16_t u16PrngSize) +{ + int8_t ret = M2M_ERR_FAIL; + tstrPrng strRng = {0}; + if ((u16PrngSize < (M2M_BUFFER_MAX_SIZE - sizeof(tstrPrng)))&&(pu8PrngBuff != NULL)) + { + strRng.u16PrngSize = u16PrngSize; + strRng.pu8RngBuff = pu8PrngBuff; + ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_GET_PRNG|M2M_REQ_DATA_PKT, (uint8_t*)&strRng, sizeof(tstrPrng), NULL, 0, 0); + } + else + { + M2M_ERR("PRNG Buffer exceeded maximum size %d or NULL Buffer\r\n", u16PrngSize); + } + return ret; +} + +/*! +@fn \ + int8_t m2m_wifi_enable_mac_mcast(uint8_t* pu8MulticastMacAddress, uint8_t u8AddRemove) + +@brief + Add MAC filter to receive Multicast packets. + +@param [in] pu8MulticastMacAddress + Pointer to the MAC address. +@param [in] u8AddRemove + Flag to Add/Remove MAC address. +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_enable_mac_mcast(uint8_t *pu8MulticastMacAddress, uint8_t u8AddRemove) +{ + int8_t s8ret = M2M_ERR_FAIL; + tstrM2MMulticastMac strMulticastMac; + + if (pu8MulticastMacAddress != NULL) + { + strMulticastMac.u8AddRemove = u8AddRemove; + memcpy(strMulticastMac.au8macaddress, pu8MulticastMacAddress, M2M_MAC_ADDRES_LEN); + M2M_DBG("mac multicast: %x:%x:%x:%x:%x:%x\r\n", strMulticastMac.au8macaddress[0], strMulticastMac.au8macaddress[1], strMulticastMac.au8macaddress[2], strMulticastMac.au8macaddress[3], strMulticastMac.au8macaddress[4], strMulticastMac.au8macaddress[5]); + s8ret = hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_SET_MAC_MCAST, (uint8_t*)&strMulticastMac, sizeof(tstrM2MMulticastMac), NULL, 0, 0); + } + + return s8ret; +} + +/*! +@fn \ + int8_t m2m_wifi_set_receive_buffer(void* pvBuffer,uint16_t u16BufferLen); + +@brief + set the Ethernet receive buffer, should be called in the receive call back. + +@param [in] pvBuffer + Pointer to the Ethernet receive buffer. +@param [in] u16BufferLen + Length of the buffer. + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_set_receive_buffer(void *pvBuffer, uint16_t u16BufferLen) +{ + int8_t s8ret = M2M_SUCCESS; + if (pvBuffer != NULL) + { + gau8ethRcvBuf = pvBuffer; + gu16ethRcvBufSize= u16BufferLen; + } + else + { + s8ret = M2M_ERR_FAIL; + M2M_ERR("Buffer NULL pointer\r\n"); + } + return s8ret; +} + +int8_t m2m_wifi_enable_roaming(uint8_t bEnableDhcp) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 1; + if (0 == bEnableDhcp || 1 == bEnableDhcp) + { + strWiFiRoaming.u8EnableDhcp = bEnableDhcp; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, + (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); + } + else + { + return M2M_ERR_INVALID_ARG; + } +} + +int8_t m2m_wifi_disable_roaming(void) +{ + tstrM2mWiFiRoaming strWiFiRoaming; + strWiFiRoaming.u8EnableRoaming = 0; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_ROAMING, (uint8_t*)&strWiFiRoaming, sizeof(tstrM2mWiFiRoaming), NULL, 0, 0); +} + +/*! +@fn \ + int8_t m2m_wifi_ble_api_send(const uint8_t* const msg, const uint32_t len); + +@brief + Send an encapsulated Atmel BLE API message + +@param [in] msg + Pointer to the Atmel BLE API message raw bytes +@param [in] len + Length of the msg + +@return + The function SHALL return 0 for success and a negative value otherwise. +*/ +int8_t m2m_wifi_ble_api_send(uint8_t *msg, uint32_t len) +{ + tstrM2mBleApiMsg bleTx; + bleTx.u16Len = len; + return hif_send(M2M_REQ_GROUP_WIFI, M2M_WIFI_REQ_BLE_API_SEND | M2M_REQ_DATA_PKT, + (uint8_t*)&bleTx, sizeof(tstrM2mBleApiMsg), msg, len, sizeof(tstrM2mBleApiMsg)); +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/nmasic.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmasic.c new file mode 100644 index 0000000..5ea608b --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmasic.c @@ -0,0 +1,706 @@ +/******************************************************************************* + File Name: + nmasic.c + + Summary: + This module contains WINC3400 ASIC specific internal APIs. + + Description: + This module contains WINC3400 ASIC specific internal APIs. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmasic.h" +#include "m2m_types.h" + +#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400) +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE + 0xa00) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) + +#define CORT_HOST_COMM (0x14) +#define HOST_CORT_COMM (0x0e) +#define WAKE_CLK_REG (0x1) +#define CLOCKS_EN_REG (0x13) + +#define TIMEOUT (2000) +#define WAKEUP_TRIALS (4) + +int8_t chip_apply_conf(uint32_t u32Conf) +{ + int8_t ret = M2M_SUCCESS; + uint32_t val32 = u32Conf; + +#ifdef __ENABLE_PMU__ + val32 |= rHAVE_USE_PMU_BIT; +#endif +#ifdef __ENABLE_SLEEP_CLK_SRC_RTC__ + val32 |= rHAVE_SLEEP_CLK_SRC_RTC_BIT; +#elif defined __ENABLE_SLEEP_CLK_SRC_XO__ + val32 |= rHAVE_SLEEP_CLK_SRC_XO_BIT; +#endif +#ifdef __ENABLE_EXT_PA_INV_TX_RX__ + val32 |= rHAVE_EXT_PA_INV_TX_RX; +#endif +#ifdef __ENABLE_LEGACY_RF_SETTINGS__ + val32 |= rHAVE_LEGACY_RF_SETTINGS; +#endif +#ifdef __DISABLE_FIRMWARE_LOGS__ + val32 |= rHAVE_LOGS_DISABLED_BIT; +#endif + do { + nm_write_reg(rNMI_GP_REG_1, val32); + if(val32 != 0) { + uint32_t reg = 0; + ret = nm_read_reg_with_ret(rNMI_GP_REG_1, ®); + if(ret == M2M_SUCCESS) { + if(reg == val32) + break; + } + } else { + break; + } + } while(1); + + return M2M_SUCCESS; +} + +void chip_idle(void) +{ + uint32_t reg =0; + nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(reg&NBIT1) + { + reg &=~NBIT1; + nm_write_reg(WAKE_CLK_REG, reg); + } +} + +void enable_rf_blocks(void) +{ + nm_write_reg(0x6, 0xdb); + nm_write_reg(0x7, 0x6); + nm_sleep(10); + nm_write_reg(0x1480, 0); + nm_write_reg(0x1484, 0); + nm_sleep(10); + + nm_write_reg(0x6, 0x0); + nm_write_reg(0x7, 0x0); +} + +int8_t enable_interrupts(void) +{ + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + /** + interrupt pin mux select + **/ + ret = nm_read_reg_with_ret(NMI_PIN_MUX_0, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 8); + ret = nm_write_reg(NMI_PIN_MUX_0, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + /** + interrupt enable + **/ + ret = nm_read_reg_with_ret(NMI_INTR_ENABLE, ®); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + reg |= ((uint32_t) 1 << 16); + ret = nm_write_reg(NMI_INTR_ENABLE, reg); + if (M2M_SUCCESS != ret) { + return M2M_ERR_BUS_FAIL; + } + return M2M_SUCCESS; +} + +int8_t cpu_start(void) { + uint32_t reg = 0; + int8_t ret; + + /** + reset regs + */ + ret = nm_write_reg(BOOTROM_REG, 0); + ret += nm_write_reg(NMI_STATE_REG, 0); + ret += nm_write_reg(NMI_REV_REG, 0); + + /** + Go... + **/ + ret += nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= NBIT0; + ret += nm_write_reg(0x1118, reg); + ret = nm_write_reg(0x150014, 0x1); //DTODO WHY IS THIS HERE?? + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + } + + reg |= (1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + nm_sleep(1); /* Removing this can cause a bus error. */ + return ret; +} + +uint32_t nmi_get_chipid(void) +{ + static uint32_t chipid = 0; + + if (chipid == 0) { + uint32_t rfrevid; + + if ((nm_read_reg_with_ret(0x1000, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if ((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + + if (chipid == 0x1002a0) { + if (rfrevid == 0x1) { /* 1002A0 */ + } else /* if (rfrevid == 0x2) */ { /* 1002A1 */ + chipid = 0x1002a1; + } + } else if (chipid == 0x1002b0) { + if (rfrevid == 3) { /* 1002B0 */ + } else if (rfrevid == 4) { /* 1002B1 */ + chipid = 0x1002b1; + } else /* if(rfrevid == 5) */ { /* 1002B2 */ + chipid = 0x1002b2; + } + } else if(chipid == 0x1000f0) { + /* For 3400, the WiFi chip ID register reads 0x1000f0. + * Therefore using BT chip ID register here which should read 0x3000D0 + */ +#define rBT_CHIP_ID_REG (0x3b0000) + if((nm_read_reg_with_ret(rBT_CHIP_ID_REG, &chipid)) != M2M_SUCCESS) { + chipid = 0; + return 0; + } + if(chipid == 0x3000d0) { + if(rfrevid == 6) { + chipid = 0x3000d1; + } + else if(rfrevid == 2) { + chipid = 0x3000d2; + } + } + } +//#define PROBE_FLASH +#ifdef PROBE_FLASH + if(chipid) { + UWORD32 flashid; + + flashid = probe_spi_flash(); + if((chipid & 0xf00000) == 0x300000) { + if(flashid == 0x1440ef) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } + } else { + if(flashid == 0x1230ef) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + if(flashid == 0xc21320c2) { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } + } + } +#else + /*M2M is by default have SPI flash*/ + if((chipid & 0xf00000) == 0x300000) { + chipid &= ~(0x0f0000); + chipid |= 0x040000; + } else { + chipid &= ~(0x0f0000); + chipid |= 0x050000; + } +#endif /* PROBE_FLASH */ + } + return chipid; +} + +uint32_t nmi_get_rfrevid(void) +{ + uint32_t rfrevid; + if((nm_read_reg_with_ret(0x13f4, &rfrevid)) != M2M_SUCCESS) { + rfrevid = 0; + } + return rfrevid; +} + +void restore_pmu_settings_after_global_reset(void) +{ + /* + * Must restore PMU register value after + * global reset if PMU toggle is done at + * least once since the last hard reset. + */ + if(REV(nmi_get_chipid()) >= REV_2B0) { + nm_write_reg(0x1e48, 0xb78469ce); + } +} + +void nmi_update_pll(void) +{ + uint32_t pll; + + pll = nm_read_reg(0x1428); + pll &= ~0x1ul; + nm_write_reg(0x1428, pll); + pll |= 0x1ul; + nm_write_reg(0x1428, pll); + +} +void nmi_set_sys_clk_src_to_xo(void) +{ + uint32_t val32; + + /* Switch system clock source to XO. This will take effect after nmi_update_pll(). */ + val32 = nm_read_reg(0x141c); + val32 |= (1 << 2); + nm_write_reg(0x141c, val32); + + /* Do PLL update */ + nmi_update_pll(); +} + +int8_t chip_sleep(void) +{ + uint32_t reg; + int8_t ret = M2M_SUCCESS; + + while(1) + { + ret = nm_read_reg_with_ret(CORT_HOST_COMM, ®); + if(ret != M2M_SUCCESS) goto ERR1; + if((reg & NBIT0) == 0) break; + } + + /* Clear bit 1 */ + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT1) + { + reg &=~NBIT1; + ret = nm_write_reg(WAKE_CLK_REG, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto ERR1; + if(reg & NBIT0) + { + reg &= ~NBIT0; + ret = nm_write_reg(HOST_CORT_COMM, reg); + if(ret != M2M_SUCCESS)goto ERR1; + } + +ERR1: + return ret; +} + +int8_t chip_wake(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, clk_status_reg = 0, trials = 0; + + nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + + ret = nm_read_reg_with_ret(HOST_CORT_COMM, ®); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + + if(!(reg & NBIT0)) + { + /*USE bit 0 to indicate host wakeup*/ + ret = nm_write_reg(HOST_CORT_COMM, reg|NBIT0); + if(ret != M2M_SUCCESS)goto _WAKE_EXIT; + } + + ret = nm_read_reg_with_ret(WAKE_CLK_REG, ®); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + + /* Set bit 1 */ + if(!(reg & NBIT1)) + { + ret = nm_write_reg(WAKE_CLK_REG, reg | NBIT1); + if(ret != M2M_SUCCESS) goto _WAKE_EXIT; + } + + do + { + ret = nm_read_reg_with_ret(CLOCKS_EN_REG, &clk_status_reg); + if(ret != M2M_SUCCESS) { + M2M_ERR("Bus error (5).%d %" PRIx32 "\n", ret, clk_status_reg); + goto _WAKE_EXIT; + } + if (clk_status_reg & NBIT2) { + break; + } + nm_sleep(2); + trials++; + if (trials > WAKEUP_TRIALS) + { + M2M_ERR("Failed to wakeup the chip\n"); + ret = M2M_ERR_TIME_OUT; + goto _WAKE_EXIT; + } + } while(1); + /* Workaround sometimes spi fail to read clock regs after reading/writing clockless registers */ + //nm_bus_reset(); +_WAKE_EXIT: + return ret; +} + +int8_t chip_reset_and_cpu_halt(void) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = chip_wake(); + if (ret != M2M_SUCCESS) { + return ret; + } + chip_reset(); + ret = nm_read_reg_with_ret(0x1118, ®); + if (M2M_SUCCESS != ret) { + ret = M2M_ERR_BUS_FAIL; + M2M_ERR("[nmi start]: fail read reg 0x1118 ...\r\n"); + } + reg |= (1 << 0); + ret = nm_write_reg(0x1118, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if ((reg & (1ul << 10)) == (1ul << 10)) { + reg &= ~(1ul << 10); + ret += nm_write_reg(NMI_GLB_RESET_0, reg); + ret += nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + } + nm_write_reg(BOOTROM_REG, 0); + nm_write_reg(NMI_STATE_REG, 0); + nm_write_reg(NMI_REV_REG, 0); + nm_write_reg(NMI_PIN_MUX_0, 0x11111000); + return ret; +} +int8_t chip_reset(void) +{ + int8_t ret = M2M_SUCCESS; + + ret += nm_write_reg(NMI_GLB_RESET_0, 0); + nm_sleep(50); + return ret; +} + +int8_t wait_for_bootrom(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + uint32_t u32GpReg1 = 0; + + reg = 0; + while(1) { + reg = nm_read_reg(0x1014); /* wait for efuse loading done */ + if (reg & 0x80000000) { + break; + } + nm_sleep(1); /* Removing this can cause a bus error. */ + } + reg = nm_read_reg(M2M_WAIT_FOR_HOST_REG); + reg &= 0x1; + + /* check if waiting for the host will be skipped or not */ + if(reg == 0) + { + while(reg != M2M_FINISH_BOOT_ROM) + { + nm_sleep(1); + reg = nm_read_reg(BOOTROM_REG); + + if (++cnt > TIMEOUT) + { + M2M_DBG("failed to load firmware from flash.\r\n"); + ret = M2M_ERR_INIT; + goto ERR2; + } + } + } + + if (M2M_WIFI_MODE_CONFIG == arg) { + nm_write_reg(NMI_REV_REG, M2M_ATE_FW_START_VALUE); + } else if (M2M_WIFI_MODE_ETHERNET == arg) { + u32GpReg1 = rHAVE_ETHERNET_MODE_BIT; + } else { + /*bypass this step*/ + } + + if (REV(nmi_get_chipid()) == REV_3A0) + { + chip_apply_conf(u32GpReg1 | rHAVE_USE_PMU_BIT); + } + else + { + chip_apply_conf(u32GpReg1); + } + + nm_write_reg(BOOTROM_REG, M2M_START_FIRMWARE); + +#ifdef __ROM_TEST__ + rom_test(); +#endif /* __ROM_TEST__ */ + +ERR2: + return ret; +} + +int8_t wait_for_firmware_start(uint8_t arg) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0, cnt = 0; + volatile uint32_t regAddress = NMI_STATE_REG; + volatile uint32_t checkValue = M2M_FINISH_INIT_STATE; + + if(M2M_WIFI_MODE_CONFIG == arg) { + regAddress = NMI_REV_REG; + checkValue = M2M_ATE_FW_START_VALUE;//M2M_ATE_FW_IS_UP_VALUE; + } else { + /*bypass this step*/ + } + + while (checkValue != reg) + { + nm_sleep(2); /* Removing this can cause a bus error. */ + M2M_DBG("%x %x %x\r\n", (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x108c), (unsigned int)nm_read_reg(0x14A0)); + if (nm_read_reg_with_ret(regAddress, ®) != M2M_SUCCESS) + { + // ensure reg != checkValue + reg = !checkValue; + } + if (++cnt > TIMEOUT) + { + M2M_DBG("Time out for wait firmware Run\r\n"); + ret = M2M_ERR_INIT; + goto ERR; + } + } + if (M2M_FINISH_INIT_STATE == checkValue) + { + nm_write_reg(NMI_STATE_REG, 0); + } +ERR: + return ret; +} + +int8_t chip_deinit(void) +{ + uint32_t reg = 0; + int8_t ret; + uint8_t timeout = 10; + + /** + stop the firmware, need a re-download + **/ + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("failed to de-initialize\r\n"); + } + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while writing reg\r\n"); + return ret; + } + + do { + ret = nm_read_reg_with_ret(NMI_GLB_RESET_0, ®); + if (ret != M2M_SUCCESS) { + M2M_ERR("Error while reading reg\r\n"); + return ret; + } + /*Workaround to ensure that the chip is actually reset*/ + if ((reg & (1 << 10))) { + M2M_DBG("Bit 10 not reset retry %d\r\n", timeout); + reg &= ~(1 << 10); + ret = nm_write_reg(NMI_GLB_RESET_0, reg); + timeout--; + } else { + break; + } + } while (timeout); + + return ret; +} + +int8_t set_gpio_dir(uint8_t gpio, uint8_t dir) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20108, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(dir) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20108, val32); + +_EXIT: + return ret; +} +int8_t set_gpio_val(uint8_t gpio, uint8_t val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20100, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + if(val) { + val32 |= (1ul << gpio); + } else { + val32 &= ~(1ul << gpio); + } + + ret = nm_write_reg(0x20100, val32); + +_EXIT: + return ret; +} + +int8_t get_gpio_val(uint8_t gpio, uint8_t* val) +{ + uint32_t val32; + int8_t ret; + + ret = nm_read_reg_with_ret(0x20104, &val32); + if(ret != M2M_SUCCESS) goto _EXIT; + + *val = (uint8_t)((val32 >> gpio) & 0x01); + +_EXIT: + return ret; +} + +int8_t pullup_ctrl(uint32_t pinmask, uint8_t enable) +{ + int8_t s8Ret; + uint32_t val32; + s8Ret = nm_read_reg_with_ret(0x142c, &val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to read\r\n"); + goto _EXIT; + } + if (enable) { + val32 &= ~pinmask; + } else { + val32 |= pinmask; + } + s8Ret = nm_write_reg(0x142c, val32); + if (s8Ret != M2M_SUCCESS) { + M2M_ERR("[pullup_ctrl]: failed to write\r\n"); + goto _EXIT; + } +_EXIT: + return s8Ret; +} + +int8_t nmi_get_otp_mac_address(uint8_t *pu8MacAddr, uint8_t *pu8IsValid) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000,(uint8_t*)&strgp,sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + if (!EFUSED_MAC(u32RegValue)) { + M2M_DBG("Default MAC\r\n"); + memset(pu8MacAddr, 0, 6); + goto _EXIT_ERR; + } + + M2M_DBG("OTP MAC\r\n"); + u32RegValue >>=16; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + if (pu8IsValid) *pu8IsValid = 1; + return ret; + +_EXIT_ERR: + if (pu8IsValid) *pu8IsValid = 0; + return ret; +} + +int8_t nmi_get_mac_address(uint8_t *pu8MacAddr) +{ + int8_t ret; + uint32_t u32RegValue; + uint8_t mac[6]; + tstrGpRegs strgp = {0}; + + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, &u32RegValue); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + + ret = nm_read_block(u32RegValue|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if (ret != M2M_SUCCESS) goto _EXIT_ERR; + u32RegValue = strgp.u32Mac_efuse_mib; + + u32RegValue &=0x0000ffff; + ret = nm_read_block(u32RegValue|0x30000, mac, 6); + memcpy(pu8MacAddr, mac, 6); + +_EXIT_ERR: + return ret; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/nmbus.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmbus.c new file mode 100644 index 0000000..60bcada --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmbus.c @@ -0,0 +1,248 @@ +/******************************************************************************* + This module contains WINC3400 bus APIs implementation. + + File Name: + nmbus.c + + Summary: + This module contains WINC3400 bus APIs implementation. + + Description: + This module contains WINC3400 bus APIs implementation. +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +#include "nmbus.h" +#include "nmspi.h" + +#define MAX_TRX_CFG_SZ 8 +#define NM_BUS_MAX_TRX_SZ 256 + +/** +* @struct tstrNmBusCapabilities +* @brief Structure holding bus capabilities information +* @sa NM_BUS_TYPE_I2C, NM_BUS_TYPE_SPI +*/ +typedef struct +{ + uint16_t u16MaxTrxSz; /*!< Maximum transfer size. Must be >= 16 bytes*/ +} tstrNmBusCapabilities; + +tstrNmBusCapabilities egstrNmBusCapabilities = +{ + NM_BUS_MAX_TRX_SZ +}; + +/* +* @fn nm_bus_init +* @brief Initialize the bus wrapper +* @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +static int8_t nm_bus_init(void *pvinit) +{ + nm_reset(); + nm_sleep(1); + return M2M_SUCCESS; +} + +/* +* @fn nm_bus_deinit +* @brief De-initialize the bus wrapper +*/ +static int8_t nm_bus_deinit(void) +{ + return M2M_SUCCESS; +} + +/** + * @fn nm_bus_iface_init + * @brief Initialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_init(void *pvInitVal) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_init(pvInitVal); + + return ret; +} + +/** + * @fn nm_bus_iface_deinit + * @brief Deinitialize bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_deinit(void) +{ + int8_t ret = M2M_SUCCESS; + ret = nm_bus_deinit(); + + return ret; +} + +/** + * @fn nm_bus_reset + * @brief reset bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + * @version 1.0 + */ +int8_t nm_bus_reset(void) +{ + return nm_spi_reset(); +} + +/** + * @fn nm_bus_iface_reconfigure + * @brief reconfigure bus interface + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_bus_iface_reconfigure(void *ptr) +{ + int8_t ret = M2M_SUCCESS; + return ret; +} +/* + * @fn nm_read_reg + * @brief Read register + * @param[in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_read_reg(uint32_t u32Addr) +{ + return nm_spi_read_reg(u32Addr); +} + +/* + * @fn nm_read_reg_with_ret + * @brief Read register with error code return + * @param[in] u32Addr + * Register address + * @param[out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure +*/ +int8_t nm_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + return nm_spi_read_reg_with_ret(u32Addr, pu32RetVal); +} + +/* + * @fn nm_write_reg + * @brief write register + * @param[in] u32Addr + * Register address + * @param[in] u32Val + * Value to be written to the register + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + return nm_spi_write_reg(u32Addr, u32Val); +} + +static inline int8_t p_nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_read_block(u32Addr, puBuf, u16Sz); +} +/* + * @fn nm_read_block + * @brief Read block of data + * @param[in] u32Addr + * Start address + * @param[out] puBuf + * Pointer to a buffer used to return the read data + * @param[in] u32Sz + * Number of bytes to read. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_read_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_read_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +static inline int8_t p_nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + return nm_spi_write_block(u32Addr, puBuf, u16Sz); +} +/** + * @fn nm_write_block + * @brief Write block of data + * @param[in] u32Addr + * Start address + * @param[in] puBuf + * Pointer to the buffer holding the data to be written + * @param[in] u32Sz + * Number of bytes to write. The buffer size must be >= u32Sz + * @return @ref M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_write_block(uint32_t u32Addr, uint8_t *puBuf, uint32_t u32Sz) +{ + uint16_t u16MaxTrxSz = egstrNmBusCapabilities.u16MaxTrxSz - MAX_TRX_CFG_SZ; + uint32_t off = 0; + int8_t s8Ret = M2M_SUCCESS; + + for(;;) + { + if(u32Sz <= u16MaxTrxSz) + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], (uint16_t)u32Sz); + break; + } + else + { + s8Ret += p_nm_write_block(u32Addr, &puBuf[off], u16MaxTrxSz); + if(M2M_SUCCESS != s8Ret) break; + u32Sz -= u16MaxTrxSz; + off += u16MaxTrxSz; + u32Addr += u16MaxTrxSz; + } + } + + return s8Ret; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/nmdrv.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmdrv.c new file mode 100644 index 0000000..421638a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmdrv.c @@ -0,0 +1,410 @@ +/******************************************************************************* + File Name: + nmdrv.c + + Summary: + This module contains WINC3400 M2M driver APIs implementation. + + Description: + This module contains WINC3400 M2M driver APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "nm_common.h" +#include "nmbus.h" +#include "nm_bsp.h" +#include "nmdrv.h" +#include "nmasic.h" +#include "m2m_types.h" + +#include "nmspi.h" + +static tenuNmState genuNmState = NM_STATE_DEINIT; +/** + * @fn nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo); + * @brief Get Hif info of images in both partitions (Firmware and Ota). + * @param[out] pu16FwHifInfo + * Pointer holding Hif info of image in the active partition. + * @param[out] pu16OtaHifInfo + * Pointer holding Hif info of image in the inactive partition. + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_get_hif_info(uint16_t *pu16FwHifInfo, uint16_t *pu16OtaHifInfo) +{ + int8_t ret = M2M_SUCCESS; + uint32_t reg = 0; + + ret = nm_read_reg_with_ret(NMI_REV_REG, ®); + if(ret == M2M_SUCCESS) + { + if(pu16FwHifInfo != NULL) + { + *pu16FwHifInfo = (uint16_t)reg; + } + if(pu16OtaHifInfo) + { + *pu16OtaHifInfo = (uint16_t)(reg>>16); + } + } + return ret; +} + +/** + * @fn nm_get_firmware_full_info(tstrM2mRev* M2mRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_firmware_full_info(tstrM2mRev *pstrRev) +{ + uint16_t fw_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(&fw_hif_info, NULL); + + M2M_INFO("Fw HIF: %04x\r\n", fw_hif_info); + if(M2M_GET_HIF_BLOCK(fw_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg &= 0x0000ffff; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("Firmware HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("Firmware ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("Firmware Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(fw_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent Firmware Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_ERR("Unknown Firmware Version\r\n"); + } + return ret; +} +/** + * @fn nm_get_ota_firmware_info(tstrM2mRev* pstrRev) + * @brief Get Firmware version info + * @param[out] M2mRev + * Pointer holds address of structure @ref tstrM2mRev that contains the firmware version parameters + */ +int8_t nm_get_ota_firmware_info(tstrM2mRev *pstrRev) +{ + uint16_t ota_hif_info = 0; + uint32_t reg = 0; + int8_t ret = M2M_SUCCESS; + tstrGpRegs strgp = {0}; + + memset((uint8_t*)pstrRev, 0, sizeof(tstrM2mRev)); + nm_get_hif_info(NULL, &ota_hif_info); + + M2M_INFO("OTA HIF: %04x\r\n", ota_hif_info); + if(M2M_GET_HIF_BLOCK(ota_hif_info) == M2M_HIF_BLOCK_VALUE) + { + ret = nm_read_reg_with_ret(rNMI_GP_REG_0, ®); + if(ret == M2M_SUCCESS) + { + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)&strgp, sizeof(tstrGpRegs)); + if(ret == M2M_SUCCESS) + { + reg = strgp.u32Firmware_Ota_rev; + reg >>= 16; + if(reg != 0) + { + ret = nm_read_block(reg|0x30000, (uint8_t*)pstrRev, sizeof(tstrM2mRev)); + if(ret == M2M_SUCCESS) + { + M2M_INFO("OTA HIF (%u) : %u.%u\r\n", M2M_GET_HIF_BLOCK(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MAJOR(pstrRev->u16FirmwareHifInfo), M2M_GET_HIF_MINOR(pstrRev->u16FirmwareHifInfo)); + M2M_INFO("OTA ver : %u.%u.%u\r\n", pstrRev->u8FirmwareMajor, pstrRev->u8FirmwareMinor, pstrRev->u8FirmwarePatch); + M2M_INFO("OTA Build %s Time %s\r\n", pstrRev->BuildDate, pstrRev->BuildTime); + + /* Check Hif info is consistent */ + if(ota_hif_info != pstrRev->u16FirmwareHifInfo) + { + ret = M2M_ERR_FAIL; + M2M_ERR("Inconsistent OTA Version\r\n"); + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + } + } + else + { + ret = M2M_ERR_FAIL; + } + if(ret != M2M_SUCCESS) + { + M2M_INFO("No valid OTA image\r\n"); + } + return ret; +} + +/** + * @fn nm_drv_init_download_mode + * @brief Initialize NMC1000 driver in download mode + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init_download_mode(void) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + + nm_spi_lock_init(); + + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + + /*disable all interrupt in ROM (to disable uart) in 2b0 chip*/ + nm_write_reg(0x20300, 0); + + genuNmState = NM_STATE_INIT; +ERR1: + return ret; +} + +int8_t nm_drv_init_hold(void) +{ + int8_t ret = M2M_SUCCESS; + + nm_spi_lock_init(); + + ret = nm_bus_iface_init(NULL); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail init bus\r\n"); + goto ERR1; + } + +#ifdef BUS_ONLY + return; +#endif + +#ifdef NO_HW_CHIP_EN + ret = chip_wake(); + nm_sleep(10); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi start]: fail chip_wakeup\r\n"); + goto ERR2; + } + + /** + Go... + **/ + ret = chip_reset(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } +#endif + M2M_INFO("Chip ID %lx\r\n", nmi_get_chipid()); + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_init(); + /*return power save to default value*/ + chip_idle(); + + genuNmState = NM_STATE_INIT; + + return ret; +#ifdef NO_HW_CHIP_EN +ERR2: + nm_bus_iface_deinit(); +#endif +ERR1: + return ret; +} + +int8_t nm_drv_init_start(void * arg) +{ + int8_t ret = M2M_SUCCESS; + uint8_t u8Mode = M2M_WIFI_MODE_NORMAL; + + if(NULL != arg) + { + u8Mode = *((uint8_t *)arg); + if(u8Mode < M2M_WIFI_MODE_NORMAL || u8Mode >= M2M_WIFI_MODE_MAX) + u8Mode = M2M_WIFI_MODE_NORMAL; + } + + ret = cpu_start(); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + ret = wait_for_bootrom(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + ret = wait_for_firmware_start(u8Mode); + if (M2M_SUCCESS != ret) { + goto ERR2; + } + + if(M2M_WIFI_MODE_CONFIG == u8Mode) { + goto ERR1; + } else { + /*continue running*/ + } + + ret = enable_interrupts(); + if (M2M_SUCCESS != ret) { + M2M_ERR("failed to enable interrupts..\r\n"); + goto ERR2; + } + + genuNmState = NM_STATE_START; + + return ret; +ERR2: + nm_bus_iface_deinit(); + nm_spi_deinit(); +ERR1: + return ret; +} + +/** + * @fn nm_drv_init + * @brief Initialize NMC1000 driver + * @param[in] arg + * Generic argument passed on to nm_drv_init_start + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_drv_init(void* arg) +{ + int8_t ret = M2M_SUCCESS; + + ret = nm_drv_init_hold(); + + if(ret == M2M_SUCCESS) + ret = nm_drv_init_start(arg); + + return ret; +} + +/** + * @fn nm_drv_deinit + * @brief Deinitialize NMC1000 driver + */ +int8_t nm_drv_deinit(void* arg) +{ + int8_t ret; + + ret = chip_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: chip_deinit fail\r\n"); + goto ERR1; + } + + ret = nm_bus_iface_deinit(); + if (M2M_SUCCESS != ret) { + M2M_ERR("[nmi stop]: fail init bus\r\n"); + goto ERR1; + } + /* Must do this after global reset to set SPI data packet size. */ + nm_spi_deinit(); + +ERR1: + genuNmState = NM_STATE_DEINIT; + + return ret; +} + + +/** + * @fn nm_cpu_start(void) + * @brief Start CPU from the WINC module + * @return @ref M2M_SUCCESS in case of success and Negative error code in case of failure + */ +int8_t nm_cpu_start(void) +{ + int8_t ret; + + ret = cpu_start(); + return ret; +} + +/** + * @fn nm_get_state(void) + * @brief Get the current state of the WINC module + * @return The current state of the WINC module + */ +tenuNmState nm_get_state(void) +{ + return genuNmState; +} + +//DOM-IGNORE-END \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/driver/source/nmspi.c b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmspi.c new file mode 100644 index 0000000..abea122 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/driver/source/nmspi.c @@ -0,0 +1,978 @@ +/******************************************************************************* + This module contains WINC3400 SPI protocol bus APIs implementation. + + File Name: + nmspi.c + + Summary: + This module contains WINC3400 SPI protocol bus APIs implementation. + + Description: + This module contains WINC3400 SPI protocol bus APIs implementation. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* + * Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. + * + * Subject to your compliance with these terms, you may use Microchip software + * and any derivatives exclusively with Microchip products. It is your + * responsibility to comply with third party license terms applicable to your + * use of third party software (including open source software) that may + * accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER + * EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED + * WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A + * PARTICULAR PURPOSE. + * + * IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, + * INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND + * WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS + * BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE + * FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN + * ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + *******************************************************************************/ + +//#include "osal/osal.h" +#include "nm_common.h" + +#include "nmspi.h" +#include "spi.h" +#include "BoardCfg.h" +//#include "wdrv_winc_common.h" +//#include "wdrv_winc_spi.h" + +#define NMI_PERIPH_REG_BASE 0x1000 +#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00) +#define NMI_CHIPID (NMI_PERIPH_REG_BASE) +#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408) +#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE) + +#define NMI_SPI_REG_BASE 0xe800 +#define NMI_SPI_CTL (NMI_SPI_REG_BASE) +#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4) +#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8) +#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc) +#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10) +#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20) +#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24) +#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c) +#define NMI_SPI_MISC_CTRL (NMI_SPI_REG_BASE+0x48) + +#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE) + +#define SPI_BASE NMI_SPI_REG_BASE + +//#define CMD_DMA_WRITE 0xc1 +//#define CMD_DMA_READ 0xc2 +#define CMD_INTERNAL_WRITE 0xc3 +#define CMD_INTERNAL_READ 0xc4 +//#define CMD_TERMINATE 0xc5 +//#define CMD_REPEAT 0xc6 +#define CMD_DMA_EXT_WRITE 0xc7 +#define CMD_DMA_EXT_READ 0xc8 +#define CMD_SINGLE_WRITE 0xc9 +#define CMD_SINGLE_READ 0xca +#define CMD_RESET 0xcf + +#define N_OK 0 +#define N_FAIL -1 +#define N_RESET -2 +#define N_RETRY -3 + +#define SPI_RESP_RETRY_COUNT (10) +#define SPI_RETRY_COUNT (10) +#define DATA_PKT_SZ_256 256 +#define DATA_PKT_SZ_512 512 +#define DATA_PKT_SZ_1K 1024 +#define DATA_PKT_SZ_4K (4 * 1024) +#define DATA_PKT_SZ_8K (8 * 1024) +#define DATA_PKT_SZ DATA_PKT_SZ_8K + +static uint8_t gu8Crc_off = 0; +unsigned char mWifiSPIBaudrate; + +//static OSAL_MUTEX_HANDLE_TYPE s_spiLock = 0; + +static inline int8_t spi_read(uint8_t *b, uint16_t sz) +{ + //JFM WINC Low Level + int i; + WIFI_SPI_SS_PIN = 0; + for(i = 0; i < sz; i++) + { + *b++ = SPITransaction(0xAA,mWifiSPIBaudrate); + } + WIFI_SPI_SS_PIN = 1; + + + return N_OK; + +} + +static inline int8_t spi_write(uint8_t *b, uint16_t sz) +{ + + //JFM WINC Low Level + int i; + WIFI_SPI_SS_PIN = 0; + for(i = 0; i < sz; i++) + { + SPITransaction(*b++,mWifiSPIBaudrate); + } + WIFI_SPI_SS_PIN = 1; + + return N_OK; +} + +/******************************************** + + Crc7 + + ********************************************/ + +static const uint8_t crc7_syndrome_table[256] = { + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, + 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, + 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, + 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, + 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, + 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, + 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, + 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, + 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, + 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, + 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, + 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, + 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, + 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, + 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, + 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, + 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, + 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, + 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, + 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, + 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, + 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, + 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, + 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, + 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, + 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, + 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, + 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, + 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, + 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 +}; + +static uint8_t crc7_byte(uint8_t crc, uint8_t data) +{ + return crc7_syndrome_table[(crc << 1) ^ data]; +} + +static uint8_t crc7(uint8_t crc, const uint8_t *buffer, uint32_t len) +{ + while (len--) + crc = crc7_byte(crc, *buffer++); + return crc; +} + +/******************************************** + + Spi protocol Function + + ********************************************/ + +static int8_t spi_cmd(uint8_t cmd, uint32_t adr, uint32_t u32data, uint32_t sz, uint8_t clockless) +{ + uint8_t bc[9]; + uint8_t len = 5; + + bc[0] = cmd; + switch (cmd) + { + case CMD_SINGLE_READ: /* single word (4 bytes) read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + len = 5; + break; + + case CMD_INTERNAL_READ: /* internal register read */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) + bc[1] |= (1 << 7); + bc[2] = (uint8_t)adr; + bc[3] = 0x00; + len = 5; + break; +#ifdef CMD_TERMINATE + case CMD_TERMINATE: /* termination */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif +#ifdef CMD_REPEAT + case CMD_REPEAT: /* repeat */ + bc[1] = 0x00; + bc[2] = 0x00; + bc[3] = 0x00; + len = 5; + break; +#endif + case CMD_RESET: /* reset */ + bc[1] = 0xff; + bc[2] = 0xff; + bc[3] = 0xff; + len = 5; + break; +#if defined(CMD_DMA_WRITE) || defined(CMD_DMA_READ) + case CMD_DMA_WRITE: /* dma write */ + case CMD_DMA_READ: /* dma read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 8); + bc[5] = (uint8_t)(sz); + len = 7; + break; +#endif + case CMD_DMA_EXT_WRITE: /* dma extended write */ + case CMD_DMA_EXT_READ: /* dma extended read */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)adr; + bc[4] = (uint8_t)(sz >> 16); + bc[5] = (uint8_t)(sz >> 8); + bc[6] = (uint8_t)(sz); + len = 8; + break; + + case CMD_INTERNAL_WRITE: /* internal register write */ + bc[1] = (uint8_t)(adr >> 8); + if(clockless) bc[1] |= (1 << 7); + bc[2] = (uint8_t)(adr); + bc[3] = (uint8_t)(u32data >> 24); + bc[4] = (uint8_t)(u32data >> 16); + bc[5] = (uint8_t)(u32data >> 8); + bc[6] = (uint8_t)(u32data); + len = 8; + break; + + case CMD_SINGLE_WRITE: /* single word write */ + bc[1] = (uint8_t)(adr >> 16); + bc[2] = (uint8_t)(adr >> 8); + bc[3] = (uint8_t)(adr); + bc[4] = (uint8_t)(u32data >> 24); + bc[5] = (uint8_t)(u32data >> 16); + bc[6] = (uint8_t)(u32data >> 8); + bc[7] = (uint8_t)(u32data); + len = 9; + break; + + default: + return N_FAIL; + } + + if (!gu8Crc_off) + { + bc[len-1] = (crc7(0x7f, (const uint8_t *)&bc[0], len-1)) << 1; + } + else + { + len -= 1; + } + + if (N_OK != spi_write(bc, len)) + { + M2M_ERR("[spi_cmd]: Failed cmd write, bus error...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_cmd_rsp(uint8_t cmd) +{ + uint8_t rsp; + int8_t s8RetryCnt; + + /** + Command/Control response + **/ + if ((cmd == CMD_RESET) +#ifdef CMD_TERMINATE + || (cmd == CMD_TERMINATE) +#endif +#ifdef CMD_REPEAT + || (cmd == CMD_REPEAT) +#endif + ) + { + if (N_OK != spi_read(&rsp, 1)) + return N_FAIL; + } + + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != cmd) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + /** + State response + **/ + /* wait for response */ + s8RetryCnt = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read, bus error...\r\n"); + return N_FAIL; + } + } + while((rsp != 0x00) && (s8RetryCnt-- > 0)); + + if (s8RetryCnt < 0) + { + M2M_ERR("[spi_cmd_rsp]: Failed cmd response read\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_reset(void) +{ + nm_sleep(1); + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + nm_sleep(1); +} + +/******************************************** + + Spi Internal Read/Write Function + + ********************************************/ + +static int8_t spi_data_read(uint8_t *b, uint16_t sz,uint8_t clockless) +{ + int16_t retry, ix, nbytes; + int8_t result = N_OK; + uint8_t crc[2]; + uint8_t rsp; + + /** + Data + **/ + ix = 0; + do { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Data Response header + **/ + retry = SPI_RESP_RETRY_COUNT; + do + { + if (N_OK != spi_read(&rsp, 1)) + { + M2M_ERR("[spi_data_read]: Failed data response read, bus error...\r\n"); + result = N_FAIL; + break; + } + if ((rsp & 0xf0) == 0xf0) + break; + } + while (retry--); + + if (result == N_FAIL) + break; + + if (retry <= 0) + { + M2M_ERR("[spi_data_read]: Failed data response read...(%02x)\r\n", rsp); + result = N_FAIL; + break; + } + + /** + Read bytes + **/ + if (N_OK != spi_read(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_read]: Failed data block read, bus error...\r\n"); + result = N_FAIL; + break; + } + if(!clockless) + { + /** + Read Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_read(crc, 2)) + { + M2M_ERR("[spi_data_read]: Failed data block CRC read, bus error...\r\n"); + result = N_FAIL; + break; + } + } + } + ix += nbytes; + sz -= nbytes; + + } while (sz); + + return result; +} + +static int8_t spi_data_write(uint8_t *b, uint16_t sz) +{ + int16_t ix = 0; + uint16_t nbytes; + int8_t result = N_OK; + uint8_t cmd, order, crc[2] = {0}; + //uint8_t rsp; + + /** + Data + **/ + do + { + if (sz <= DATA_PKT_SZ) + nbytes = sz; + else + nbytes = DATA_PKT_SZ; + + /** + Write command + **/ + cmd = 0xf0; + if (ix == 0) + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x1; + } + else + { + if (sz <= DATA_PKT_SZ) + order = 0x3; + else + order = 0x2; + } + + cmd |= order; + if (N_OK != spi_write(&cmd, 1)) + { + M2M_ERR("[spi_data_write]: Failed data block cmd write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write data + **/ + if (N_OK != spi_write(&b[ix], nbytes)) + { + M2M_ERR("[spi_data_write]: Failed data block write, bus error...\r\n"); + result = N_FAIL; + break; + } + + /** + Write Crc + **/ + if (!gu8Crc_off) + { + if (N_OK != spi_write(crc, 2)) + { + M2M_ERR("[spi_data_write]: Failed data block CRC write, bus error...\r\n"); + result = N_FAIL; + break; + } + } + + ix += nbytes; + sz -= nbytes; + } + while (sz); + + return result; +} + +/******************************************** + + Spi interfaces + + ********************************************/ + +static int8_t spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t cmd = CMD_SINGLE_WRITE; + uint8_t clockless = 0; + + if (u32Addr <= 0x30) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_WRITE; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, u32Val, 4, clockless) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_write_reg]: Failed cmd response, write reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t len; + uint8_t rsp[3]; + + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_WRITE, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_WRITE) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed cmd response, write block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_write(puBuf, u16Sz) != N_OK) + { + M2M_ERR("[spi_write_block]: Failed block data write...\r\n"); + return N_FAIL; + } + /** + Data RESP + **/ + if (!gu8Crc_off) + len = 2; + else + len = 3; + + if (N_OK != spi_read(&rsp[0], len)) + { + M2M_ERR("[spi_write_block]: Failed bus error...\r\n"); + return N_FAIL; + } + + if((rsp[len-1] != 0) || (rsp[len-2] != 0xC3)) + { + M2M_ERR("[spi_write_block]: Failed data response read, %x %x %x\r\n", rsp[0], rsp[1], rsp[2]); + return N_FAIL; + } + + return N_OK; +} + +static int8_t spi_read_reg(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t cmd = CMD_SINGLE_READ; + uint8_t tmp[4]; + uint8_t clockless = 0; + + if (u32Addr <= 0xff) + { + /** + NMC1000 clockless registers. + **/ + cmd = CMD_INTERNAL_READ; + clockless = 1; + } + + if (spi_cmd(cmd, u32Addr, 0, 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(cmd) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed cmd response, read reg (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /* to avoid endianess issues */ + if (spi_data_read(&tmp[0], 4, clockless) != N_OK) + { + M2M_ERR("[spi_read_reg]: Failed data read...\r\n"); + return N_FAIL; + } + + *pu32RetVal = ((uint32_t)tmp[0]) | + ((uint32_t)tmp[1] << 8) | + ((uint32_t)tmp[2] << 16) | + ((uint32_t)tmp[3] << 24); + + return N_OK; +} + +static int8_t spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + /** + Command + **/ + if (spi_cmd(CMD_DMA_EXT_READ, u32Addr, 0, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + if (spi_cmd_rsp(CMD_DMA_EXT_READ) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed cmd response, read block (%08" PRIx32 ")...\r\n", u32Addr); + return N_FAIL; + } + + /** + Data + **/ + if (spi_data_read(puBuf, u16Sz, 0) != N_OK) + { + M2M_ERR("[spi_read_block]: Failed block data read...\r\n"); + return N_FAIL; + } + + return N_OK; +} + +static void spi_init_pkt_sz(void) +{ + uint32_t val32; + + /* Make sure SPI max. packet size fits the defined DATA_PKT_SZ. */ + val32 = nm_spi_read_reg(SPI_BASE+0x24); + val32 &= ~(0x7 << 4); + switch(DATA_PKT_SZ) + { + case 256: val32 |= (0 << 4); break; + case 512: val32 |= (1 << 4); break; + case 1024: val32 |= (2 << 4); break; + case 2048: val32 |= (3 << 4); break; + case 4096: val32 |= (4 << 4); break; + case 8192: val32 |= (5 << 4); break; + } + nm_spi_write_reg(SPI_BASE+0x24, val32); +} + +/******************************************** + + Bus interfaces + + ********************************************/ + +int8_t nm_spi_reset(void) +{ + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + spi_cmd(CMD_RESET, 0, 0, 0, 0); + spi_cmd_rsp(CMD_RESET); + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; +} + +void nm_spi_lock_init(void) +{ + // OSAL_MUTEX_Create(&s_spiLock); +} + +/* + * @fn nm_spi_init + * @brief Initialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_init(void) +{ + uint32_t chipid; + uint32_t reg = 0; + + mWifiSPIBaudrate = SPICalculateBRG(PERIPHERAL_FREQ, WIFI_MODULE_SPI_BAUDRATE); + + /** + configure protocol + **/ + gu8Crc_off = 0; + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + /* Read failed. Try with CRC off. This might happen when module + is removed but chip isn't reset*/ + gu8Crc_off = 1; + M2M_ERR("[nm_spi_init]: Failed internal read protocol with CRC on, retrying with CRC off...\r\n"); + + if (nm_spi_read_reg_with_ret(NMI_SPI_PROTOCOL_CONFIG, ®) != M2M_SUCCESS) + { + // Reaad failed with both CRC on and off, something went bad + M2M_ERR("[nm_spi_init]: Failed internal read protocol...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + } + if(gu8Crc_off == 0) + { + reg &= ~0xc; /* disable CRC checking */ + reg &= ~0x70; + reg |= (0x5 << 4); + + if (nm_spi_write_reg(NMI_SPI_PROTOCOL_CONFIG, reg) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Failed internal write protocol reg...\r\n"); + + return M2M_ERR_BUS_FAIL; + } + + gu8Crc_off = 1; + } + + /** + make sure can read back chip id correctly + **/ + if (nm_spi_read_reg_with_ret(0x1000, &chipid) != M2M_SUCCESS) + { + M2M_ERR("[nm_spi_init]: Fail cmd read chip id...\r\n"); + return M2M_ERR_BUS_FAIL; + } + + M2M_DBG("[nm_spi_init]: chipid (%08x)\r\n", (unsigned int)chipid); + spi_init_pkt_sz(); + + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_deinit + * @brief DeInitialize the SPI + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_deinit(void) +{ + gu8Crc_off = 0; + // OSAL_MUTEX_Delete(&s_spiLock); + return M2M_SUCCESS; +} + +/* + * @fn nm_spi_read_reg + * @brief Read register + * @param [in] u32Addr + * Register address + * @return Register value + */ +uint32_t nm_spi_read_reg(uint32_t u32Addr) +{ + uint32_t u32Val; + + nm_spi_read_reg_with_ret(u32Addr, &u32Val); + + return u32Val; +} + +/* + * @fn nm_spi_read_reg_with_ret + * @brief Read register with error code return + * @param [in] u32Addr + * Register address + * @param [out] pu32RetVal + * Pointer to u32 variable used to return the read value + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_reg_with_ret(uint32_t u32Addr, uint32_t* pu32RetVal) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_read_reg(u32Addr, pu32RetVal) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 "\r\n", retry, u32Addr); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_write_reg + * @brief write register + * @param [in] u32Addr + * Register address + * @param [in] u32Val + * Value to be written to the register + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_reg(uint32_t u32Addr, uint32_t u32Val) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + while(retry--) + { + if (spi_write_reg(u32Addr, u32Val) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %" PRIx32 "\r\n", retry, u32Addr, u32Val); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_read_block + * @brief Read block of data + * @param [in] u32Addr + * Start address + * @param [out] puBuf + * Pointer to a buffer used to return the read data + * @param [in] u16Sz + * Number of bytes to read. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_read_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + uint8_t tmpBuf[2] = {0,0}; + uint8_t *puTmpBuf; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + if (u16Sz == 1) + { + u16Sz = 2; + puTmpBuf = tmpBuf; + } + else + { + puTmpBuf = puBuf; + } + + while(retry--) + { + if (spi_read_block(u32Addr, puTmpBuf, u16Sz) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + if (puTmpBuf == tmpBuf) + *puBuf = *tmpBuf; + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +/* + * @fn nm_spi_write_block + * @brief Write block of data + * @param [in] u32Addr + * Start address + * @param [in] puBuf + * Pointer to the buffer holding the data to be written + * @param [in] u16Sz + * Number of bytes to write. The buffer size must be >= u16Sz + * @return M2M_SUCCESS in case of success and M2M_ERR_BUS_FAIL in case of failure + */ +int8_t nm_spi_write_block(uint32_t u32Addr, uint8_t *puBuf, uint16_t u16Sz) +{ + uint8_t retry = SPI_RETRY_COUNT; + + // if (OSAL_RESULT_TRUE != OSAL_MUTEX_Lock(&s_spiLock, OSAL_WAIT_FOREVER)) + // return M2M_ERR_BUS_FAIL; + + //Workaround hardware problem with single byte transfers over SPI bus + if (u16Sz == 1) + u16Sz = 2; + + while(retry--) + { + if (spi_write_block(u32Addr, puBuf, u16Sz) == N_OK) + { + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_SUCCESS; + } + + M2M_ERR("Reset and retry %d %" PRIx32 " %d\r\n", retry, u32Addr, u16Sz); + spi_reset(); + } + + // OSAL_MUTEX_Unlock(&s_spiLock); + + return M2M_ERR_BUS_FAIL; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h b/ChaloupeLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h new file mode 100644 index 0000000..8ca7251 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/include/m2m_socket_host_if.h @@ -0,0 +1,347 @@ +/******************************************************************************* + BSD compatible socket interface internal types. + + File Name: + m2m_socket_host_if.h + + Summary: + + Description: + +*******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#ifndef __M2M_SOCKET_HOST_IF_H__ +#define __M2M_SOCKET_HOST_IF_H__ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "socket.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define SSL_MAX_OPT_LEN HOSTNAME_MAX_SIZE + +#define ALPN_LIST_MIN_SIZE 4 +#define ALPN_LIST_MAX_SIZE 32 +/*!< + Maximum length of ALPN list that can be specified by the application. + The list is in the following format: + @verbatim + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + @endverbatim +*/ + +#define SOCKET_CMD_INVALID 0x00 +/*!< + Invalid Socket command value. +*/ + +#define PING_ERR_SUCCESS 0 +#define PING_ERR_DEST_UNREACH 1 +#define PING_ERR_TIMEOUT 2 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + uint16_t u16Family; + uint16_t u16Port; + uint32_t u32IPAddr; +} tstrSockAddr; + + +//typedef int8_t SOCKET; +typedef tstrSockAddr tstrUIPSockAddr; + + + +/*! +@struct \ + tstrDnsReply + +@brief + DNS Reply, contains hostName and HostIP. +*/ +typedef struct { + char acHostName[HOSTNAME_MAX_SIZE]; + uint32_t u32HostIP; +} tstrDnsReply; + + +/*! +@brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrBindCmd; + + +/*! +@brief +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrBindReply; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8BackLog; + uint16_t u16SessionID; +} tstrListenCmd; + + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type + in a response to a user call to the recv or recvfrom. + If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is + delivered to the user in a number of consecutive chunks according to the USER Buffer size. +*/ +typedef struct { + SOCKET sock; + int8_t s8Status; + uint16_t u16SessionID; +} tstrListenReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sListenSock; + SOCKET sConnectedSock; + uint16_t u16Void; +} tstrAcceptReply; + + +/*! +* @brief +*/ +typedef struct { + tstrSockAddr strAddr; + SOCKET sock; + uint8_t u8SslFlags; + uint16_t u16SessionID; +} tstrConnectCmd; + + +/*! +@struct \ + tstrConnectReply + +@brief + Connect Reply, contains sock number and error value +*/ +typedef struct { + SOCKET sock; + int8_t s8Error; + /*!< + 0 for successful connection, in which case u16AppDataOffset is valid. + Negative for failed connection, in which case u8ErrorType and u8ErrorDetail may give more info. + */ + union { + uint16_t u16AppDataOffset; + /*!< + In further packet send requests the host interface should put the user application + data at this offset in the allocated shared data packet. + */ + struct { + uint8_t u8ErrSource; + /*!< + 0: No detail + 1: TLS Alert received from peer + 2: TLS Alert generated locally + */ + uint8_t u8ErrCode; + /*!< + For TLS Alerts, this is the Alert ID. + */ + }; + }; +} tstrConnectReply; + + +/*! +@struct \ + tstrConnectAlpnReply + +@brief + Connect Reply, contains sock number, error value and index of negotiated application protocol. +*/ +typedef struct{ + tstrConnectReply strConnReply; + uint8_t u8AppProtocolIdx; + /*!< + 1-based index of application-layer protocol negotiated during TLS handshake. + */ + uint8_t __PAD24__[3]; +}tstrConnectAlpnReply; + + +/*! +@brief +*/ +typedef struct{ + SOCKET sock; + uint8_t u8Void; + uint16_t u16DataSize; + tstrSockAddr strAddr; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendCmd; + + +/*! +@struct \ + tstrSendReply + +@brief + Send Reply, contains socket number and number of sent bytes. +*/ +typedef struct { + SOCKET sock; + uint8_t u8Void; + int16_t s16SentBytes; + uint16_t u16SessionID; + uint16_t u16Void; +} tstrSendReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32Timeoutmsec; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; + uint16_t u16BufLen; +} tstrRecvCmd; + + +/*! +@struct \ + tstrRecvReply +@brief +*/ +typedef struct { + tstrSockAddr strRemoteAddr; + int16_t s16RecvStatus; + uint16_t u16DataOffset; + SOCKET sock; + uint8_t u8Void; + uint16_t u16SessionID; +} tstrRecvReply; + + +/*! +* @brief +*/ +typedef struct { + uint32_t u32OptionValue; + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; +} tstrSetSocketOptCmd; + + +typedef struct { + SOCKET sslSock; + uint8_t __PAD24__[3]; +} tstrSSLSocketCreateCmd; + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Option; + uint16_t u16SessionID; + uint32_t u32OptLen; + uint8_t au8OptVal[SSL_MAX_OPT_LEN]; +} tstrSSLSetSockOptCmd; + + +/*! +*/ +typedef struct { + uint32_t u32DestIPAddr; + uint32_t u32CmdPrivate; + uint16_t u16PingCount; + uint8_t u8TTL; + uint8_t __PAD8__; +} tstrPingCmd; + + +typedef struct { + uint32_t u32IPAddr; + uint32_t u32CmdPrivate; + uint32_t u32RTT; + uint16_t u16Success; + uint16_t u16Fail; + uint8_t u8ErrorCode; + uint8_t __PAD24__[3]; +} tstrPingReply; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __M2M_SOCKET_HOST_IF_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/include/netinet_in.h b/ChaloupeLora.X/Source/winc3400_142/socket/include/netinet_in.h new file mode 100644 index 0000000..b4b4e2f --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/include/netinet_in.h @@ -0,0 +1,95 @@ +/******************************************************************************* + Company: + Microchip Technology Inc. + + File Name: + netinet_in.h + + Summary: + + Description: + *******************************************************************************/ + +// DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +// DOM-IGNORE-END + +#ifndef _NETINET_IN_H +#define _NETINET_IN_H + +#include +#include + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus // Provide C++ Compatibility + extern "C" { +#endif +// DOM-IGNORE-END + +typedef uint32_t in_addr_t; + +struct in_addr { + /*!< + Network Byte Order representation of the IPv4 address. For example, + the address "192.168.0.10" is represented as 0x0A00A8C0. + */ + in_addr_t s_addr; +}; + +struct sockaddr_in{ + uint16_t sin_family; + /*!< + Specifies the address family(AF). + Members of AF_INET address family are IPv4 addresses. + Hence,the only supported value for this is AF_INET. + */ + uint16_t sin_port; + /*!< + Port number of the socket. + Network sockets are identified by a pair of IP addresses and port number. + Must be set in the Network Byte Order format , @ref _htons (e.g. _htons(80)). + Can NOT have zero value. + */ + struct in_addr sin_addr; + /*!< + IP Address of the socket. + The IP address is of type @ref in_addr structure. + Can be set to "0" to accept any IP address for server operation. + */ + uint8_t sin_zero[8]; + /*!< + Padding to make structure the same size as @ref sockaddr. + */ +}; + +const char *inet_ntop(int af, const void *src, char *dst, size_t size); +in_addr_t inet_addr(const char *cp); + +// DOM-IGNORE-BEGIN +#ifdef __cplusplus +} +#endif +// DOM-IGNORE-END + +#endif /* _NETINET_IN_H */ diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/include/socket.h b/ChaloupeLora.X/Source/winc3400_142/socket/include/socket.h new file mode 100644 index 0000000..38d97bc --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/include/socket.h @@ -0,0 +1,2074 @@ +/******************************************************************************* + File Name: + socket.h + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ +//DOM-IGNORE-END + +#ifndef __SOCKET_H__ +#define __SOCKET_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup SOCKETAPI Socket + * BSD compatible socket interface between the host layer and the network + * protocol stacks in the firmware. + * These functions are used by the host application to send or receive + * packets and to do other socket operations. + */ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "m2m_types.h" +#include "netinet_in.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SOCKETDEF Defines + * @ingroup SOCKETAPI + * The following list of macros are used to define constants used throughout the socket layer, and SSL Socket options. + */ + +/**@defgroup IPDefines TCP/IP Defines + * @ingroup SOCKETDEF + * The following list of macros are used to define constants used throughout the socket layer. + * @{ + */ +/* + * HOSTNAME_MAX_SIZE is defined here and also in host_drv/socket/include/m2m_socket_host_if.h + * The two definitions must match. +*/ +#define HOSTNAME_MAX_SIZE 100 +/*!< + Maximum allowed size for a host domain name passed to the function @ref gethostbyname. + command value. Used with the @ref setsockopt function. +*/ + +#define SOCKET_BUFFER_MAX_LENGTH 1400 +/*!< + Maximum allowed size for a socket data buffer. Used with @ref send socket + function to ensure that the buffer sent is within the allowed range. +*/ + +#define AF_INET 2 +/*!< + The AF_INET is the address family used for IPv4. An IPv4 transport address is specified with the @ref sockaddr_in structure. + (It is the only supported type for the current implementation.) +*/ + +#define SOCK_STREAM 1 +/*!< + One of the IPv4 supported socket types for reliable connection-oriented stream connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_DGRAM 2 +/*!< + One of the IPv4 supported socket types for unreliable connectionless datagram connection. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCK_RAW 3 +/*!< + Socket type used for sending and receiving raw frames. + Raw socket expects and returns IP header. + Please note that SO_BROADCAST socket option is not currently supported when using RAW socket. + Similarly to SOCK_DGRAM it is oriented towards unreliable connectionless communication. + Passed to the @ref socket function for the socket creation operation. +*/ + +#define SOCKET_FLAGS_SSL 0x01 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_SSL_ON instead. +*/ + +#define SOCKET_FLAGS_IPPROTO_RAW 0x02 +/*!< + This flag may be set in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_RAW), to allow the Application to use a + socket of type raw to send/receive frames.\n + This flag is kept for legacy purposes. It is recommended that applications + use @ref SOCKET_CONFIG_IPPROTO_RAW instead. +*/ + +#define SOCKET_CONFIG_DEFAULT 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket to create + a socket with default configuration. +*/ + +#define SOCKET_CONFIG_SSL_OFF 0 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a socket not capable of + TLS. +*/ +#define SOCKET_CONFIG_SSL_ON 1 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TLS socket.\n + Note that the number of TLS sockets is limited to 2. +*/ +#define SOCKET_CONFIG_SSL_DELAY 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the + u8Type parameter is @ref SOCK_STREAM), to create a TCP socket which has the + potential to upgrade to a TLS socket later (by calling @ref secure).\n + Note that the total number of TLS sockets and potential TLS sockets is + limited to 2. +*/ + +#define SOCKET_CONFIG_IPPROTO_RAW 2 +/*!< + This value may be passed in the u8Config parameter of @ref socket (when the u8Type parameter is + @ref SOCK_RAW), to allow the Application to use a socket of type raw to send/receive frames. + This assumes that the application will fill the IP and protocol (UDP, TCP, ICMP) headers. + Typically, when sending ICMP frames via RAW socket, there are two options that can be used: + - IPPROTO_RAW - Raw IP packets, implies that IP_HDRINCL is enabled and therefore + the host application should fill in the corresponding protocol header checksum. + - IPPROTO_ICMP - ICMP packets, the WINC would fill in the ICMP header checksum (not supported). + @warning + Please note that only SOCKET_CONFIG_IPPROTO_RAW is currently supported. + Raw sockets can be used to send TCP/UDP/ICMP packets, however, the current implementation only + supports receiving Raw ICMP frames, which also requires @ref SO_ICMP_FILTER to be set appropriately. +*/ + +#define TCP_SOCK_MAX (7) +/*!< + Maximum number of simultaneous TCP sockets. +*/ + +#define UDP_SOCK_MAX 4 +/*!< + Maximum number of simultaneous UDP sockets. +*/ + +#define RAW_SOCK_MAX 1 +/*!< + Maximum number of simultaneous RAW sockets. +*/ + +#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX + RAW_SOCK_MAX) +/*!< + Maximum number of simultaneous sockets. +*/ + +#define SOL_SOCKET 1 +/*!< + Socket option. + Used with the @ref setsockopt function +*/ + +#define SOL_SSL_SOCKET 2 +/*!< + SSL Socket option level. + Used with the @ref setsockopt function +*/ + +#define SOL_RAW 255 +/*!< + Raw Socket option level. + Used with the @ref setsockopt function +*/ + +#define SO_SET_UDP_SEND_CALLBACK 0x00 +/*!< + Socket option used by the application to enable/disable + the use of UDP send callbacks.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable UDP send callbacks.\n + 1: enable UDP send callbacks.\n + Default setting is enable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define IP_ADD_MEMBERSHIP 0x01 +/*!< + Set Socket Option Add Membership command value. + Used with the @ref setsockopt function. +*/ + +#define IP_DROP_MEMBERSHIP 0x02 +/*!< + Set Socket Option Drop Membership command value. + Used with the @ref setsockopt function. +*/ + +#define SO_TCP_KEEPALIVE 0x04 +/*!< + Socket option to enable or disable TCP keep-alive.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + 0: disable TCP keep-alive.\n + 1: enable TCP keep-alive.\n + Default setting is disable. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPIDLE 0x05 +/*!< + Socket option to set the time period after which the socket will trigger keep-alive transmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 2^32 - 1. + Default setting is 120 (60 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPINTVL 0x06 +/*!< + Socket option to set the time period between keep-alive retransmissions.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Option value is the time period in units of 500ms. Maximum 255. + Default setting is 1 (0.5 seconds). + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_TCP_KEEPCNT 0x07 +/*!< + Socket option to set the number of keep-alive retransmissions to be carried out before declaring that the remote end is not available.\n + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Maximum 255. + Default setting is 20. + + @warning @ref connect and @ref bind cause this setting to + be lost, so the application should only set this option + after calling @ref connect or @ref bind. +*/ + +#define SO_ICMP_FILTER 0x01 +/*!< + Socket option to set the ICMP filter for raw sockets when receiving.\n + Current implementation allows for a filter none (0) or filter all (anything else). + Filter none means that all ICMP frames will be delivered to the host via raw socket. + Filter all means that all ICMP frames will NOT be delivered to host and handled internally by the WINC (please note that fragmentation is not supported by the WINC). + Used with the @ref setsockopt function.\n + The option value should be cast to int type.\n + Default setting is 0 (filter none). + + @warning @ref bind and @ref shutdown will cause this setting to be lost, + so the application should only set this option after @ref bind. +*/ + +#define RAW_SOCK_ID (TCP_SOCK_MAX + UDP_SOCK_MAX) +/*!< + Socket number to be used for RAW socket. +*/ + +/**@}*/ //IPDefines + + +/**@addtogroup TLSDefines + * @{ + */ +#define ALPN_LIST_MAX_APP_LENGTH 30 +/*!< + Maximum length of ALPN list that can be specified by the application. + This length includes separators (spaces) and terminator (NUL). +*/ +/**@}*/ // TLSDefines + +/** + * @defgroup TLSDefines TLS Defines + * @ingroup SOCKETDEF + * @ingroup SSLAPI +*/ + +/**@defgroup SSLSocketOptions TLS Socket Options + * @ingroup TLSDefines + * The following list of macros are used to define SSL Socket options. + * @{ + * @sa setsockopt + */ + +#define SO_SSL_BYPASS_X509_VERIF 0x01 +/*!< + Allow an opened SSL socket to bypass the X509 certificate verification + process. + It is recommended NOT to use this socket option in production software + applications. It is supported for debugging and testing purposes.\n + The option value should be casted to int type.\n + 0: do not bypass the X509 certificate verification process (default, + recommended).\n + 1: bypass the X509 certificate verification process.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_SNI 0x02 +/*!< + Set the Server Name Indicator (SNI) for an SSL socket. The SNI is a NULL- + terminated string containing the server name associated with the + connection. Its size must not exceed @ref HOSTNAME_MAX_SIZE. If the SNI is + not a null string, then TLS Client Hello messages will include the SNI + extension.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_SESSION_CACHING 0x03 +/*!< + This option allow the TLS to cache the session information for fast TLS + session establishment in future connections using the TLS Protocol session + resume features.\n + The option value should be casted to int type.\n + 0: disable TLS session caching (default).\n + 1: enable TLS session caching.\n + Note that TLS session caching is always enabled in TLS Server Mode and this + option is ignored.\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ENABLE_CERTNAME_VALIDATION 0x04 +/*!< + Enable internal validation of server name against the server's + certificate subject common name. If there is no server name + provided (via the @ref SO_SSL_SNI option), setting this option + does nothing.\n + The option value should be casted to int type.\n + 0: disable server certificate name validation (default).\n + 1: enable server certificate name validation (recommended).\n + + This option only takes effect if it is set after calling @ref socket and + before calling @ref connect or @ref secure. +*/ + +#define SO_SSL_ALPN 0x05 +/*!< + Set the list to use for Application-Layer Protocol Negotiation + for an SSL socket.\n + This option is intended for internal use and should not be + used by the application. Applications should use the API @ref + set_alpn_list. +*/ + +#define SO_SSL_ENABLE_SNI_VALIDATION 0x04 +/*!< + Legacy name for @ref SO_SSL_ENABLE_CERTNAME_VALIDATION.\n +*/ +/**@}*/ //SSLSocketOptions + +/**@defgroup SSLCipherSuiteID TLS Cipher Suite IDs + * @ingroup TLSDefines + * The following list of macros defined the list of supported TLS Cipher suites. + * Each MACRO defines a single Cipher suite. + * @sa m2m_ssl_set_active_ciphersuites + * @{ + */ + +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA NBIT0 +#define SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 NBIT1 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA NBIT2 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 NBIT3 +#define SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 NBIT4 +#define SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 NBIT5 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA NBIT6 +#define SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 NBIT7 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA NBIT8 +#define SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 NBIT9 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA NBIT10 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA NBIT11 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256 NBIT12 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 NBIT13 +#define SSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256 NBIT14 +#define SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 NBIT15 + +#define SSL_ECC_ONLY_CIPHERS \ +(\ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 \ +) +/*!< + All supported ciphers which use ECDSA. +*/ + +#define SSL_DEFAULT_CIPHERS \ +(\ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_CBC_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_128_GCM_SHA256 | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_RSA_WITH_AES_256_CBC_SHA256 | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA | \ + SSL_CIPHER_DHE_RSA_WITH_AES_256_CBC_SHA256 \ +) +/*!< + All supported Non-ECC Ciphers. This is the default active group after startup. + Note that firmware may support only a subset of these. +*/ +/**@}*/ // SSLCipherSuiteID + +/**@defgroup SOCKETBYTEORDER Byte Order + * @ingroup SOCKETAPI + * The following list of macros are used to convert between host representation and network byte order. + * @{ + */ + +#ifdef _NM_BSP_BIG_END +#define _htonl(m) (m) +/*!< + Convert a 4-byte integer from the Host representation to Network byte order (Host is BE). +*/ +#define _htons(A) (A) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is BE). +*/ +#else +#define _htonl(m) \ + (uint32_t)(((uint32_t)(m << 24)) | ((uint32_t)((m & 0x0000FF00) << 8)) | ((uint32_t)((m & 0x00FF0000) >> 8)) | ((uint32_t)(((uint32_t)m) >> 24))) +/*!< + Convert a 4-byte integer from Host representation to Network byte order (Host is LE). +*/ + +#define _htons(A) (uint16_t)((((uint16_t) (A)) << 8) | (((uint16_t) (A)) >> 8)) +/*!< + Convert a 2-byte integer (short) from Host representation to Network byte order (Host is LE). +*/ +#endif + + +#define _ntohl _htonl +/*!< + Convert a 4-byte integer from Network byte order to Host representation. +*/ + + +#define _ntohs _htons +/*!< + Convert a 2-byte integer from Network byte order to Host representation. +*/ +/**@}*/ // SOCKETBYTEORDER + +/************** +Socket Errors +**************/ +/**@defgroup SocketErrorCode Error Codes + * @ingroup SOCKETAPI + * The following list of macros are used to define the possible error codes. + * Errors are listed in numerical order with the error macro name. + * @{ + */ +#define SOCK_ERR_NO_ERROR 0 +/*!< + Successful socket operation. This code is also used with event @ref SOCKET_MSG_RECV if a socket connection is closed. + In that case, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_INVALID_ADDRESS -1 +/*!< + Socket address is invalid. The socket operation cannot be completed successfully without specifying a valid address + For example: bind is called without specifying a port number +*/ + +#define SOCK_ERR_ADDR_ALREADY_IN_USE -2 +/*!< + Socket operation cannot bind on the given address. Only one IP address per socket, and one socket per IP address is permitted - + any attempt for a new socket to bind with an IP address already bound to another open socket will return the following error code. +*/ + +#define SOCK_ERR_MAX_TCP_SOCK -3 +/*!< + Exceeded the maximum number of TCP sockets. A maximum number of TCP sockets opened simultaneously is defined through TCP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed. +*/ + +#define SOCK_ERR_MAX_UDP_SOCK -4 +/*!< + Exceeded the maximum number of UDP sockets. A maximum number of UDP sockets opened simultaneously is defined through UDP_SOCK_MAX. + It is not permitted to exceed that number at socket creation. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_INVALID_ARG -6 +/*!< + An invalid argument is passed to a socket function. Identifies that @ref socket operation failed +*/ + +#define SOCK_ERR_MAX_LISTEN_SOCK -7 +/*!< + Exceeded the maximum number of TCP passive listening sockets. + Identifies that @ref listen operation failed. +*/ + +#define SOCK_ERR_INVALID -9 +/*!< + The requested socket operation is not valid in the current socket state. + For example: @ref accept is called on a TCP socket before @ref bind or @ref listen. +*/ + +#define SOCK_ERR_ADDR_IS_REQUIRED -11 +/*!< + Destination address is required. Failure to provide the socket address required for the socket operation to be completed. + The @ref sendto function requires a destination address to send data. +*/ + +#define SOCK_ERR_CONN_ABORTED -12 +/*!< + The socket is closed (reset) by the peer. If this error is received, the application should call @ref shutdown(). +*/ + +#define SOCK_ERR_TIMEOUT -13 +/*!< + The socket pending operation has timed out. The socket remains open. +*/ + +#define SOCK_ERR_BUFFER_FULL -14 +/*!< + No buffer space available to be used for the requested socket operation. +*/ +/**@}*/ // SocketErrorCode + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +/** @defgroup SocketEnums Enumeration/Typedefs + * @ingroup SOCKETAPI + * Specific Enumeration-typedefs used for socket operations + * @{ + */ +/*! +@typedef \ + SOCKET + +@brief + Definition for socket handler data type. + Socket ID,used with all socket operations to uniquely identify the socket handler. + The ID is uniquely assigned at socket creation when calling @ref socket operation. +*/ +typedef int8_t SOCKET; + +/*! +@enum \ + tenuSockErrSource + +@brief + Source of socket error (local, remote or unknown). + +@see tstrSockErr +*/ + +typedef enum { + SOCKET_ERR_UNKNOWN = 0, + /*!< + No detail available (also used when there is no error). + */ + SOCKET_ERR_TLS_REMOTE, + /*!< + TLS Error Alert received from peer. + */ + SOCKET_ERR_TLS_LOCAL + /*!< + TLS Error Alert generated locally. + */ +} tenuSockErrSource; + +/*! +@struct \ + sockaddr + +@brief + Generic socket address structure. + +@see + sockaddr_in +*/ +struct sockaddr { + uint16_t sa_family; + /*!< + Socket address family. + */ + uint8_t sa_data[14]; + /*!< + Maximum size of all the different socket address structures. + */ +}; + +/*! +@struct \ + tstrSockErr + +@brief + Detail about socket failures. Used with @ref get_error_detail. +*/ +typedef struct { + tenuSockErrSource enuErrSource; + /*!< + Source of socket error (local, remote or unknown). + */ + uint8_t u8ErrCode; + /*!< + TLS Alert code as defined in + https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-6. + */ +} tstrSockErr; +/**@}*/ //SocketEnums + +/**@defgroup AsyncCallback Asynchronous Events + * @ingroup SocketEnums + * Specific Enumeration used for asynchronous operations + * @{ */ +/*! +@enum \ + tenuSocketCallbackMsgType + +@brief + Asynchronous APIs make use of callback functions in-order to return back the results once the corresponding socket operation is completed. + Hence resuming the normal execution of the application code while the socket operation returns the results. + Callback functions expect event messages to be passed in, in-order to identify the operation they're returning the results for. + The following enum identifies the type of events that are received in the callback function. + + Application Use: + In order for application developers to handle the pending events from the network controller through the callback functions, + a function call must be made to the function @ref m2m_wifi_handle_events at least once for each socket operation. + +@see bind +@see listen +@see accept +@see connect +@see send +@see recv +*/ + +typedef enum { + SOCKET_MSG_BIND = 1, + /*!< + Bind socket event. + */ + SOCKET_MSG_LISTEN, + /*!< + Listen socket event. + */ + SOCKET_MSG_DNS_RESOLVE, + /*!< + DNS Resolution event. + */ + SOCKET_MSG_ACCEPT, + /*!< + Accept socket event. + */ + SOCKET_MSG_CONNECT, + /*!< + Connect socket event. + */ + SOCKET_MSG_RECV, + /*!< + Receive socket event. + */ + SOCKET_MSG_SEND, + /*!< + Send socket event. + */ + SOCKET_MSG_SENDTO, + /*!< + Sendto socket event. + */ + SOCKET_MSG_RECVFROM, + /*!< + Recvfrom socket event. + */ + SOCKET_MSG_SECURE +/*!< + Existing socket made secure event. +*/ +} tenuSocketCallbackMsgType; + +/*! +@struct \ + tstrSocketBindMsg + +@brief Socket bind status. + + An asynchronous call to the @ref bind socket operation, returns information through this structure in response. + This structure together with the event @ref SOCKET_MSG_BIND are passed in parameters to the callback function. +@see + bind +*/ +typedef struct { + int8_t status; + /*!< + The result of the bind operation. + Holding a value of ZERO for a successful bind or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketBindMsg; + +/*! +@struct \ + tstrSocketListenMsg + +@brief Socket listen status. + + Socket listen information is returned through this structure in response to the asynchronous call to the @ref listen function. + This structure together with the event @ref SOCKET_MSG_LISTEN are passed-in parameters to the callback function. +@see + listen +*/ +typedef struct { + int8_t status; + /*!< + Holding a value of ZERO for a successful listen or otherwise a negative + error code corresponding to @ref SocketErrorCode. + */ +} tstrSocketListenMsg; + +/*! +@struct \ + tstrSocketAcceptMsg + +@brief Socket accept status. + + Socket accept information is returned through this structure in response to the asynchronous call to the @ref accept function. + This structure together with the event @ref SOCKET_MSG_ACCEPT are passed-in parameters to the callback function. +*/ +typedef struct { + SOCKET sock; + /*!< + On a successful @ref accept operation, the return information is the socket ID for the accepted connection with the remote peer. + Otherwise a negative error code is returned to indicate failure of the accept operation. + */ + struct sockaddr_in strAddr; + /*!< + Socket address structure for the remote peer. + */ +} tstrSocketAcceptMsg; + +/*! +@struct \ + tstrSocketConnectMsg + +@brief Socket connect status. + + Socket connect information is returned through this structure in response to an asynchronous call to the @ref connect socket function + or the @ref secure socket function. + This structure and the event @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_SECURE are passed in parameters to the callback function. + If the application receives this structure with a negative value in s8Error, the application should call @ref close(). +*/ +typedef struct { + SOCKET sock; + /*!< + Socket ID referring to the socket passed to the @ref connect or @ref secure function call. + */ + int8_t s8Error; + /*!< + Connect error code:\n + - ZERO for a successful connect or successful secure. \n + - Otherwise a negative error code corresponding to the type of error. + */ +} tstrSocketConnectMsg; + +/*! +@struct \ + tstrSocketRecvMsg + +@brief Socket recv status. + + Socket receive information is returned through this structure in response to the asynchronous call to the @ref recv or @ref recvfrom socket functions. + This structure, together with the events @ref SOCKET_MSG_RECV or @ref SOCKET_MSG_RECVFROM, is passed-in parameters to the callback function. +@remark + After receiving this structure, the application should issue a new call to @ref recv or @ref recvfrom in order to receive subsequent data. + In the case of @ref SOCKET_MSG_RECVFROM (UDP), any further data in the same datagram is dropped, then subsequent datagrams are buffered on the WINC until the application provides a buffer via a new call to @ref recvfrom. + In the case of @ref SOCKET_MSG_RECV (TCP), all subsequent data is buffered on the WINC until the application provides a buffer via a new call to @ref recv. + A negative or zero buffer size indicates an error with the following code: + @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. +*/ +typedef struct { + uint8_t *pu8Buffer; + /*!< + Pointer to the USER buffer (passed to @ref recv and @ref recvfrom function) containing the received data chunk. + */ + int16_t s16BufferSize; + /*!< + The received data chunk size. + Holds a negative value if there is a receive error or ZERO on success upon reception of close socket message. + */ + uint16_t u16RemainingSize; + /*!< + This field is used internally by the driver. In normal operation, this field will be 0 when the application receives this structure. + */ + struct sockaddr_in strRemoteAddr; + /*!< + Socket address structure for the remote peer. It is valid for @ref SOCKET_MSG_RECVFROM event. + */ +} tstrSocketRecvMsg; +/**@}*/ // AsyncCallback + +/**@defgroup SocketCallbacks Callbacks + * @ingroup SOCKETAPI + * @{ + */ +/*! +@typedef \ + tpfAppSocketCb + +@brief + The main socket application callback function. Applications register their main socket application callback through this function by calling @ref registerSocketCallback. + In response to events received, the following callback function is called to handle the corresponding asynchronous function called. Example: @ref bind, @ref connect,...etc. + +@param [in] sock + Socket ID for the callback. + + The socket callback function is called whenever a new event is received in response + to socket operations. + +@param [in] u8Msg + Socket event type. Possible values are: + - @ref SOCKET_MSG_BIND + - @ref SOCKET_MSG_LISTEN + - @ref SOCKET_MSG_ACCEPT + - @ref SOCKET_MSG_CONNECT + - @ref SOCKET_MSG_RECV + - @ref SOCKET_MSG_SEND + - @ref SOCKET_MSG_SENDTO + - @ref SOCKET_MSG_RECVFROM + - @ref SOCKET_MSG_SECURE + +@param [in] pvMsg + Pointer to message structure. Existing types are: + - tstrSocketBindMsg + - tstrSocketListenMsg + - tstrSocketAcceptMsg + - tstrSocketConnectMsg + - tstrSocketRecvMsg + +@see + tenuSocketCallbackMsgType + tstrSocketRecvMsg + tstrSocketConnectMsg + tstrSocketAcceptMsg + tstrSocketListenMsg + tstrSocketBindMsg +*/ +typedef void (*tpfAppSocketCb)(SOCKET sock, uint8_t u8Msg, void *pvMsg); + +/*! +@typedef \ + tpfAppResolveCb + +@brief + DNS resolution callback function. + Applications requiring DNS resolution should register their callback through this function by calling @ref registerSocketCallback. + The following callback is triggered in response to an asynchronous call to the @ref gethostbyname function (DNS Resolution callback). + +@param [in] pu8DomainName + Domain name of the host. + +@param [in] u32ServerIP + Server IPv4 address encoded in Network byte order format. If it is Zero, then the DNS resolution failed. +*/ +typedef void (*tpfAppResolveCb)(uint8_t *pu8DomainName, uint32_t u32ServerIP); + +/*! +@typedef \ + tpfPingCb + +@brief PING Callback + + The function delivers the ping statistics for the sent ping triggered by calling + @ref m2m_ping_req. + +@param [in] u32IPAddr + Destination IP. + +@param [in] u32RTT + Round Trip Time. + +@param [in] u8ErrorCode + Ping error code. It may be one of: + - PING_ERR_SUCCESS + - PING_ERR_DEST_UNREACH + - PING_ERR_TIMEOUT +*/ +typedef void (*tpfPingCb)(uint32_t u32IPAddr, uint32_t u32RTT, uint8_t u8ErrorCode); +/**@}*/ //SocketCallbacks + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +FUNCTION PROTOTYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +/**@defgroup SocketAPI Functions + * @ingroup SOCKETAPI + * The function performs the necessary initializations for the socket library through the following steps: + * - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + * in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + * - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + * - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + * This facilitates handling all of the socket related functions received through interrupts from the firmware. + * @{ + */ +/*! + * @fn void socketInit(void); + The function performs the necessary initialization for the socket library through the following steps: + - A check made by the global variable gbSocketInit, ensuring that initialization for sockets is performed only once, + in-order to prevent resetting the socket instances already created in the global socket array (gastrSockets). + - Zero initializations to the global socket array (gastrSockets), which holds the list of TCP sockets. + - Registers the socket (Host Interface)hif callback function through the call to the hif_register_cb function. + This facilitates handling all of the socket related functions received through interrupts from the firmware. + +@return void + +@remarks + This initialization function must be invoked before any socket operation is performed. + No error codes from this initialization function since the socket array is statically allocated based on the maximum number of + sockets @ref MAX_SOCKET which is tuned to the systems capability. +\section SocketExample1 Example +This example demonstrates the use of the socketInit for socket initialization for an mqtt chat application. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + char topic[strlen(MAIN_CHAT_TOPIC) + MAIN_CHAT_USER_NAME_SIZE + 1]; + + //Initialize the board. + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + ---------- + + // Initialize socket interface. + socketInit(); + registerSocketCallback(socket_event_handler, socket_resolve_handler); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +void socketInit(void); + +/*! +@fn \ + void socketDeinit(void); + +@brief Socket Layer De-initialization + + The function performs the necessary cleanup for the socket library static data + It must be invoked only after all desired socket operations have been performed on any active sockets. +*/ +void socketDeinit(void); + +/*! +@fn \ + uint8_t IsSocketReady(void); + +@see socketInit + socketDeinit +@return If the socket has been initialized and is ready. + Should return 1 after @ref socketInit and 0 after @ref socketDeinit +*/ +uint8_t IsSocketReady(void); + +/*! +@fn \ + void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); + Register two callback functions one for asynchronous socket events and the other one for DNS callback registering function. + The registered callback functions are used to retrieve information in response to the asynchronous socket functions called. +@param [in] socket_cb + Assignment of callback function to the global callback @ref tpfAppSocketCb gpfAppSocketCb. Delivers + socket messages to the host application. In response to the asynchronous function calls, such as @ref bind + @ref listen @ref accept @ref connect + +@param [in] resolve_cb + Assignment of callback function to the global callback @ref tpfAppResolveCb gpfAppResolveCb. + Used for DNS resolving functionality. The DNS resolving technique is determined by the application + registering the callback. + NULL is assigned when DNS resolution is not required. + +@return void +@remarks + If any of the socket functionality is not to be used, NULL is passed in as a parameter. + It must be invoked after @ref socketInit and before other socket layer operations. + +\section SocketExample2 Example + This example demonstrates the use of the registerSocketCallback to register a socket callback function with DNS resolution CB set to null + for a simple UDP server example. + \code + tstrWifiInitParam param; + tstrNetworkId strNetworkId; + tstrAuthPsk strAuthPsk; + int8_t ret; + struct sockaddr_in addr; + + // Initialize the board + system_init(); + + //Initialize the UART console. + configure_console(); + + // Initialize the BSP. + nm_bsp_init(); + + // Initialize socket address structure. + addr.sin_family = AF_INET; + addr.sin_port = _htons(MAIN_WIFI_M2M_SERVER_PORT); + addr.sin_addr.s_addr = _htonl(MAIN_WIFI_M2M_SERVER_IP); + + // Initialize Wi-Fi parameters structure. + memset((uint8_t *)¶m, 0, sizeof(tstrWifiInitParam)); + + // Initialize Wi-Fi driver with data and status callbacks. + param.pfAppWifiCb = wifi_cb; + ret = m2m_wifi_init(¶m); + if (M2M_SUCCESS != ret) { + printf("main: m2m_wifi_init call error!(%d)\r\n", ret); + while (1) { + } + } + + // Initialize socket module + socketInit(); + registerSocketCallback(socket_cb, NULL); + + // Connect to router. + strNetworkId.pu8Bssid = NULL; + strNetworkId.pu8Ssid = MAIN_WLAN_SSID; + strNetworkId.u8SsidLen = sizeof(MAIN_WLAN_SSID); + strNetworkId.u8Channel = M2M_WIFI_CH_ALL; + + strAuthPsk.pu8Psk = NULL; + strAuthPsk.pu8Passphrase = MAIN_WLAN_PSK; + strAuthPsk.u8PassphraseLen = (uint8_t)strlen((char*)MAIN_WLAN_PSK); + + m2m_wifi_connect_psk(WIFI_CRED_SAVE_ENCRYPTED, &strNetworkId, &strAuthPsk); +\endcode +*/ +//void registerSocketCallback(tpfAppSocketCb socket_cb, tpfAppResolveCb resolve_cb); +void registerSocketEventCallback(tpfAppSocketCb socket_cb); +void registerSocketResolveCallback(tpfAppResolveCb resolve_cb); + +/*! +@fn \ + SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); + Synchronous socket allocation function based on the specified socket type. Created sockets are non-blocking and their possible types are either TCP or a UDP sockets. + The maximum allowed number of TCP sockets is @ref TCP_SOCK_MAX sockets while the maximum number of UDP sockets that can be created simultaneously is @ref UDP_SOCK_MAX sockets. + +@param [in] u16Domain + Socket family. The only allowed value is AF_INET (IPv4.0) for TCP/UDP sockets. + +@param [in] u8Type + Socket type. Allowed values are: + - [SOCK_STREAM](@ref SOCK_STREAM) + - [SOCK_DGRAM](@ref SOCK_DGRAM) + - [SOCK_RAW](@ref SOCK_RAW) + +@param[in] u8Config + Used to specify the socket configuration. The interpretation of + this parameter depends on the setting of u8Type.\n + - When u8Type is [SOCK_STREAM](@ref SOCK_STREAM) the following configuration values + are defined:\n + - [SOCKET_CONFIG_SSL_OFF](@ref SOCKET_CONFIG_SSL_OFF): The socket is not secured by + TLS.\n + - [SOCKET_CONFIG_SSL_ON](@ref SOCKET_CONFIG_SSL_ON): The socket is secured by TLS.\n + - [SOCKET_CONFIG_SSL_DELAY](@ref SOCKET_CONFIG_SSL_DELAY): The socket is not secured + by TLS, but may be secured later, by calling @ref secure.\n + - When u8Type is [SOCK_RAW](@ref SOCK_RAW), the following configuration values + are defined:\n + - [SOCKET_CONFIG_IPPROTO_RAW](@ref SOCKET_CONFIG_IPPROTO_RAW): The socket is to be + used for raw ICMP frames.\n + - For all values of u8Type, the following configuration values + are defined:\n + - [SOCKET_CONFIG_DEFAULT](@ref SOCKET_CONFIG_DEFAULT): The default configuration.\n + All other configuration values are reserved and should not be + used. + +@pre + The @ref socketInit function must be called once at the beginning of the application to initialize the socket handler. + before any call to the @ref socket function can be made. + +@see + connect + secure + bind + listen + accept + recv + recvfrom + send + sendto + shutdown + setsockopt + getsockopt + +@return + On successful socket creation, a non-blocking socket type is created and a socket ID is returned + In case of failure the function returns a negative value, identifying one of the socket error codes defined. + For example: @ref SOCK_ERR_INVALID for invalid argument or + @ref SOCK_ERR_MAX_TCP_SOCK if the number of TCP allocated sockets exceeds the number of available sockets. + +@remarks + The socket function must be called before any other related socket functions "e.g. send, recv, shutdown ..etc" +\section SocketExample3 Example + This example demonstrates the use of the socket function to allocate the socket, returning the socket handler to be used for other +socket operations. Socket creation is dependent on the socket type. +\subsection sub1 UDP example +@code + SOCKET UdpServerSocket = -1; + + UdpServerSocket = socket(AF_INET, SOCK_DGRAM, SOCKET_CONFIG_DEFAULT); + +@endcode +\subsection sub2 TCP example +@code + static SOCKET tcp_client_socket = -1; + + tcp_client_socket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_DEFAULT)); +@endcode +*/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config); +/*! +\fn \ + int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Asynchronous bind function associates the provided address and local port to the socket. + The function can be used with both TCP and UDP sockets. It is mandatory to call the @ref bind function before starting any UDP or TCP server operation. + Upon socket bind completion, the application will receive a @ref SOCKET_MSG_BIND message in the socket callback. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Pointer to socket address structure "sockaddr_in" + [sockaddr_in](@ref sockaddr_in) + + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + +@pre + The socket function must be called to allocate a socket before passing the socket ID to the bind function. + +@see socket +@see connect +@see listen +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket bind failure. +\section SocketExample4 Example + This example demonstrates the call of the bind socket operation after a successful socket operation. +@code + struct sockaddr_in addr; + SOCKET udpServerSocket =-1; + int ret = -1; + + if(udpServerSocket == -1) + { + udpServerSocket = socket(AF_INET,SOCK_DGRAM,SOCKET_CONFIG_DEFAULT); + if(udpServerSocket >= 0) + { + addr.sin_family = AF_INET; + addr.sin_port = _htons(UDP_SERVER_PORT); + addr.sin_addr.s_addr = 0; + ret = bind(udpServerSocket,(struct sockaddr*)&addr,sizeof(addr)); + + if(ret == 0) + printf("Bind success!\n"); + else + { + printf("Bind Failed. Error code = %d\n",ret); + shutdown(udpServerSocket); + } + else + { + printf("UDP Server Socket Creation Failed\n"); + return; + } + } +@endcode +*/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t listen(SOCKET sock, uint8_t backlog); + + After successfully binding a socket to an IP address and port on the system, start listening passively for incoming connections. + The socket must be bound on a local port or the listen operation fails. + Upon the call to the asynchronous listen function, response is received through the event @ref SOCKET_MSG_LISTEN + in the socket callback. + + A successful listen means the TCP server operation is active. If a connection is accepted, then the application socket callback function is + notified with the new connected socket through the event @ref SOCKET_MSG_ACCEPT. Hence there is no need to call the @ref accept function + after calling @ref listen. + + After a connection is accepted, the user is then required to call @ref recv to receive any packets transmitted by the remote host or to receive notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] backlog + Not used by the current implementation. + +@pre + The bind function must be called to assign the port number and IP address to the socket before the listen operation. + +@see bind +@see accept +@see recv +@see recvfrom +@see send +@see sendto + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating invalid arguments were passed, such as negative socket ID. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket listen failure. +\section SocketExample5 Example +This example demonstrates the call of the listen socket operation after a successful socket operation. +@code + static void TCP_Socketcallback(SOCKET sock, uint8_t u8Msg, void * pvMsg) + { + int ret =-1; + + switch(u8Msg) + { + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + ret = listen(sock, 0); + + if(ret <0) + printf("Listen failure! Error = %d\n",ret); + } + else + { + M2M_ERR("bind Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_LISTEN: + { + + tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg; + if(pstrListen != NULL) + { + if(pstrListen->status == 0) + { + ret = accept(sock,NULL,0); + } + else + { + M2M_ERR("listen Failure!\n"); + shutdown(sock); + } + } + } + break; + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + TcpNotificationSocket = pstrAccept->sock; + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept failure\n"); + } + } + break; + + default: + break; + } + } + +@endcode +*/ +int8_t listen(SOCKET sock, uint8_t backlog); +/*! +@fn \ + int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); + The function has no current implementation. An empty declaration is used to prevent errors when legacy application code is used. + As it has no effect, it can be safely removed from any application using it. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. +@param [in] addr + Not used in the current implementation. + +@param [in] addrlen + Not used in the current implementation. + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID. +*/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen); +/*! +@fn \ + int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); + Establishes a TCP connection with a remote server. + The asynchronous connect function must be called after receiving a valid socket ID from the @ref socket function. + The application socket callback function is notified of the result of the connection attempt through the event @ref SOCKET_MSG_CONNECT, + along with a structure @ref tstrSocketConnectMsg. + If socket connection fails, the application should call @ref shutdown(). + A successful connect means the TCP session is active. The application is then required to make a call to the @ref recv function + to receive any packets transmitted by the remote server, unless the application is interrupted by a notification of socket connection + termination. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pstrAddr + Address of the remote server. + +@param [in] u8AddrLen + Size of the given socket address structure in bytes. + Not currently used, implemented for BSD compatibility only. +@pre + The socket function must be called to allocate a TCP socket before passing the socket ID to the bind function. + If the socket is not bound, you do NOT have to call bind before the "connect" function. + +@see + socket + recv + send + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL socket address structure. + + - [SOCK_ERR_INVALID](@ref SOCK_ERR_INVALID) + Indicate socket connect failure. +\section SocketExample6 Example + The example demonstrates a TCP application, showing how the asynchronous call to the connect function is made through the main function and how the + callback function handles the @ref SOCKET_MSG_CONNECT event. +\subsection sub3 Main Function +@code + struct sockaddr_in Serv_Addr; + SOCKET TcpClientSocket =-1; + int ret = -1 + + TcpClientSocket = socket(AF_INET,SOCK_STREAM,SOCKET_CONFIG_DEFAULT); + Serv_Addr.sin_family = AF_INET; + Serv_Addr.sin_port = _htons(1234); + Serv_Addr.sin_addr.s_addr = inet_addr(SERVER); + printf("Connected to server via socket %u\n",TcpClientSocket); + + do + { + ret = connect(TcpClientSocket,(sockaddr_in*)&Serv_Addr,sizeof(Serv_Addr)); + if(ret != 0) + { + printf("Connection Error\n"); + } + else + { + printf("Connection successful.\n"); + break; + } + }while(1) +@endcode +\subsection sub4 Socket Callback +@code + if(u8Msg == SOCKET_MSG_CONNECT) + { + tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + if(pstrConnect->s8Error == 0) + { + uint8_t acBuffer[GROWL_MSG_SIZE]; + uint16_t u16MsgSize; + + printf("Connect success!\n"); + + u16MsgSize = FormatMsg(u8ClientID, acBuffer); + send(sock, acBuffer, u16MsgSize, 0); + recv(pstrNotification->Socket, (void*)au8Msg,GROWL_DESCRIPTION_MAX_LENGTH, GROWL_RX_TIMEOUT); + u8Retry = GROWL_CONNECT_RETRY; + } + else + { + M2M_DBG("Connection Failed, Error: %d\n",pstrConnect->s8Error"); + shutdown(pstrNotification->Socket); + } + } +@endcode +*/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen); +/*! +@fn \ + int8_t secure(SOCKET sock); + + Converts an (insecure) TCP connection with a remote server into a secure TLS-over-TCP connection. + It may be called after both of the following:\n + - a TCP socket has been created by the @ref socket function, with u8Config parameter set to + @ref SOCKET_CONFIG_SSL_DELAY.\n + - a successful connection has been made on the socket via the @ref connect function. + This is an asynchronous API; the application socket callback function is notified of the result + of the attempt to make the connection secure through the event @ref SOCKET_MSG_SECURE, along + with a structure @ref tstrSocketConnectMsg. + If the attempt to make the connection secure fails, the application should call @ref close(). + +@param[in] sock + Socket ID, corresponding to a connected TCP socket. + +@pre + @ref socket and @ref connect must be called to connect a TCP socket before passing the socket ID to this function. + Value @ref SOCKET_CONFIG_SSL_DELAY must have been set in the u8Config parameter that was passed to @ref socket. + +@see + socket + connect + +@return + The function returns SOCK_ERR_NO_ERROR for successful operations and a negative error value otherwise. + The possible error values are: + - @ref SOCK_ERR_INVALID_ARG + Indicating passing invalid arguments such as negative socket ID. + + - @ref SOCK_ERR_INVALID + Indicating failure to process the request. +*/ +int8_t secure(SOCKET sock); +/*! +@fn \ + int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); + + An asynchronous receive function, used to retrieve data from a TCP stream. + Before calling the recv function, a successful socket connection status must have been received through any of the two socket events + [SOCKET_MSG_CONNECT] or [SOCKET_MSG_ACCEPT], from the socket callback. Hence, indicating that the socket is already connected to a remote + host. + The application receives the required data in response to this asynchronous call through the reception of the event @ref SOCKET_MSG_RECV in the + socket callback. + + Receiving the SOCKET_MSG_RECV message in the callback with zero or negative buffer length indicates the following: + - @ref SOCK_ERR_NO_ERROR : Socket connection closed. The application should now call @ref shutdown(). + - @ref SOCK_ERR_CONN_ABORTED : Socket connection aborted. The application should now call @ref shutdown(). + - @ref SOCK_ERR_TIMEOUT : Socket receive timed out. The socket connection remains open. + +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer is used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32Timeoutmsec + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). If the timeout period is + elapsed with no data received, the socket will get a timeout error. +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket in a connected state is expected to receive data through the socket interface. + +@see socket +@see connect +@see bind +@see listen +@see recvfrom +@see shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample7 Example + The example demonstrates a code snippet for the calling of the recv function in the socket callback upon notification of the accept or connect events, and the parsing of the + received data when the SOCKET_MSG_RECV event is received. +@code + + switch(u8Msg) + { + + case SOCKET_MSG_ACCEPT: + { + tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg*)pvMsg; + + if(pstrAccept->sock >= 0) + { + recv(pstrAccept->sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + M2M_ERR("accept\n"); + } + } + break; + + + case SOCKET_MSG_RECV: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + + recv(sock,gau8RxBuffer,sizeof(gau8RxBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32TimeoutSeconds); + Receives data from a UDP Socket. + + The asynchronous recvfrom function is used to retrieve data from a UDP socket. The socket must already be bound to + a local port before a call to the recvfrom function is made (i.e message @ref SOCKET_MSG_BIND is received + with successful status in the socket callback). + + Upon calling the recvfrom function with a successful return code, the application is expected to receive a notification + in the socket callback whenever a message is received through the @ref SOCKET_MSG_RECVFROM event. + + Receiving the SOCKET_MSG_RECVFROM message in the callback with zero, indicates that the socket is closed. + Whereby a negative buffer length indicates one of the socket error codes such as socket timeout error @ref SOCK_ERR_TIMEOUT + + The recvfrom callback can also be used to show the IP address of the remote host that sent the frame by + using the "strRemoteAddr" element in the @ref tstrSocketRecvMsg structure. (refer to the code example) +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvRecvBuf + Pointer to a buffer that will hold the received data. The buffer shall be used + in the recv callback to deliver the received data to the caller. The buffer must + be resident in memory (heap or global buffer). + +@param [in] u16BufLen + The buffer size in bytes. + +@param [in] u32TimeoutSeconds + Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout + will be set to infinite (the recv function waits forever). + +@pre + - The socket function must be called to allocate a TCP socket before passing the socket ID to the recv function. + - The socket corresponding to the socket ID must be successfully bound to a local port through the call to a @ref bind function. + +@see + socket + bind + shutdown + +@return + The function returns ZERO for successful operations and a negative value otherwise. + The possible error values are: + - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR) + Indicating that the operation was successful. + + - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG) + Indicating passing invalid arguments such as negative socket ID or NULL Receive buffer. + + - [SOCK_ERR_BUFFER_FULL](@ref SOCK_ERR_BUFFER_FULL) + Indicate socket receive failure. +\section SocketExample8 Example + The example demonstrates a code snippet for the calling of the recvfrom function in the socket callback upon notification of a successful bind event, and the parsing of the + received data when the SOCKET_MSG_RECVFROM event is received. +@code + switch(u8Msg) + { + + case SOCKET_MSG_BIND: + { + tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg; + + if(pstrBind != NULL) + { + if(pstrBind->status == 0) + { + recvfrom(sock, gau8SocketTestBuffer, TEST_BUFFER_SIZE, 0); + } + else + { + M2M_ERR("bind\n"); + } + } + } + break; + + + case SOCKET_MSG_RECVFROM: + { + tstrSocketRecvMsg *pstrRx = (tstrSocketRecvMsg*)pvMsg; + + if(pstrRx->s16BufferSize > 0) + { + //get the remote host address and port number + uint16_t u16port = pstrRx->strRemoteAddr.sin_port; + uint32_t strRemoteHostAddr = pstrRx->strRemoteAddr.sin_addr.s_addr; + + printf("Received frame with size = %d.\tHost address=%x, Port number = %d\n\n",pstrRx->s16BufferSize,strRemoteHostAddr, u16port); + + ret = recvfrom(sock,gau8SocketTestBuffer,sizeof(gau8SocketTestBuffer),TEST_RECV_TIMEOUT); + } + else + { + printf("Socket recv Error: %d\n",pstrRx->s16BufferSize); + ret = shutdown(sock); + } + } + break; + + default: + break; + } +@endcode +*/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec); +/*! +@fn \ + int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + Asynchronous sending function, used to send data on a TCP/UDP socket. + + Called by the application code when there is outgoing data available required to be sent on a specific socket handler. + The only difference between this function and the similar @ref sendto function, is the type of socket the data is sent on and the parameters passed in. + @ref send function is most commonly called for sockets in a connected state. + After the data is sent, the socket callback function registered using registerSocketCallback(), is expected to receive an event of type + @ref SOCKET_MSG_SEND holding information containing the number of data bytes sent. +@param [in] sock + Socket ID, must hold a non negative value. + A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + +@param [in] pvSendBuffer + Pointer to a buffer holding data to be transmitted. + +@param [in] u16SendLength + The buffer size in bytes. + +@param [in] u16Flags + Not used in the current implementation. + +@pre + Sockets must be initialized using socketInit. \n + + For TCP Socket:\n + Must use a successfully connected Socket (so that the intended recipient address is known ahead of sending the data). + Hence this function is expected to be called after a successful socket connect operation(in client case or accept in the + the server case).\n + + For UDP Socket:\n + UDP sockets most commonly use @ref sendto function, where the destination address is defined. However, in-order to send outgoing data + using the @ref send function, at least one successful call must be made to the @ref sendto function before consecutive calls to the @ref send function, + to ensure that the destination address is saved in the firmware. + +@see + socketInit + recv + sendto + socket + connect + accept + sendto + +@warning + u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. \n + Use a valid socket identifier through the prior call to the @ref socket function. + Must use a valid buffer pointer. + Successful completion of a call to send() does not guarantee delivery of the message, + A negative return value indicates only locally-detected errors + * @return The function shall return @ref SOCK_ERR_NO_ERROR for successful operation and a negative value otherwise. + */ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t u16Flags); + +/*! + * @fn int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + * @brief Asynchronous sending function, used to send data on a UDP socket. + * Called by the application code when there is data required to be sent on a UDP socket. + * @details The application code is expected to receive data from a successfully bound socket node. + * The only difference between this function and the similar @ref send function, is the type of socket the data is received on. + * This function works only with UDP sockets. + * After the data is sent, the socket callback function registered using @ref registerSocketCallback(), is expected to receive an + * event of type @ref SOCKET_MSG_SENDTO. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] pvSendBuffer + * Pointer to a buffer holding data to be transmitted. + * A NULL value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @param[in] u16SendLength + * The buffer size in bytes. It must not exceed @ref SOCKET_BUFFER_MAX_LENGTH. + * @param[in] flags + * Not used in the current implementation + * @param[in] pstrDestAddr + * The destination address. + * @param[in] u8AddrLen + * Destination address length in bytes. + * Not used in the current implementation, only included for BSD compatibility. + * @pre Sockets must be initialized using @ref socketInit. + * @see + * socketInit + * recvfrom + * sendto + * socket + * connect + * accept + * send + * @warning + * u16SendLength must not exceed @ref SOCKET_BUFFER_MAX_LENGTH.\n + * Use a valid socket (returned from socket). + * A valid buffer pointer must be used (not NULL).\n + * Successful completion of a call to sendto does not guarantee delivery of the message, + * A negative return value indicates only locally-detected errors. + * @return The function returns @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. +*/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen); + +/*! + * @fn int8_t shutdown(SOCKET sock); + * @brief Synchronous shutdown function, releases all the socket assigned resources. + * @param[in] sock + * Socket ID, must hold a non negative value. + * A negative value will return a socket error @ref SOCK_ERR_INVALID_ARG. Indicating that an invalid argument is passed in. + * @pre + * Sockets must be initialized through the call of the socketInit function. + * @ref shutdown is called only for valid socket identifiers created through the @ref socket function. + * @warning If @ref shutdown is called while there are still pending messages (sent or received ) they will be discarded. + * @see socketInit, socket + * @return The function returned @ref SOCK_ERR_NO_ERROR for successful operation and a negative value (indicating the error) otherwise. + */ +int8_t shutdown(SOCKET sock); + +/*! + * @fn int8_t gethostbyname(const char *pcHostName); + * Asynchronous DNS resolving function. This function uses DNS to resolve a domain name to the corresponding IP address. + * A call to this function will cause a DNS request to be sent and the response will be delivered to the DNS callback + * function registered using registerSocketCallback. + * @param[in] pcHostName + * NULL terminated string containing the domain name for the remote host. + * Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE). + * @see registerSocketCallback + * @warning + * Successful completion of a call to gethostbyname() does not guarantee success of the DNS request, + * a negative return value indicates only locally-detected errors + * @return + * - @ref SOCK_ERR_NO_ERROR + * - @ref SOCK_ERR_INVALID_ARG + */ +int8_t gethostbyname(const char *pcHostName); + +/*! +@fn \ + int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + + The setsockopt() function shall set the option specified by the option_name + argument, at the protocol level specified by the level argument, to the value + pointed to by the option_value argument for the socket specified by the socket argument. + +@param[in] socket + Socket handler. + +@param[in] u8Level + Protocol level.\n + Supported protocol levels are @ref SOL_SOCKET, @ref SOL_SSL_SOCKET and @ref SOL_RAW. + +@param[in] option_name + Option to be set.\n + For protocol level @ref SOL_SOCKET, the supported option names are:\n + @ref SO_SET_UDP_SEND_CALLBACK\n + @ref SO_TCP_KEEPALIVE\n + @ref SO_TCP_KEEPIDLE\n + @ref SO_TCP_KEEPINTVL\n + @ref SO_TCP_KEEPCNT\n + For protocol level @ref SOL_SSL_SOCKET, the supported option names are:\n + @ref SO_SSL_BYPASS_X509_VERIF\n + @ref SO_SSL_SNI\n + @ref SO_SSL_ENABLE_SESSION_CACHING\n + @ref SO_SSL_ENABLE_CERTNAME_VALIDATION\n + @ref SO_SSL_ALPN\n + For protocol level @ref SOL_RAW, the supported option names are:\n + @ref SO_ICMP_FILTER\n + +@param[in] option_value + Pointer to user provided value. + +@param[in] u16OptionLen + Length of the option value in bytes. Refer to each option documentation for the required length. + +@return + The function shall return \ref SOCK_ERR_NO_ERROR for successful operation + and a negative value (indicating the error) otherwise. +*/ +int8_t setsockopt(SOCKET socket, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen); + +/*! + * @fn int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + * @brief Get socket options retrieves. + * This Function isn't implemented yet but this is the form that will be released later. + * @param[in] sock + * Socket Identifier. + * @param[in] u8Level + * The protocol level of the option. + * @param[in] u8OptName + * The u8OptName argument specifies a single option to get. + * @param[out] pvOptValue + * The pvOptValue argument contains pointer to a buffer containing the option value. + * @param[out] pu8OptLen + * Option value buffer length. + * @return The function shall return ZERO for successful operation and a negative value otherwise. + */ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t *pu8OptLen); + +/*! + * @fn int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + * @brief The function request to send ping request to the given IP Address. + * @param[in] u32DstIP + * Target Destination IP Address for the ping request. It must be represented in Network byte order. + * The function @ref nmi_inet_addr could be used to translate the dotted decimal notation IP + * to its Network bytes order integer representative. + * @param[in] u8TTL + * IP TTL value for the ping request. If set to ZERO, the default value SHALL be used. + * @param[in] fpPingCb + * Callback will be called to deliver the ping statistics. + + * @warning This API should only be used to request one ping at a time; calling this API invalidates callbacks + * for previous ping requests. + * @see nmi_inet_addr + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb); + +/*! + * @fn int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); + * + * This function sets the protocol list used for application-layer protocol negotiation (ALPN). + * If used, it must be called after creating a SSL socket (using @ref socket) and before + * connecting/binding (using @ref connect or @ref bind) or securing (using @ref secure). + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN list applies. + * + * @param[in] pcProtocolList + * Pointer to the list of protocols available in the application. \n + * The entries in the list must: \n + * - be separated with ' ' (space). \n + * - not contain ' ' (space) or '\0' (NUL). \n + * - be non-zero length. \n + * . + * The list itself must: \n + * - be terminated with '\0' (NUL). \n + * - be no longer than @ref ALPN_LIST_MAX_APP_LENGTH, including separators (spaces) and terminator (NUL). \n + * - contain at least one entry. + * + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * + * \section SocketExample9 Example + * The example demonstrates an application using @ref set_alpn_list and @ref get_alpn_index to negotiate secure HTTP/2 + * (with fallback option of HTTP/1.1). + + * \subsection sub5 Main Function + * @code + * SOCKET TcpClientSocket = socket(AF_INET, SOCK_STREAM, SOCKET_CONFIG_SSL_ON); + * if (TcpClientSocket >= 0) + * { + * struct sockaddr_in Serv_Addr = { + * .sin_family = AF_INET, + * .sin_port = _htons(1234), + * .sin_addr.s_addr = inet_addr(SERVER) + * }; + * set_alpn_list(TcpClientSocket, "h2 http/1.1"); + * connect(TcpClientSocket, &Serv_Addr, sizeof(Serv_Addr)); + * } + * @endcode + * \subsection sub6 Socket Callback + * @code + * if(u8Msg == SOCKET_MSG_CONNECT) + * { + * tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg; + * if(pstrConnect->s8Error == 0) + * { + * uint8_t alpn_index = get_alpn_index(pstrConnect->sock); + * switch (alpn_index) + * { + * case 1: + * printf("Negotiated HTTP/2\n"); + * break; + * case 2: + * printf("Negotiated HTTP/1.1\n"); + * break; + * case 0: + * printf("Protocol negotiation did not occur\n"); + * break; + * } + * } + * } + * @endcode +*/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList); +/*! + * @fn int8_t get_alpn_index(SOCKET sock); + * + * This function gets the index of the protocol negotiated via ALPN. + * It should be called when a SSL socket connection succeeds, in order to determine which + * application-layer protocol must be used. + * + * @param[in] sock + * Socket ID obtained by a call to @ref socket. This is the SSL socket to which + * the ALPN applies. + * + * @return The function returns:\n + * - >0: 1-based index of negotiated protocol with respect to the list previously provided to @ref set_alpn_list.\n + * - 0: No negotiation occurred (eg TLS peer did not support ALPN).\n + * - <0: Invalid parameters (socket is not in use, or not an SSL socket).\n + * + * @see @ref SocketExample9 +*/ +int8_t get_alpn_index(SOCKET sock); + +/*! + *@fn int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); + * + * This function gets detail about a socket failure. The application can call this when notified + * of a socket failure via @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + * If used, it must be called before @ref shutdown. + + * @param[in] sock + * Socket ID obtained by a call to @ref socket. + * + * @param[out] pstrErr + * Pointer to structure to be populated with the details of the socket failure. + * + * @return The function returns @ref SOCK_ERR_NO_ERROR if the request is successful. In this case pstrErr + * has been populated. + * The function returns a negative value if the request is not successful. In this case pstrErr + * has not been populated. +*/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr); +/**@}*/ // SocketAPI + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SOCKET_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_addr.c b/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_addr.c new file mode 100644 index 0000000..5c0b682 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_addr.c @@ -0,0 +1,119 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_addr.c + + Summary: + Implementation of standard inet_addr function. + + Description: + Implementation of standard inet_addr function. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include +#include "socket.h" + +in_addr_t inet_addr(const char *cp) +{ + uint8_t i,l; + uint16_t t; + uint32_t ip; + char c; + + ip = 0; + + for (i=0; i<4; i++) + { + t = 0; + ip >>= 8; + + // Count non-delimiter or terminator characters + + for (l=0; l<4; l++) + { + c = cp[l]; + + if (('.' == c) || ('\0' == c)) + { + break; + } + } + + // There must be 1 to 3 characters + + if ((0 == l) || (4 == l)) + { + return 0; + } + + c = *cp++; + + // First digit can't be '0' unless it's the only one + + if ((l > 1) && (c == '0')) + { + return 0; + } + + while(l--) + { + // Each digit must be decimal + + if ((c < '0') || (c > '9')) + { + return 0; + } + + t = (t * 10) + (c - '0'); + + c = *cp++; + } + + // Total accumulated number must be less than 256 + + if (t > 255) + { + return 0; + } + + // Pack number into 32 bit IP address representation + + ip |= ((uint32_t)t << 24); + + // First three numbers must terminate with '.', last one with '\0's + + if ((('\0' == c) && (i != 3)) || (('\0' != c) && (i == 3))) + { + return 0; + } + } + + return ip; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_ntop.c b/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_ntop.c new file mode 100644 index 0000000..bdc190a --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/source/inet_ntop.c @@ -0,0 +1,104 @@ +/******************************************************************************* + WINC3400 Wireless Driver + + File Name: + inet_ntop.c + + Summary: + Implementation of standard inet_ntop function. + + Description: + Implementation of standard inet_ntop function. + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include +#include +#include +#include "socket.h" + +const char *inet_ntop(int af, const void *src, char *dst, size_t size) +{ + uint8_t i, v, t, c, n; + char *rp = dst; + uint32_t ip = ((struct in_addr*)src)->s_addr; + + if ((NULL == src) || (NULL == dst) || (size < 16)) + { + return NULL; + } + + for (i=0; i<4; i++) + { + t = ip; + v = 100; + + // Check for zero + + if (t > 0) + { + n = 0; + + do + { + c = '0'; + while (t >= v) + { + c++; + t -= v; + } + v /= 10; + + if (('0' != c) || (n > 0)) + { + *dst++ = c; + + n++; + } + } + while (v > 0); + } + else + { + *dst++ = '0'; + } + + if (3 == i) + { + *dst++ = '\0'; + } + else + { + *dst++ = '.'; + } + + ip >>= 8; + } + + return rp; +} + +//DOM-IGNORE-END diff --git a/ChaloupeLora.X/Source/winc3400_142/socket/source/socket.c b/ChaloupeLora.X/Source/winc3400_142/socket/source/socket.c new file mode 100644 index 0000000..10e8e33 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/socket/source/socket.c @@ -0,0 +1,1261 @@ +/******************************************************************************* + File Name: + socket.c + + Summary: + WINC3400 BSD Compatible Socket Interface + + Description: + WINC3400 BSD Compatible Socket Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +INCLUDES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#include "nm_bsp.h" +#include "socket.h" +#include "m2m_hif.h" +#include "m2m_socket_host_if.h" + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +MACROS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +#define TLS_RECORD_HEADER_LENGTH (5) +#define ETHERNET_HEADER_OFFSET (34) +#define ETHERNET_HEADER_LENGTH (14) +#define TCP_IP_HEADER_LENGTH (40) +#define UDP_IP_HEADER_LENGTH (28) + +#define IP_PACKET_OFFSET (ETHERNET_HEADER_LENGTH + ETHERNET_HEADER_OFFSET - M2M_HIF_HDR_OFFSET) + +#define TCP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + TCP_IP_HEADER_LENGTH) +#define UDP_TX_PACKET_OFFSET (IP_PACKET_OFFSET + UDP_IP_HEADER_LENGTH) +#define SSL_TX_PACKET_OFFSET (TCP_TX_PACKET_OFFSET + TLS_RECORD_HEADER_LENGTH) + +#define SOCKET_REQUEST(reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) \ + hif_send(M2M_REQ_GROUP_IP, reqID, reqArgs, reqSize, reqPayload, reqPayloadSize, reqPayloadOffset) + + +#define SSL_FLAGS_ACTIVE NBIT0 +#define SSL_FLAGS_BYPASS_X509 NBIT1 +#define SSL_FLAGS_CACHE_SESSION NBIT4 +#define SSL_FLAGS_CHECK_CERTNAME NBIT6 +#define SSL_FLAGS_DELAY NBIT7 + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +PRIVATE DATA TYPES +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + + +/*! +* @brief +*/ +typedef struct { + SOCKET sock; + uint8_t u8Dummy; + uint16_t u16SessionID; +} tstrCloseCmd; + + +/*! +* @brief +*/ +typedef struct { + uint8_t *pu8UserBuffer; + uint16_t u16UserBufferSize; + uint16_t u16SessionID; + uint16_t u16DataOffset; + uint8_t bIsUsed; + uint8_t u8SSLFlags; + uint8_t bIsRecvPending; + uint8_t u8AlpnStatus; + uint8_t u8ErrSource; + uint8_t u8ErrCode; +} tstrSocket; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* +GLOBALS +*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ + +volatile tstrSocket gastrSockets[MAX_SOCKET]; +volatile uint16_t gu16SessionID = 0; + +volatile tpfAppSocketCb gpfAppSocketCb; +volatile tpfAppResolveCb gpfAppResolveCb; +volatile uint8_t gbSocketInit = 0; + +static tpfPingCb gfpPingCb = NULL; +static uint32_t gu32PingId = 0; + +/********************************************************************* +Function + Socket_ReadSocketData + +Description + Callback function used by the WINC3400 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv, uint8_t u8SocketMsg, + uint32_t u32StartAddress, uint16_t u16ReadCount) +{ + uint32_t u32Address = u32StartAddress; + uint16_t u16Read; + int16_t s16Diff; + + pstrRecv->u16RemainingSize = u16ReadCount; + if((u16ReadCount > 0) && (gastrSockets[sock].pu8UserBuffer != NULL) && (gastrSockets[sock].u16UserBufferSize > 0) && (gastrSockets[sock].bIsUsed == 1)) + { + u16Read = u16ReadCount; + s16Diff = u16Read - gastrSockets[sock].u16UserBufferSize; + if(s16Diff > 0) + { + /* We don't expect to be here. Firmware only sends data to the driver according to the application's buffer size. + * But it is worth keeping this check, eg in case the application calls recv again with a smaller buffer size, or in case of HIF hacking. */ + u16Read = gastrSockets[sock].u16UserBufferSize; + } + + if(hif_receive(u32Address, gastrSockets[sock].pu8UserBuffer, u16Read, 1) == M2M_SUCCESS) + { + pstrRecv->pu8Buffer = gastrSockets[sock].pu8UserBuffer; + pstrRecv->s16BufferSize = u16Read; + pstrRecv->u16RemainingSize -= u16Read; + + gastrSockets[sock].u16UserBufferSize = 0; + gastrSockets[sock].pu8UserBuffer = NULL; + + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8SocketMsg, pstrRecv); + } + else + { + M2M_ERR("Current <%d>\r\n", u16ReadCount); + } + } +} +/********************************************************************* +Function + m2m_ip_cb + +Description + Callback function used by the NMC1000 driver to deliver messages + for socket layer. + +Return + None. +*********************************************************************/ +static void m2m_ip_cb(uint8_t u8OpCode, uint16_t u16BufferSize, uint32_t u32Address) +{ + if(u8OpCode == SOCKET_CMD_BIND) + { + tstrBindReply strBindReply; + tstrSocketBindMsg strBind; + + if(hif_receive(u32Address, (uint8_t*)&strBindReply, sizeof(tstrBindReply), 0) == M2M_SUCCESS) + { + strBind.status = strBindReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strBindReply.sock, SOCKET_MSG_BIND, &strBind); + } + } + else if(u8OpCode == SOCKET_CMD_LISTEN) + { + tstrListenReply strListenReply; + tstrSocketListenMsg strListen; + if(hif_receive(u32Address, (uint8_t*)&strListenReply, sizeof(tstrListenReply), 0) == M2M_SUCCESS) + { + strListen.status = strListenReply.s8Status; + if(gpfAppSocketCb) + gpfAppSocketCb(strListenReply.sock, SOCKET_MSG_LISTEN, &strListen); + } + } + else if(u8OpCode == SOCKET_CMD_ACCEPT) + { + tstrAcceptReply strAcceptReply; + tstrSocketAcceptMsg strAccept; + if(hif_receive(u32Address, (uint8_t*)&strAcceptReply, sizeof(tstrAcceptReply), 0) == M2M_SUCCESS) + { + if((strAcceptReply.sConnectedSock >= 0) && (strAcceptReply.sConnectedSock < MAX_SOCKET)) + { + gastrSockets[strAcceptReply.sConnectedSock].u8SSLFlags = 0; + gastrSockets[strAcceptReply.sConnectedSock].bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + gastrSockets[strAcceptReply.sConnectedSock].u16SessionID = gu16SessionID; + M2M_DBG("Socket %d session ID = %d\r\n", strAcceptReply.sConnectedSock, gu16SessionID); + } + strAccept.sock = strAcceptReply.sConnectedSock; + strAccept.strAddr.sin_family = AF_INET; + strAccept.strAddr.sin_port = strAcceptReply.strAddr.u16Port; + strAccept.strAddr.sin_addr.s_addr = strAcceptReply.strAddr.u32IPAddr; + if(gpfAppSocketCb) + gpfAppSocketCb(strAcceptReply.sListenSock, SOCKET_MSG_ACCEPT, &strAccept); + } + } + else if((u8OpCode == SOCKET_CMD_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT) || (u8OpCode == SOCKET_CMD_SSL_CONNECT_ALPN)) + { + /* Note that for successful connections the fw always sends SOCKET_CMD_CONNECT, even for SSL connections. */ + tstrConnectAlpnReply strConnectAlpnReply = {{0}}; + tstrSocketConnectMsg strConnMsg; + uint16_t u16HifSz = sizeof(tstrConnectAlpnReply); + if(u8OpCode != SOCKET_CMD_SSL_CONNECT_ALPN) + u16HifSz = sizeof(tstrConnectReply); + if(hif_receive(u32Address, (uint8_t*)&strConnectAlpnReply, u16HifSz, 0) == M2M_SUCCESS) + { + if((strConnectAlpnReply.strConnReply.sock >= 0) && (strConnectAlpnReply.strConnReply.sock < MAX_SOCKET)) + { + uint8_t u8Msg = SOCKET_MSG_CONNECT; + + strConnMsg.sock = strConnectAlpnReply.strConnReply.sock; + strConnMsg.s8Error = strConnectAlpnReply.strConnReply.s8Error; + + /* If the SOCKET_CMD_SSL_CONNECT op code is received and the socket was already connected, then the + callback corresponds to an attempt to make the socket secure. */ + if(0 != gastrSockets[strConnMsg.sock].u16DataOffset) + { + u8Msg = SOCKET_MSG_SECURE; + } + if(strConnectAlpnReply.strConnReply.s8Error == SOCK_ERR_NO_ERROR) + { + gastrSockets[strConnMsg.sock].u16DataOffset = strConnectAlpnReply.strConnReply.u16AppDataOffset - M2M_HIF_HDR_OFFSET; + gastrSockets[strConnMsg.sock].u8AlpnStatus = strConnectAlpnReply.u8AppProtocolIdx; + } + else + { + gastrSockets[strConnMsg.sock].u8ErrSource = strConnectAlpnReply.strConnReply.u8ErrSource; + gastrSockets[strConnMsg.sock].u8ErrCode = strConnectAlpnReply.strConnReply.u8ErrCode; + } + if(gpfAppSocketCb) + gpfAppSocketCb(strConnMsg.sock, u8Msg, &strConnMsg); + } + } + } + else if(u8OpCode == SOCKET_CMD_DNS_RESOLVE) + { + tstrDnsReply strDnsReply; + if(hif_receive(u32Address, (uint8_t*)&strDnsReply, sizeof(tstrDnsReply), 0) == M2M_SUCCESS) + { + strDnsReply.u32HostIP = strDnsReply.u32HostIP; + if(gpfAppResolveCb) + gpfAppResolveCb((uint8_t*)strDnsReply.acHostName, strDnsReply.u32HostIP); + } + } + else if((u8OpCode == SOCKET_CMD_RECV) || (u8OpCode == SOCKET_CMD_RECVFROM) || (u8OpCode == SOCKET_CMD_SSL_RECV)) + { + SOCKET sock; + int16_t s16RecvStatus; + tstrRecvReply strRecvReply; + uint16_t u16ReadSize; + tstrSocketRecvMsg strRecvMsg; + uint8_t u8CallbackMsgID = SOCKET_MSG_RECV; + uint16_t u16DataOffset; + + if(u8OpCode == SOCKET_CMD_RECVFROM) + u8CallbackMsgID = SOCKET_MSG_RECVFROM; + + /* Read RECV REPLY data structure. + */ + u16ReadSize = sizeof(tstrRecvReply); + if(hif_receive(u32Address, (uint8_t*)&strRecvReply, u16ReadSize, 0) == M2M_SUCCESS) + { + if((strRecvReply.sock >= 0) && (strRecvReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strRecvReply.sock; + u16SessionID = strRecvReply.u16SessionID; + M2M_DBG("recv callback session ID = %d\r\n", u16SessionID); + + /* Reset the Socket RX Pending Flag. + */ + gastrSockets[sock].bIsRecvPending = 0; + + s16RecvStatus = NM_BSP_B_L_16(strRecvReply.s16RecvStatus); + u16DataOffset = NM_BSP_B_L_16(strRecvReply.u16DataOffset); + strRecvMsg.strRemoteAddr.sin_port = strRecvReply.strRemoteAddr.u16Port; + strRecvMsg.strRemoteAddr.sin_addr.s_addr = strRecvReply.strRemoteAddr.u32IPAddr; + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if((s16RecvStatus > 0) && (s16RecvStatus < u16BufferSize)) + { + /* Skip incoming bytes until reaching the Start of Application Data. + */ + u32Address += u16DataOffset; + + /* Read the Application data and deliver it to the application callback in + the given application buffer. Firmware only sends data up to + the size of the application buffer. For TCP, a new call to recv is needed + in order to retrieve any outstanding data from firmware. + */ + u16ReadSize = (uint16_t)s16RecvStatus; + Socket_ReadSocketData(sock, &strRecvMsg, u8CallbackMsgID, u32Address, u16ReadSize); + } + else + { + /* Don't tidy up here. Application must call shutdown(). + */ + strRecvMsg.s16BufferSize = s16RecvStatus; + strRecvMsg.pu8Buffer = NULL; + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &strRecvMsg); + } + } + else + { + M2M_DBG("Discard recv callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + if(u16ReadSize < u16BufferSize) + hif_receive(0, NULL, 0, 1); + } + } + } + } + else if((u8OpCode == SOCKET_CMD_SEND) || (u8OpCode == SOCKET_CMD_SENDTO) || (u8OpCode == SOCKET_CMD_SSL_SEND)) + { + SOCKET sock; + int16_t s16Rcvd; + tstrSendReply strReply; + uint8_t u8CallbackMsgID = SOCKET_MSG_SEND; + + if(u8OpCode == SOCKET_CMD_SENDTO) + u8CallbackMsgID = SOCKET_MSG_SENDTO; + + if(hif_receive(u32Address, (uint8_t*)&strReply, sizeof(tstrSendReply), 0) == M2M_SUCCESS) + { + if((strReply.sock >=0) && (strReply.sock < MAX_SOCKET)) + { + uint16_t u16SessionID = 0; + + sock = strReply.sock; + u16SessionID = strReply.u16SessionID; + M2M_DBG("send callback session ID = %d\r\n", u16SessionID); + + s16Rcvd = NM_BSP_B_L_16(strReply.s16SentBytes); + + if(u16SessionID == gastrSockets[sock].u16SessionID) + { + if(gpfAppSocketCb) + gpfAppSocketCb(sock, u8CallbackMsgID, &s16Rcvd); + } + else + { + M2M_DBG("Discard send callback %d %d\r\n", u16SessionID, gastrSockets[sock].u16SessionID); + } + } + } + } + else if(u8OpCode == SOCKET_CMD_PING) + { + tstrPingReply strPingReply; + if(hif_receive(u32Address, (uint8_t*)&strPingReply, sizeof(tstrPingReply), 1) == M2M_SUCCESS) + { + if((gu32PingId == strPingReply.u32CmdPrivate) && (gfpPingCb != NULL)) + { + gfpPingCb(strPingReply.u32IPAddr, strPingReply.u32RTT, strPingReply.u8ErrorCode); + } + } + } +} +/********************************************************************* +Function + socketInit + +Description + +Return + None. +*********************************************************************/ +void socketInit(void) +{ + if(gbSocketInit==0) + { + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, m2m_ip_cb); + gbSocketInit=1; + gu16SessionID = 0; + } +} + +/********************************************************************* +Function + socketDeinit + +Description + +Return + None. +*********************************************************************/ +void socketDeinit(void) +{ + memset((uint8_t*)gastrSockets, 0, MAX_SOCKET * sizeof(tstrSocket)); + hif_register_cb(M2M_REQ_GROUP_IP, NULL); + gpfAppSocketCb = NULL; + gpfAppResolveCb = NULL; + gbSocketInit = 0; +} + + +/********************************************************************* +Function + registerSocketCallback + +Description + +Return + None. +*********************************************************************/ +void registerSocketCallback(tpfAppSocketCb pfAppSocketCb, tpfAppResolveCb pfAppResolveCb) +{ + gpfAppSocketCb = pfAppSocketCb; + gpfAppResolveCb = pfAppResolveCb; +} +void registerSocketEventCallback(tpfAppSocketCb pfAppSocketCb) +{ + gpfAppSocketCb = pfAppSocketCb; +} +void registerSocketResolveCallback(tpfAppResolveCb pfAppResolveCb) +{ + gpfAppResolveCb = pfAppResolveCb; +} + +/********************************************************************* +Function + socket + +Description + Creates a socket. + +Return + - Negative value for error. + - ZERO or positive value as a socket ID if successful. +*********************************************************************/ +SOCKET socket(uint16_t u16Domain, uint8_t u8Type, uint8_t u8Config) +{ + SOCKET sock = -1; + uint8_t u8SockID; + uint8_t u8Count; + volatile tstrSocket *pstrSock = NULL; + static volatile uint8_t u8NextTcpSock = 0; + static volatile uint8_t u8NextUdpSock = 0; + + /* The only supported family is the AF_INET for UDP and TCP transport layer protocols. */ + if(u16Domain == AF_INET) + { + if(u8Type == SOCK_STREAM) + { + for(u8Count = 0; u8Count < TCP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextTcpSock; + pstrSock = &gastrSockets[u8NextTcpSock]; + u8NextTcpSock = (u8NextTcpSock + 1) % TCP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)u8SockID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + /* In the current implementation, SSL flags only have meaning for the TCP socket case. */ + if(u8Config != SOCKET_CONFIG_SSL_OFF) + { + tstrSSLSocketCreateCmd strSSLCreate; + + strSSLCreate.sslSock = sock; + SOCKET_REQUEST(SOCKET_CMD_SSL_CREATE, (uint8_t*)&strSSLCreate, sizeof(tstrSSLSocketCreateCmd), 0, 0, 0); + + pstrSock->u8SSLFlags = SSL_FLAGS_ACTIVE; + if(u8Config == SOCKET_CONFIG_SSL_DELAY) + pstrSock->u8SSLFlags |= SSL_FLAGS_DELAY; + } + break; + } + } + } + else if(u8Type == SOCK_DGRAM) + { + volatile tstrSocket *pastrUDPSockets = &gastrSockets[TCP_SOCK_MAX]; + for(u8Count = 0; u8Count < UDP_SOCK_MAX; u8Count ++) + { + u8SockID = u8NextUdpSock; + pstrSock = &pastrUDPSockets[u8NextUdpSock]; + u8NextUdpSock = (u8NextUdpSock + 1) % UDP_SOCK_MAX; + if(!pstrSock->bIsUsed) + { + sock = (SOCKET)(u8SockID + TCP_SOCK_MAX); + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + break; + } + } + } + else if(u8Type == SOCK_RAW) + { + /* Only raw IP packets are supported */ + if(u8Config == SOCKET_CONFIG_IPPROTO_RAW) + { + pstrSock = &gastrSockets[RAW_SOCK_ID]; + if(!pstrSock->bIsUsed) + { + /* Socket identified by RAW_SOCK_ID is reserved */ + sock = (SOCKET)RAW_SOCK_ID; + memset((uint8_t*)pstrSock, 0, sizeof(tstrSocket)); + } + } + } + + if(sock >= 0) + { + pstrSock->bIsUsed = 1; + + /* The session ID is used to distinguish different socket connections + by comparing the assigned session ID to the one reported by the firmware*/ + ++gu16SessionID; + if(gu16SessionID == 0) + ++gu16SessionID; + + pstrSock->u16SessionID = gu16SessionID; + M2M_INFO("Socket %d session ID = %d\r\n", sock, gu16SessionID); + } + } + return sock; +} +/********************************************************************* +Function + bind + +Description + Request to bind a socket on a local address. + +Return +*********************************************************************/ +int8_t bind(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((pstrAddr != NULL) && (sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrBindCmd strBind; + + /* Build the bind request. */ + strBind.sock = sock; + memcpy((uint8_t *)&strBind.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strBind.strAddr.u16Family = strBind.strAddr.u16Family; + strBind.strAddr.u16Port = strBind.strAddr.u16Port; + strBind.strAddr.u32IPAddr = strBind.strAddr.u32IPAddr; + strBind.u16SessionID = gastrSockets[sock].u16SessionID; + + /* Send the request. */ + s8Ret = SOCKET_REQUEST(SOCKET_CMD_BIND, (uint8_t*)&strBind, sizeof(tstrBindCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + listen + +Description + + +Return +*********************************************************************/ +int8_t listen(SOCKET sock, uint8_t backlog) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrListenCmd strListen; + + strListen.sock = sock; + strListen.u8BackLog = backlog; + strListen.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_LISTEN, (uint8_t*)&strListen, sizeof(tstrListenCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + accept + +Description + +Return +*********************************************************************/ +int8_t accept(SOCKET sock, struct sockaddr *addr, uint8_t *addrlen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + s8Ret = SOCK_ERR_NO_ERROR; + } + return s8Ret; +} +/********************************************************************* +Function + connect + +Description + Connect to a remote TCP Server. + +Return +*********************************************************************/ +int8_t connect(SOCKET sock, struct sockaddr *pstrAddr, uint8_t u8AddrLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (pstrAddr != NULL) && (gastrSockets[sock].bIsUsed == 1) && (u8AddrLen != 0)) + { + tstrConnectCmd strConnect; + uint8_t u8Cmd = SOCKET_CMD_CONNECT; + if((gastrSockets[sock].u8SSLFlags) & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CONNECT; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + } + strConnect.sock = sock; + memcpy((uint8_t *)&strConnect.strAddr, (uint8_t *)pstrAddr, sizeof(tstrSockAddr)); + + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + return s8Ret; +} +/********************************************************************* +Function + secure + +Description + Make secure (TLS) an open TCP client connection. + +Return +*********************************************************************/ +int8_t secure(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY) + && (gastrSockets[sock].u16DataOffset != 0) + ) + { + tstrConnectCmd strConnect = {0}; + + gastrSockets[sock].u8SSLFlags &= ~SSL_FLAGS_DELAY; + strConnect.u8SslFlags = gastrSockets[sock].u8SSLFlags; + strConnect.sock = sock; + strConnect.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SECURE, (uint8_t*)&strConnect, sizeof(tstrConnectCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + return s8Ret; +} +/********************************************************************* +Function + send + +Description + +Return +*********************************************************************/ +int16_t send(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= SOCKET_BUFFER_MAX_LENGTH) && (gastrSockets[sock].bIsUsed == 1)) + { + uint16_t u16DataOffset; + tstrSendCmd strSend; + uint8_t u8Cmd; + + u8Cmd = SOCKET_CMD_SEND; + u16DataOffset = TCP_TX_PACKET_OFFSET; + + strSend.sock = sock; + strSend.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSend.u16SessionID = gastrSockets[sock].u16SessionID; + + if(sock >= TCP_SOCK_MAX) + { + u16DataOffset = UDP_TX_PACKET_OFFSET; + } + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_SEND; + u16DataOffset = gastrSockets[sock].u16DataOffset; + } + + s16Ret = SOCKET_REQUEST(u8Cmd|M2M_REQ_DATA_PKT, (uint8_t*)&strSend, sizeof(tstrSendCmd), pvSendBuffer, u16SendLength, u16DataOffset); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + sendto + +Description + +Return +*********************************************************************/ +int16_t sendto(SOCKET sock, void *pvSendBuffer, uint16_t u16SendLength, uint16_t flags, struct sockaddr *pstrDestAddr, uint8_t u8AddrLen) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + uint16_t u16MaxLength = (sock == RAW_SOCK_ID) ? (M2M_HIF_MAX_PACKET_SIZE - M2M_HIF_HDR_OFFSET - sizeof(tstrSendCmd)) : SOCKET_BUFFER_MAX_LENGTH; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvSendBuffer != NULL) && (u16SendLength <= u16MaxLength) && (gastrSockets[sock].bIsUsed == 1)) + { + tstrSendCmd strSendTo; + + memset((uint8_t*)&strSendTo, 0, sizeof(tstrSendCmd)); + + strSendTo.sock = sock; + strSendTo.u16DataSize = NM_BSP_B_L_16(u16SendLength); + strSendTo.u16SessionID = gastrSockets[sock].u16SessionID; + + if(pstrDestAddr != NULL) + { + struct sockaddr_in *pstrAddr; + pstrAddr = (void*)pstrDestAddr; + + strSendTo.strAddr.u16Family = pstrAddr->sin_family; + strSendTo.strAddr.u16Port = pstrAddr->sin_port; + strSendTo.strAddr.u32IPAddr = pstrAddr->sin_addr.s_addr; + } + s16Ret = SOCKET_REQUEST(SOCKET_CMD_SENDTO|M2M_REQ_DATA_PKT, (uint8_t*)&strSendTo, sizeof(tstrSendCmd), + pvSendBuffer, u16SendLength, (sock == RAW_SOCK_ID) ? IP_PACKET_OFFSET: UDP_TX_PACKET_OFFSET); + + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + return s16Ret; +} +/********************************************************************* +Function + recv + +Description + +Return + +*********************************************************************/ +int16_t recv(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_INVALID_ARG; + + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + uint8_t u8Cmd = SOCKET_CMD_RECV; + + gastrSockets[sock].bIsRecvPending = 1; + if( + (gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + && (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_DELAY)) + ) + { + u8Cmd = SOCKET_CMD_SSL_RECV; + } + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + return s16Ret; +} +/********************************************************************* +Function + shutdown + +Description + +Return + None. +*********************************************************************/ +int8_t shutdown(SOCKET sock) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + M2M_INFO("Sock to delete <%d> (used %u)\r\n", sock, gastrSockets[sock].bIsUsed); + + if((sock >= 0) && (sock < MAX_SOCKET) && (gastrSockets[sock].bIsUsed == 1)) + { + uint8_t u8Cmd = SOCKET_CMD_CLOSE; + tstrCloseCmd strclose; + strclose.sock = sock; + strclose.u16SessionID = gastrSockets[sock].u16SessionID; + + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + u8Cmd = SOCKET_CMD_SSL_CLOSE; + } + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strclose, sizeof(tstrCloseCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + memset((uint8_t*)&gastrSockets[sock], 0, sizeof(tstrSocket)); + } + return s8Ret; +} +/********************************************************************* +Function + recvfrom + +Description + +Return + +*********************************************************************/ +int16_t recvfrom(SOCKET sock, void *pvRecvBuf, uint16_t u16BufLen, uint32_t u32Timeoutmsec) +{ + int16_t s16Ret = SOCK_ERR_NO_ERROR; + if((sock >= 0) && (sock < MAX_SOCKET) && (pvRecvBuf != NULL) && (u16BufLen != 0) && (gastrSockets[sock].bIsUsed == 1)) + { + if(gastrSockets[sock].bIsUsed) + { + s16Ret = SOCK_ERR_NO_ERROR; + gastrSockets[sock].pu8UserBuffer = (uint8_t*)pvRecvBuf; + gastrSockets[sock].u16UserBufferSize = u16BufLen; + + if(!gastrSockets[sock].bIsRecvPending) + { + tstrRecvCmd strRecv; + + gastrSockets[sock].bIsRecvPending = 1; + + /* Check the timeout value. */ + if(u32Timeoutmsec == 0) + strRecv.u32Timeoutmsec = 0xFFFFFFFF; + else + strRecv.u32Timeoutmsec = NM_BSP_B_L_32(u32Timeoutmsec); + strRecv.sock = sock; + strRecv.u16SessionID = gastrSockets[sock].u16SessionID; + strRecv.u16BufLen = u16BufLen; + + s16Ret = SOCKET_REQUEST(SOCKET_CMD_RECVFROM, (uint8_t*)&strRecv, sizeof(tstrRecvCmd), NULL, 0, 0); + if(s16Ret != SOCK_ERR_NO_ERROR) + { + s16Ret = SOCK_ERR_BUFFER_FULL; + } + } + } + } + else + { + s16Ret = SOCK_ERR_INVALID_ARG; + } + return s16Ret; +} +/********************************************************************* +Function + gethostbyname + +Description + +Return + None. +*********************************************************************/ +int8_t gethostbyname(const char *pcHostName) +{ + int8_t s8Err = SOCK_ERR_INVALID_ARG; + uint8_t u8HostNameSize = (uint8_t)strlen(pcHostName); + if(u8HostNameSize <= HOSTNAME_MAX_SIZE) + { + s8Err = SOCKET_REQUEST(SOCKET_CMD_DNS_RESOLVE|M2M_REQ_DATA_PKT, (uint8_t*)pcHostName, u8HostNameSize + 1, NULL, 0, 0); + if(s8Err != SOCK_ERR_NO_ERROR) + { + s8Err = SOCK_ERR_INVALID; + } + } + return s8Err; +} + +/********************************************************************* +Function + rawSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t rawSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(RAW_SOCK_ID == sock) + { + if(u16OptLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_RAW_SET_SOCK_OPT; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option = u8Opt; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)pvOptVal; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + + return s8Ret; +} +/********************************************************************* +Function + sslSetSockOpt + +Description + +Return + None. +*********************************************************************/ +static int8_t sslSetSockOpt(SOCKET sock, uint8_t u8Opt, const void *pvOptVal, uint16_t u16OptLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if(sock < TCP_SOCK_MAX) + { + if(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) + { + uint8_t sslFlag = 0; + + s8Ret = SOCK_ERR_NO_ERROR; + if(u16OptLen == sizeof(int)) + { + if(u8Opt == SO_SSL_BYPASS_X509_VERIF) + { + sslFlag = SSL_FLAGS_BYPASS_X509; + } + else if(u8Opt == SO_SSL_ENABLE_SESSION_CACHING) + { + sslFlag = SSL_FLAGS_CACHE_SESSION; + } + else if(u8Opt == SO_SSL_ENABLE_CERTNAME_VALIDATION) + { + sslFlag = SSL_FLAGS_CHECK_CERTNAME; + } + } + if(sslFlag) + { + int optVal = *((int*)pvOptVal); + if(optVal) + { + gastrSockets[sock].u8SSLFlags |= sslFlag; + } + else + { + gastrSockets[sock].u8SSLFlags &= ~sslFlag; + } + } + else if( + ((u8Opt == SO_SSL_SNI) && (u16OptLen < HOSTNAME_MAX_SIZE)) + || ((u8Opt == SO_SSL_ALPN) && (u16OptLen <= ALPN_LIST_MAX_SIZE)) + ) + { + tstrSSLSetSockOptCmd strCmd = {0}; + + strCmd.sock = sock; + strCmd.u16SessionID = gastrSockets[sock].u16SessionID; + strCmd.u8Option = u8Opt; + strCmd.u32OptLen = u16OptLen; + memcpy(strCmd.au8OptVal, (uint8_t*)pvOptVal, u16OptLen); + + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT, (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + if(s8Ret == M2M_ERR_MEM_ALLOC) + { + s8Ret = SOCKET_REQUEST(SOCKET_CMD_SSL_SET_SOCK_OPT | M2M_REQ_DATA_PKT, + (uint8_t*)&strCmd, sizeof(tstrSSLSetSockOptCmd), 0, 0, 0); + } + } + else + { + M2M_ERR("Unknown SSL Socket Option %d\r\n",u8Opt); + s8Ret = SOCK_ERR_INVALID_ARG; + } + } + else + { + M2M_ERR("Not SSL Socket\r\n"); + } + } + return s8Ret; +} +/********************************************************************* +Function + setsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t setsockopt(SOCKET sock, uint8_t u8Level, uint8_t option_name, + const void *option_value, uint16_t u16OptionLen) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + if((sock >= 0) && (sock < MAX_SOCKET) && (option_value != NULL) && (gastrSockets[sock].bIsUsed == 1)) + { + if(u8Level == SOL_RAW) + { + s8Ret = rawSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SSL_SOCKET) + { + s8Ret = sslSetSockOpt(sock, option_name, option_value, u16OptionLen); + } + else if(u8Level == SOL_SOCKET) + { + if(u16OptionLen == sizeof(uint32_t)) + { + uint8_t u8Cmd = SOCKET_CMD_SET_SOCKET_OPTION; + tstrSetSocketOptCmd strSetSockOpt; + strSetSockOpt.u8Option=option_name; + strSetSockOpt.sock = sock; + strSetSockOpt.u32OptionValue = *(uint32_t*)option_value; + strSetSockOpt.u16SessionID = gastrSockets[sock].u16SessionID; + + s8Ret = SOCKET_REQUEST(u8Cmd, (uint8_t*)&strSetSockOpt, sizeof(tstrSetSocketOptCmd), NULL, 0, 0); + if(s8Ret != SOCK_ERR_NO_ERROR) + { + s8Ret = SOCK_ERR_INVALID; + } + } + } + } + return s8Ret; +} +/********************************************************************* +Function + getsockopt + +Description + +Return + None. +*********************************************************************/ +int8_t getsockopt(SOCKET sock, uint8_t u8Level, uint8_t u8OptName, const void *pvOptValue, uint8_t* pu8OptLen) +{ + // This is not implemented so return a value that will cause failure should this be used. + return SOCK_ERR_INVALID_ARG; +} +/********************************************************************* +Function + m2m_ping_req + +Description + Send Ping request. + +Return +*********************************************************************/ +int8_t m2m_ping_req(uint32_t u32DstIP, uint8_t u8TTL, tpfPingCb fpPingCb) +{ + int8_t s8Ret = M2M_ERR_INVALID_ARG; + + if((u32DstIP != 0) && (fpPingCb != NULL)) + { + tstrPingCmd strPingCmd; + + strPingCmd.u16PingCount = 1; + strPingCmd.u32DestIPAddr = u32DstIP; + strPingCmd.u32CmdPrivate = ++gu32PingId; + strPingCmd.u8TTL = u8TTL; + + gfpPingCb = fpPingCb; + s8Ret = SOCKET_REQUEST(SOCKET_CMD_PING, (uint8_t*)&strPingCmd, sizeof(tstrPingCmd), NULL, 0, 0); + } + return s8Ret; +} +/********************************************************************* +Function + set_alpn_protocol_list + +Description + This function sets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. +*********************************************************************/ +int8_t set_alpn_list(SOCKET sock, const char *pcProtocolList) +{ + int8_t s8Ret = SOCK_ERR_INVALID_ARG; + + if ((sock >= 0) && (sock < TCP_SOCK_MAX) && (pcProtocolList != NULL)) + { + uint8_t u8Length = strlen(pcProtocolList); + if ((u8Length > 0) && (u8Length < ALPN_LIST_MAX_APP_LENGTH)) + { + /* + ALPN socket option requires Alpn list in this format: + 0 1 2 3 ... (bytes) + +-------+-------+-------+ ... +-------+ ... +-------+ ... + | Length L (BE) | len1 | name1... | len2 | name2... | len3 | name3... + +-------+-------+-------+ ... +-------+ ... +-------+ ... + Length fields do not include themselves. + */ + uint8_t au8AlpnList[ALPN_LIST_MAX_SIZE] = {0}; + uint8_t *pu8Ptr = &au8AlpnList[3] + u8Length; + uint8_t u8Len = 0; + + memcpy(&au8AlpnList[3], pcProtocolList, u8Length); + u8Length++; + au8AlpnList[1] = u8Length; + au8AlpnList[2] = ' '; + + /* Convert space characters into length fields. */ + while (u8Length--) + { + if (*--pu8Ptr == ' ') + { + if (u8Len == 0) goto ERR; + *pu8Ptr = u8Len; + u8Len = 0; + } + else u8Len++; + } + s8Ret = setsockopt(sock, SOL_SSL_SOCKET, SO_SSL_ALPN, au8AlpnList, sizeof(au8AlpnList)); + } + } +ERR: + return s8Ret; +} +/********************************************************************* +Function + get_alpn_protocol_index + +Description + This function gets the protocol list used for application-layer protocol negotiation (ALPN). + If used, it must be called after creating a SSL socket (using @ref socket) and before + connecting/binding (using @ref connect or @ref bind). + +Return + The function returns the index of the selected application-layer protocol. + Special values: + 0: no negotiation has occurred. + <0: error. +*********************************************************************/ +int8_t get_alpn_index(SOCKET sock) +{ + if (sock >= TCP_SOCK_MAX || sock < 0) + return SOCK_ERR_INVALID_ARG; + if (!(gastrSockets[sock].u8SSLFlags & SSL_FLAGS_ACTIVE) || !gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + return gastrSockets[sock].u8AlpnStatus; +} + +/********************************************************************* +Function + IsSocketReady + +Description + +Return + None. +*********************************************************************/ +uint8_t IsSocketReady(void) +{ + return gbSocketInit; +} + +/********************************************************************* +Function + get_error_detail + +Description + This function gets detail about a socket failure. + The application can call this when notified of a socket failure via + @ref SOCKET_MSG_CONNECT or @ref SOCKET_MSG_RECV. + If used, it must be called before @ref shutdown. + +Return + The function returns @ref SOCK_ERR_NO_ERROR if the request is successful + and a negative value otherwise. +*********************************************************************/ +int8_t get_error_detail(SOCKET sock, tstrSockErr *pstrErr) +{ + if ((sock >= TCP_SOCK_MAX) || (sock < 0) || (pstrErr == NULL)) + return SOCK_ERR_INVALID_ARG; + if (!gastrSockets[sock].bIsUsed) + return SOCK_ERR_INVALID_ARG; + pstrErr->enuErrSource = gastrSockets[sock].u8ErrSource; + pstrErr->u8ErrCode = gastrSockets[sock].u8ErrCode; + return SOCK_ERR_NO_ERROR; +} diff --git a/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h b/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h new file mode 100644 index 0000000..0c879f5 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash.h @@ -0,0 +1,192 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.h + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +/** @defgroup SPIFLASHAPI SPI FLASH + */ + +#ifndef __SPI_FLASH_H__ +#define __SPI_FLASH_H__ + +#include "nm_common.h" +#include "nmbus.h" +#include "spi_flash_map.h" + +/** @defgroup SPIFLASHFUNCTIONS Functions + * @ingroup SPIFLASHAPI + */ + +/**@{*/ +/*! + * @fn uint32_t spi_flash_get_size(void); + * @brief Returns with \ref uint32_t value which is total flash size\n + * @note Returned value in Mb (Mega Bit). + * @return SPI flash size in case of success and a ZERO value in case of failure. + */ +uint32_t spi_flash_get_size(void); + +/*! + * @fn int8_t spi_flash_read(uint8_t *, uint32_t, uint32_t); + * @brief Read a specified portion of data from SPI Flash.\n + * @param [out] pu8Buf + * Pointer to data buffer which will be filled with data in case of successful operation. + * @param [in] u32Addr + * Address (Offset) to read from at the SPI flash. + * @param [in] u32Sz + * Total size of data to be read in bytes + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for reading from SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @note + * - It is blocking function\n + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_write(uint8_t *, uint32_t, uint32_t); + * @brief Write a specified portion of data to SPI Flash.\n + * @param [in] pu8Buf + * Pointer to data buffer which contains the data to be written. + * @param [in] u32Offset + * Address (Offset) to write at the SPI flash. + * @param [in] u32Sz + * Total number of size of data bytes + * @note + * - It is blocking function\n + * - It is user's responsibility to verify that data has been written successfully + * by reading data again and comparing it with the original. + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode. + * - Before writing to any section, it is required to erase that section first. + * @sa m2m_wifi_download_mode, spi_flash_get_size, spi_flash_erase + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + */ +int8_t spi_flash_write(uint8_t* pu8Buf, uint32_t u32Offset, uint32_t u32Sz); + +/*! + * @fn int8_t spi_flash_erase(uint32_t, uint32_t); + * @brief Erase a specified portion of SPI Flash.\n + * @param [in] u32Offset + * Address (Offset) to erase from the SPI flash. + * @param [in] u32Sz + * Total number of bytes required to be erased. + * @note It is blocking function \n + * @warning + * - Address (offset) plus size of data must not exceed flash size.\n + * - No firmware is required for writing to SPI flash.\n + * - In case of there is a running firmware, it is required to pause your firmware first + * before any trial to access SPI flash to avoid any racing between host and running firmware on bus using + * @ref m2m_wifi_download_mode + * @sa m2m_wifi_download_mode, spi_flash_get_size + * @return The function returns @ref M2M_SUCCESS for successful operations and a negative value otherwise. + * \section SPIFLASHExample Example + * @code{.c} + * #include "spi_flash.h" + * + * #define DATA_TO_REPLACE "THIS IS A NEW SECTOR IN FLASH" + * + * int main() + * { + * uint8_t au8FlashContent[FLASH_SECTOR_SZ] = {0}; + * uint32_t u32FlashTotalSize = 0; + * uint32_t u32FlashOffset = 0; + * + * ret = m2m_wifi_download_mode(); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to enter download mode\r\n"); + * } + * else + * { + * u32FlashTotalSize = spi_flash_get_size(); + * } + * + * while((u32FlashTotalSize > u32FlashOffset) && (M2M_SUCCESS == ret)) + * { + * ret = spi_flash_read(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to read SPI sector\r\n"); + * break; + * } + * memcpy(au8FlashContent, DATA_TO_REPLACE, strlen(DATA_TO_REPLACE)); + * + * ret = spi_flash_erase(u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to erase SPI sector\r\n"); + * break; + * } + * + * ret = spi_flash_write(au8FlashContent, u32FlashOffset, FLASH_SECTOR_SZ); + * if(M2M_SUCCESS != ret) + * { + * printf("Unable to write SPI sector\r\n"); + * break; + * } + * u32FlashOffset += FLASH_SECTOR_SZ; + * } + * + * if(M2M_SUCCESS == ret) + * { + * printf("Successful operations\r\n"); + * } + * else + * { + * printf("Failed operations\r\n"); + * } + * + * while(1); + * return M2M_SUCCESS; + * } + * @endcode + */ + +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz); + +/**@} + */ + +#endif //__SPI_FLASH_H__ \ No newline at end of file diff --git a/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h b/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h new file mode 100644 index 0000000..ed2e961 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/spi_flash/include/spi_flash_map.h @@ -0,0 +1,264 @@ +/******************************************************************************* + WINC3400 SPI Flash Map + + File Name: + spi_flash_map.h + + Summary: + WINC3400 SPI Flash Map + + Description: + WINC3400 SPI Flash Map + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + + +#ifndef __SPI_FLASH_MAP_H__ +#define __SPI_FLASH_MAP_H__ + +//#define DOWNLOAD_ROLLBACK +//#define OTA_GEN +#define _PROGRAM_POWER_SAVE_ +#define BT_IMAGE_PRESENT + +/* =======*=======*=======*=======*======= + * General Sizes for Flash Memory + * =======*=======*=======*=======*======= + */ + +#define FLASH_START_ADDR (0UL) +/*! M2M_OTA_IMAGE2_OFFSET) +#error "Exceed Flash Size" +#endif /* ((FLASH_COMMON_SZ + OTA_IMAGE_SIZE) > M2M_OTA_IMAGE2_OFFSET) */ +#if ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) +#error "OTA Exceed Flash Size" +#endif /* ((M2M_OTA_IMAGE2_OFFSET + OTA_IMAGE_SIZE) > FLASH_8M_TOTAL_SZ) */ + +#endif /* __SPI_FLASH_MAP_H__ */ diff --git a/ChaloupeLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c b/ChaloupeLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c new file mode 100644 index 0000000..1563f90 --- /dev/null +++ b/ChaloupeLora.X/Source/winc3400_142/spi_flash/source/spi_flash.c @@ -0,0 +1,599 @@ +/******************************************************************************* + WINC3400 SPI Flash Interface + + File Name: + spi_flash.c + + Summary: + WINC3400 SPI Flash Interface + + Description: + WINC3400 SPI Flash Interface + *******************************************************************************/ + +//DOM-IGNORE-BEGIN +/******************************************************************************* +* Copyright (C) 2021 Microchip Technology Inc. and its subsidiaries. +* +* Subject to your compliance with these terms, you may use Microchip software +* and any derivatives exclusively with Microchip products. It is your +* responsibility to comply with third party license terms applicable to your +* use of third party software (including open source software) that may +* accompany Microchip software. +* +* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER +* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED +* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A +* PARTICULAR PURPOSE. +* +* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, +* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND +* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS +* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE +* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN +* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, +* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. +*******************************************************************************/ + +#include "spi_flash.h" +#include "spi_flash_map.h" +#include "nm_common.h" +#define DUMMY_REGISTER (0x1084) + +#define TIMEOUT (-1) /*MS*/ + +#define MAX_PROG_CNT 2 +#define MAX_RETRY 4 +#define MAX_ATTEMPT_STATUS_READ 50000 + +#define HOST_SHARE_MEM_BASE (0xd0000UL) +#define CORTUS_SHARE_MEM_BASE (0x60000000UL) +#define NMI_SPI_FLASH_ADDR (0x111c) +/*********************************************************** +SPI Flash DMA +***********************************************************/ +#define GET_UINT32(X,Y) (X[0+Y] + ((uint32_t)X[1+Y]<<8) + ((uint32_t)X[2+Y]<<16) +((uint32_t)X[3+Y]<<24)) +#define SPI_FLASH_BASE (0x10200) +#define SPI_FLASH_MODE (SPI_FLASH_BASE + 0x00) +#define SPI_FLASH_CMD_CNT (SPI_FLASH_BASE + 0x04) +#define SPI_FLASH_DATA_CNT (SPI_FLASH_BASE + 0x08) +#define SPI_FLASH_BUF1 (SPI_FLASH_BASE + 0x0c) +#define SPI_FLASH_BUF2 (SPI_FLASH_BASE + 0x10) +#define SPI_FLASH_BUF_DIR (SPI_FLASH_BASE + 0x14) +#define SPI_FLASH_TR_DONE (SPI_FLASH_BASE + 0x18) +#define SPI_FLASH_DMA_ADDR (SPI_FLASH_BASE + 0x1c) +#define SPI_FLASH_MSB_CTL (SPI_FLASH_BASE + 0x20) +#define SPI_FLASH_TX_CTL (SPI_FLASH_BASE + 0x24) + +/*********************************************/ +/* STATIC FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read_status_reg +* @brief Read status register +* @param[OUT] val + value of status reg +* @return Status of execution +* @note Compatible with MX25L6465E +*/ +static int8_t spi_flash_read_status_reg(uint8_t *val) +{ + int8_t ret = M2M_SUCCESS; + uint8_t cmd[1]; + uint32_t reg; + + cmd[0] = 0x05; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + } + while(reg != 1); + + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + *val = reg & 0xff; + return ret; +} + +/** +* @fn spi_flash_load_to_cortus_mem +* @brief Load data from SPI flash into cortus memory +* @param[IN] u32MemAdr +* Cortus load address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_load_to_cortus_mem(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[5]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x0b; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + cmd[4] = 0xA5; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, u32Sz); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF2, cmd[4]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 5 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_sector_erase +* @brief Erase sector (4KB) +* @param[IN] u32FlashAdr +* Any memory address within the sector +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_sector_erase(uint32_t u32FlashAdr) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x20; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_enable +* @brief Send write enable command to SPI flash +* @return Status of execution +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_enable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x06; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_write_disable +* @brief Send write disable command to SPI flash +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_write_disable(void) +{ + uint8_t cmd[1]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + cmd[0] = 0x04; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x01); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, 0); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_page_program +* @brief Write data (less than page size) from cortus memory to SPI flash +* @param[IN] u32MemAdr +* Cortus data address. It must be set to its AHB access address +* @param[IN] u32FlashAdr +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Compatible with MX25L6465E and should be working with other types +*/ +static int8_t spi_flash_page_program(uint32_t u32MemAdr, uint32_t u32FlashAdr, uint32_t u32Sz) +{ + uint8_t cmd[4]; + uint32_t val = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x02; + cmd[1] = (uint8_t)(u32FlashAdr >> 16); + cmd[2] = (uint8_t)(u32FlashAdr >> 8); + cmd[3] = (uint8_t)(u32FlashAdr); + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 0); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]|(cmd[1]<<8)|(cmd[2]<<16)|(cmd[3]<<24)); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x0f); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, u32MemAdr); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 4 | (1<<7) | ((u32Sz & 0xfffff) << 8)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)&val); + if(M2M_SUCCESS != ret) break; + } + while(val != 1); + + return ret; +} + +/** +* @fn spi_flash_read_internal +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32Addr +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @note Data size must be < 64KB (limitation imposed by the bus wrapper) +*/ +static int8_t spi_flash_read_internal(uint8_t *pu8Buf, uint32_t u32Addr, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + /* read size must be < 64KB */ + ret = spi_flash_load_to_cortus_mem(HOST_SHARE_MEM_BASE, u32Addr, u32Sz); + if(M2M_SUCCESS != ret) goto ERR; + ret = nm_read_block(HOST_SHARE_MEM_BASE, pu8Buf, u32Sz); +ERR: + return ret; +} + +/** +* @fn spi_flash_pp +* @brief Program data of size less than a page (256 bytes) at the SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +static int8_t spi_flash_pp(uint32_t u32Offset, uint8_t *pu8Buf, uint16_t u16Sz) +{ + int8_t ret = M2M_SUCCESS; + uint8_t tmp; + int i; + int p; + int x; + + /* use shared packet memory as temp mem */ + ret += nm_write_block(HOST_SHARE_MEM_BASE, pu8Buf, u16Sz); + + for(i = 0, p = 0; (i < MAX_RETRY) && (p < MAX_PROG_CNT); i++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_page_program(HOST_SHARE_MEM_BASE, u32Offset, u16Sz) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + ret = spi_flash_write_disable(); + + if(p < MAX_PROG_CNT) + { + ret = M2M_ERR_FAIL; + } + + return ret; +} + +/** +* @fn spi_flash_rdid +* @brief Read SPI Flash ID +* @return SPI FLash ID +*/ +static uint32_t spi_flash_rdid(void) +{ + unsigned char cmd[1]; + uint32_t reg = 0; + uint32_t cnt = 0; + int8_t ret = M2M_SUCCESS; + + cmd[0] = 0x9f; + + ret += nm_write_reg(SPI_FLASH_DATA_CNT, 4); + ret += nm_write_reg(SPI_FLASH_BUF1, cmd[0]); + ret += nm_write_reg(SPI_FLASH_BUF_DIR, 0x1); + ret += nm_write_reg(SPI_FLASH_DMA_ADDR, DUMMY_REGISTER); + ret += nm_write_reg(SPI_FLASH_CMD_CNT, 1 | (1<<7)); + do + { + ret += nm_read_reg_with_ret(SPI_FLASH_TR_DONE, (uint32_t *)®); + if(M2M_SUCCESS != ret) break; + if(++cnt > 500) + { + ret = M2M_ERR_INIT; + break; + } + } + while(reg != 1); + reg = (M2M_SUCCESS == ret)?(nm_read_reg(DUMMY_REGISTER)):(0); + M2M_PRINT("Flash ID %x \n", (unsigned int)reg); + return reg; +} + +/** +* @fn spi_flash_unlock +* @brief Unlock SPI Flash +*/ +#if 0 +static void spi_flash_unlock(void) +{ + uint8_t tmp; + tmp = spi_flash_read_security_reg(); + spi_flash_clear_security_flags(); + if(tmp & 0x80) + { + spi_flash_write_enable(); + spi_flash_gang_unblock(); + } +} +#endif + +/*********************************************/ +/* GLOBAL FUNCTIONS */ +/*********************************************/ + +/** +* @fn spi_flash_read +* @brief Read from data from SPI flash +* @param[OUT] pu8Buf +* Pointer to data buffer +* @param[IN] u32offset +* Address to read from at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_read(uint8_t *pu8Buf, uint32_t u32offset, uint32_t u32Sz) +{ + int8_t ret = M2M_SUCCESS; + if(u32Sz > FLASH_BLOCK_SIZE) + { + do + { + ret = spi_flash_read_internal(pu8Buf, u32offset, FLASH_BLOCK_SIZE); + if(M2M_SUCCESS != ret) goto ERR; + u32Sz -= FLASH_BLOCK_SIZE; + u32offset += FLASH_BLOCK_SIZE; + pu8Buf += FLASH_BLOCK_SIZE; + } while(u32Sz > FLASH_BLOCK_SIZE); + } + + ret = spi_flash_read_internal(pu8Buf, u32offset, u32Sz); + +ERR: + return ret; +} + +/** +* @fn spi_flash_write +* @brief Program SPI flash +* @param[IN] pu8Buf +* Pointer to data buffer +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +*/ +int8_t spi_flash_write(uint8_t *pu8Buf, uint32_t u32Offset, uint32_t u32Sz) +{ +#ifdef PROFILING + uint32_t t1 = 0; + uint32_t percent =0; + uint32_t tpercent =0; +#endif + int8_t ret = M2M_SUCCESS; + uint32_t u32wsz; + uint32_t u32off; + uint32_t u32Blksz; + u32Blksz = FLASH_PAGE_SZ; + u32off = u32Offset % u32Blksz; +#ifdef PROFILING + tpercent = (u32Sz/u32Blksz)+((u32Sz%u32Blksz)>0); + t1 = nm_bsp_get_tick(); + M2M_PRINT(">Start programming...\r\n"); +#endif + if(u32Sz<=0) + { + M2M_ERR("Data size = %d", (int)u32Sz); + ret = M2M_ERR_FAIL; + goto ERR; + } + + if(u32off) /*first part of data in the address page*/ + { + u32wsz = u32Blksz - u32off; + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)BSP_MIN(u32Sz, u32wsz))!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + if(u32Sz < u32wsz) goto EXIT; + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; + } + while(u32Sz > 0) + { + u32wsz = BSP_MIN(u32Sz, u32Blksz); + + /*write complete page or the remaining data*/ + if(spi_flash_pp(u32Offset, pu8Buf, (uint16_t)u32wsz)!=M2M_SUCCESS) + { + ret = M2M_ERR_FAIL; + goto ERR; + } + pu8Buf += u32wsz; + u32Offset += u32wsz; + u32Sz -= u32wsz; +#ifdef PROFILING + percent++; + printf("\r>Complete Percentage = %d%%.\r", ((percent*100)/tpercent)); +#endif + } +EXIT: +#ifdef PROFILING + M2M_PRINT("\rDone\t\t\t\t\t\t"); + M2M_PRINT("\n#Programming time = %f sec\n\r", (nm_bsp_get_tick() - t1)/1000.0); +#endif +ERR: + return ret; +} + +/** +* @fn spi_flash_erase +* @brief Erase from data from SPI flash +* @param[IN] u32Offset +* Address to write to at the SPI flash +* @param[IN] u32Sz +* Data size +* @return Status of execution +* @note Data size is limited by the SPI flash size only +*/ +int8_t spi_flash_erase(uint32_t u32Offset, uint32_t u32Sz) +{ + uint32_t i = 0; + uint8_t tmp = 0; + int p; + int j; + int x; + +#ifdef PROFILING + uint32_t t; + t = nm_bsp_get_tick(); +#endif + M2M_DBG("\r\n>Start erasing...\r\n"); + for(i = u32Offset; i < (u32Sz +u32Offset); i += (16*FLASH_PAGE_SZ)) + { + for(j = 0, p = 0; (j < MAX_RETRY) && (p < MAX_PROG_CNT); j++) + { + if((spi_flash_write_enable() == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS) && + (spi_flash_sector_erase(i) == M2M_SUCCESS) && + (spi_flash_read_status_reg(&tmp) == M2M_SUCCESS)) + { + x = 0; + while(++x < MAX_ATTEMPT_STATUS_READ) + { + if(spi_flash_read_status_reg(&tmp) != M2M_SUCCESS) + { + break; + } + if(!(tmp & 0x01)) + { + p++; + break; + } + } + } + } + if(p != MAX_PROG_CNT) + { + return M2M_ERR_FAIL; + } + } + M2M_DBG("Done\r\n"); +#ifdef PROFILING + M2M_PRINT("#Erase time = %f sec\n", (nm_bsp_get_tick()-t)/1000.0); +#endif + return M2M_SUCCESS; +} + +/** +* @fn spi_flash_get_size +* @brief Get size of SPI Flash +* @return Size of Flash +*/ +uint32_t spi_flash_get_size(void) +{ + uint32_t u32FlashId = 0, u32FlashPwr = 0; + static uint32_t gu32InternalFlashSize= 0; + + if(!gu32InternalFlashSize) + { + u32FlashId = spi_flash_rdid();//spi_flash_probe(); + if(u32FlashId != 0xffffffff) + { + /*flash size is the third byte from the FLASH RDID*/ + u32FlashPwr = ((u32FlashId>>16)&0xff) - 0x11; /*2MBIT is the min*/ + /*That number power 2 to get the flash size*/ + gu32InternalFlashSize = 1<>> + +#include +// Basic configuration + +// Enable Wi-Fi Management +// Enable Wi-Fi Management +// wifi_mgmt_enable +#ifndef CONF_MGMT +#define CONF_MGMT 0 +#endif +#ifndef CONF_WINC_USE_SPI +#define CONF_WINC_USE_SPI 1 +#endif +#ifndef CONF_PERIPH +#define CONF_PERIPH 1 +#endif +#define CONF_WINC_DEBUG (0) +#define CONF_WINC_PRINTF printf + +#define NM_EDGE_INTERRUPT (1) +// + +// <<< end of configuration section >>> + +#endif // WINC1500_CONFIG_H diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf new file mode 100644 index 0000000..6bee864 Binary files /dev/null and b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf differ diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map new file mode 100644 index 0000000..2d55783 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.map @@ -0,0 +1,5334 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o (malloc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + (_printf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o (_printf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) (__floatunsisf) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +mBatteryCurrent 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +TerminalWorkString 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +gu16BufferSize 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mac_addr 0x6 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mRxData 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +mDeviceID 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o +ActualTemp 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +PowerRelayState 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o +param 0x1c build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +mModuleIPConfig 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +gsockerrno 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +astUartData 0x620 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +I2CSlaveBuffer 0xa build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +DataChunkWritten 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +mTxData 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +mI2CWaitCounter 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +gastrSockets 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +at_sb_printf 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o +mTerminalTickState 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gfpPingCb 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +gu8OpCode 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +astTimer 0xf0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d003800 0xbcd4 48340 App's exec code +.text._vfprintf_cdfFnop 0x9d00f4d4 0x13d4 5076 +.text 0x9d0108a8 0x7248 29256 App's exec code +.dinit 0x9d017af0 0xb50 2896 +.text 0x9d018640 0xb04 2820 App's exec code +.rodata 0x9d019144 0x990 2448 Read-only const +.text 0x9d019ad4 0x974 2420 App's exec code +.text._vfscanf_s 0x9d01a448 0x868 2152 +.text 0x9d01acb0 0x2a84 10884 App's exec code +.rodata 0x9d01d734 0x494 1172 Read-only const +.text 0x9d01dbc8 0x1108 4360 App's exec code +.rodata 0x9d01ecd0 0x404 1028 Read-only const +.text 0x9d01f0d4 0x1048 4168 App's exec code +.text.scale 0x9d02011c 0x2a0 672 +.text.fpsubadd 0x9d0203bc 0x278 632 +.text.malloc 0x9d020634 0x278 632 +.text 0x9d0208ac 0x26c 620 App's exec code +.rodata 0x9d020b18 0x268 616 Read-only const +.text 0x9d020d80 0x4a8 1192 App's exec code +.text.fp32div 0x9d021228 0x230 560 +.text.__floatdisf 0x9d021458 0x220 544 +.text.fp32mul 0x9d021678 0x1bc 444 +.text 0x9d021834 0x1a0 416 App's exec code +.text.realloc 0x9d0219d4 0x194 404 +.text._sbrk_init 0x9d021b68 0x194 404 +.text._filbuf 0x9d021cfc 0x188 392 +.text.read 0x9d021e84 0x174 372 +.text 0x9d021ff8 0x2d0 720 App's exec code +.text.fputc 0x9d0222c8 0x15c 348 +.text._flsbuf 0x9d022424 0x12c 300 +.text 0x9d022550 0x11c 284 App's exec code +.text.fgetc 0x9d02266c 0x108 264 +.rodata 0x9d022774 0x204 516 Read-only const +.text.setvbuf 0x9d022978 0xfc 252 +.rodata 0x9d022a74 0x4 4 Read-only const +.rodata 0x9d022a78 0xe0 224 Read-only const +.text.general_exception 0x9d022b58 0xdc 220 +.text 0x9d022c34 0x1ac 428 App's exec code +.rodata 0x9d022de0 0xc8 200 Read-only const +.text._sbrk 0x9d022ea8 0xc4 196 +.text 0x9d022f6c 0xa8 168 App's exec code +.text.atoi 0x9d023014 0xa8 168 +.text.range 0x9d0230bc 0xa0 160 +.text.fpcmp 0x9d02315c 0x9c 156 +.text.fflush 0x9d0231f8 0x94 148 +.text.write 0x9d02328c 0x94 148 +.text.libm 0x9d023320 0x88 136 +.text 0x9d0233a8 0x80 128 App's exec code +.text.fptoul 0x9d023428 0x7c 124 +.text.SoftReset 0x9d0234a4 0x78 120 +.text.fputs 0x9d02351c 0x78 120 +.text.strncmp 0x9d023594 0x78 120 +.text.ungetc 0x9d02360c 0x74 116 +.text 0x9d023680 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d023758 0x68 104 +.rodata 0x9d0237c0 0x68 104 Read-only const +.text.sitofp 0x9d023828 0x60 96 +.text.wspace 0x9d023888 0x60 96 +.text 0x9d0238e8 0x58 88 App's exec code +.text._sscanf_s 0x9d023940 0x54 84 +.text._bufallo 0x9d023994 0x54 84 +.text.sbrk 0x9d0239e8 0x50 80 +.text.main_entry 0x9d023a38 0x4c 76 +.text 0x9d023a84 0x4c 76 App's exec code +.text._bootstrap_except 0x9d023ad0 0x48 72 +.text 0x9d023b18 0x44 68 App's exec code +.text.puts 0x9d023b5c 0x44 68 +.text._printf_cdfFnopsu 0x9d023ba0 0x40 64 +.vector_default 0x9d023be0 0x38 56 +.rodata 0x9d023c18 0x30 48 Read-only const +.text.INTConfigureSyste 0x9d023c48 0x30 48 +.text.free 0x9d023c78 0x30 48 +.rodata 0x9d023ca8 0x2c 44 Read-only const +.text._stub_sbd_memlayo 0x9d023cd4 0x2c 44 +.rodata 0x9d023d00 0x28 40 Read-only const +.text.tolower 0x9d023d28 0x24 36 +.text.toupper 0x9d023d4c 0x24 36 +.text 0x9d023d70 0x20 32 App's exec code +.rodata 0x9d023d90 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d023dac 0x1c 28 +.text.setbuf 0x9d023dc8 0x1c 28 +.rodata 0x9d023de4 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d023dfc 0x18 24 +.text.CheKseg0CacheOn 0x9d023e14 0x18 24 +.text 0x9d023e2c 0x18 24 App's exec code +.text.isalnum 0x9d023e44 0x18 24 +.text.isalpha 0x9d023e5c 0x18 24 +.text.iscntrl 0x9d023e74 0x18 24 +.text.isdigit 0x9d023e8c 0x18 24 +.text.isgraph 0x9d023ea4 0x18 24 +.text.islower 0x9d023ebc 0x18 24 +.text.isprint 0x9d023ed4 0x18 24 +.text.ispunct 0x9d023eec 0x18 24 +.text.isspace 0x9d023f04 0x18 24 +.text.isupper 0x9d023f1c 0x18 24 +.text.isxdigit 0x9d023f34 0x18 24 +.text._buffree 0x9d023f4c 0x14 20 +.text.__exception_handl 0x9d023f60 0xc 12 +.rodata 0x9d023f6c 0x1c 28 Read-only const +.text.INTEnableInterrup 0x9d023f88 0x8 8 +.text.INTDisableInterru 0x9d023f90 0x8 8 +.text._on_reset 0x9d023f98 0x8 8 +.text._on_bootstrap 0x9d023fa0 0x8 8 +.text.isascii 0x9d023fa8 0x8 8 +.text.toascii 0x9d023fb0 0x8 8 +.text._tolower 0x9d023fb8 0x8 8 +.text._toupper 0x9d023fc0 0x8 8 +.text.getpagesize 0x9d023fc8 0x8 8 +.rodata 0x9d023fd0 0x8 8 Read-only const +.rodata 0x9d023fd8 0x4 4 Read-only const + Total kseg0_program_mem used : 0x207dc 133084 26.1% of 0x7c7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- + Total kseg0_boot_mem used : 0 0 <1% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d002180 0x10 16 General-Exception +.vector_0 0x9d002200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d002220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d002240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d002260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d002280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0022a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0022c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0022e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d002300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d002320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d002340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d002360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d002380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0023a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0023c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0023e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d002400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d002420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d002440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d002460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d002480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0024a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0024c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0024e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d002500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d002520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d002540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d002560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d002580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0025a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0025c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0025e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d002600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d002620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d002640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d002660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d002680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0026a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0026c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0026e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d002700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d002720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d002740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d002760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d002780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0027a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0027c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0027e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d002800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d002820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d002840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d002860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d002880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0028a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0028c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0028e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d002900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d002920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d002940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d002960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d002980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0029a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0029c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0029e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x1f0 496 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x200 512 43.8% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x20bec 134124 25.9% of 0x7e47f + -------------------------------------------------------------------------- + + +kseg0 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +reserve_data_0_kseg0 0x80000000 0x200 512 + Total kseg0_data_mem used : 0x200 512 100.0% of 0x200 + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +reserve_data_0_kseg1 0xa0000000 0x200 512 +.eh_frame 0xa0000200 0x30 48 +.sdata 0xa0000230 0x74 116 Small init data +.sbss 0xa00002a4 0x194 404 Small uninit data +.bss 0xa0000438 0x2e30 11824 Uninitialized data +.data 0xa0003268 0x4bc 1212 Initialized data +.bss 0xa0003724 0x800 2048 Uninitialized data +.data 0xa0003f24 0x2c4 708 Initialized data +.bss 0xa00041e8 0x74 116 Uninitialized data + Total kseg1_data_mem used : 0x425c 16988 25.9% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x445c 17500 26.5% of 0x10200 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa0004260 0x200 512 Reserved for heap +stack 0xa0004478 0xbb78 47992 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_data_mem 0x80000000 0x00000200 +kseg1_data_mem 0xa0000000 0x00010000 w !x +kseg0_boot_mem 0x9d003000 0x000007f0 +kseg1_boot_mem 0xbfc00000 0x00000490 +kseg0_program_mem 0x9d003800 0x0007c7ff xr +exception_mem 0x9d002000 0x00001000 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + + +reserve_data_0_kseg0 + 0x80000000 0x200 + 0x80000000 0x2 SHORT 0x0 + 0x000001fd . = 0x1fd + *fill* 0x80000002 0x1fb + 0x80000200 . = ALIGN (0x4) + *fill* 0x800001fd 0x3 + +reserve_data_0_kseg1 + 0xa0000000 0x200 + 0xa0000000 0x2 SHORT 0x0 + 0x000001fd . = 0x1fd + *fill* 0xa0000002 0x1fb + 0xa0000200 . = ALIGN (0x4) + *fill* 0xa00001fd 0x3 + +reserve_boot_0x1fc02000_kseg0 + 0x9fc02000 0xff0 + 0x9fc02000 0x2 SHORT 0x0 + 0x00000500 . = 0x500 + *fill* 0x9fc02002 0x4fe + 0x9fc02500 . = ALIGN (0x4) + 0x9fc02500 0x2 SHORT 0x0 + 0x00000ff0 . = 0xff0 + *fill* 0x9fc02502 0xaee + 0x9fc02ff0 . = ALIGN (0x4) + +reserve_boot_0x1fc02000_kseg1 + 0xbfc02000 0xff0 + 0xbfc02000 0x2 SHORT 0x0 + 0x00000500 . = 0x500 + *fill* 0xbfc02002 0x4fe + 0xbfc02500 . = ALIGN (0x4) + 0xbfc02500 0x2 SHORT 0x0 + 0x00000ff0 . = 0xff0 + *fill* 0xbfc02502 0xaee + 0xbfc02ff0 . = ALIGN (0x4) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Util.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/main.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/system.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/template.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/timer.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000001 __MPLAB_DEBUG = 0x1 + 0x00000001 __DEBUG = 0x1 + 0x00000001 __MPLAB_DEBUGGER_ICD3 = 0x1 + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d002000 _ebase_address = 0x9d002000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d002180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x1f0 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + *(.reset.startup) + .reset.startup + 0xbfc00008 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d002180 0x10 + *(.gen_handler) + .gen_handler 0x9d002180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d002200 0x8 + *(.vector_0) + .vector_0 0x9d002200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d002200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d002220 0x8 + *(.vector_1) + .vector_1 0x9d002220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d002220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d002240 0x8 + *(.vector_2) + .vector_2 0x9d002240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d002240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d002260 0x8 + *(.vector_3) + .vector_3 0x9d002260 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0x9d002260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d002280 0x8 + *(.vector_4) + .vector_4 0x9d002280 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0x9d002280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0022a0 0x8 + *(.vector_5) + .vector_5 0x9d0022a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0022a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0022c0 0x8 + *(.vector_6) + .vector_6 0x9d0022c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0022c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0022e0 0x8 + *(.vector_7) + .vector_7 0x9d0022e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0022e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d002300 0x8 + *(.vector_8) + .vector_8 0x9d002300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d002300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d002320 0x8 + *(.vector_9) + .vector_9 0x9d002320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d002320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d002340 0x8 + *(.vector_10) + .vector_10 0x9d002340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d002340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d002360 0x8 + *(.vector_11) + .vector_11 0x9d002360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d002360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d002380 0x8 + *(.vector_12) + .vector_12 0x9d002380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d002380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0023a0 0x8 + *(.vector_13) + .vector_13 0x9d0023a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0023a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0023c0 0x8 + *(.vector_14) + .vector_14 0x9d0023c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0023c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0023e0 0x8 + *(.vector_15) + .vector_15 0x9d0023e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0023e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d002400 0x8 + *(.vector_16) + .vector_16 0x9d002400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d002400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d002420 0x8 + *(.vector_17) + .vector_17 0x9d002420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d002420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d002440 0x8 + *(.vector_18) + .vector_18 0x9d002440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d002440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d002460 0x8 + *(.vector_19) + .vector_19 0x9d002460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d002460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d002480 0x8 + *(.vector_20) + .vector_20 0x9d002480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d002480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0024a0 0x8 + *(.vector_21) + .vector_21 0x9d0024a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0024a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0024c0 0x8 + *(.vector_22) + .vector_22 0x9d0024c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0024c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0024e0 0x8 + *(.vector_23) + .vector_23 0x9d0024e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0024e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d002500 0x8 + *(.vector_24) + .vector_24 0x9d002500 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d002500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d002520 0x8 + *(.vector_25) + .vector_25 0x9d002520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d002520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d002540 0x8 + *(.vector_26) + .vector_26 0x9d002540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d002540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d002560 0x8 + *(.vector_27) + .vector_27 0x9d002560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d002560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d002580 0x8 + *(.vector_28) + .vector_28 0x9d002580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d002580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0025a0 0x8 + *(.vector_29) + .vector_29 0x9d0025a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0025a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0025c0 0x8 + *(.vector_30) + .vector_30 0x9d0025c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0025c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0025e0 0x8 + *(.vector_31) + .vector_31 0x9d0025e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0025e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d002600 0x8 + *(.vector_32) + .vector_32 0x9d002600 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d002600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d002620 0x8 + *(.vector_33) + .vector_33 0x9d002620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d002620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d002640 0x8 + *(.vector_34) + .vector_34 0x9d002640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d002640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d002660 0x8 + *(.vector_35) + .vector_35 0x9d002660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d002660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d002680 0x8 + *(.vector_36) + .vector_36 0x9d002680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d002680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0026a0 0x8 + *(.vector_37) + .vector_37 0x9d0026a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0026a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0026c0 0x8 + *(.vector_38) + .vector_38 0x9d0026c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0026c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0026e0 0x8 + *(.vector_39) + .vector_39 0x9d0026e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0026e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d002700 0x8 + *(.vector_40) + .vector_40 0x9d002700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d002700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d002720 0x8 + *(.vector_41) + .vector_41 0x9d002720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d002720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d002740 0x8 + *(.vector_42) + .vector_42 0x9d002740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d002740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d002760 0x8 + *(.vector_43) + .vector_43 0x9d002760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d002760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d002780 0x8 + *(.vector_44) + .vector_44 0x9d002780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d002780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0027a0 0x8 + *(.vector_45) + .vector_45 0x9d0027a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0027a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0027c0 0x8 + *(.vector_46) + .vector_46 0x9d0027c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0027c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0027e0 0x8 + *(.vector_47) + .vector_47 0x9d0027e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0027e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d002800 0x8 + *(.vector_48) + .vector_48 0x9d002800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d002800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d002820 0x8 + *(.vector_49) + .vector_49 0x9d002820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d002820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d002840 0x8 + *(.vector_50) + .vector_50 0x9d002840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d002840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d002860 0x8 + *(.vector_51) + .vector_51 0x9d002860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d002860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d002880 0x8 + *(.vector_52) + .vector_52 0x9d002880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d002880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0028a0 0x8 + *(.vector_53) + .vector_53 0x9d0028a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0028a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0028c0 0x8 + *(.vector_54) + .vector_54 0x9d0028c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0028c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0028e0 0x8 + *(.vector_55) + .vector_55 0x9d0028e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0028e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d002900 0x8 + *(.vector_56) + .vector_56 0x9d002900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d002900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d002920 0x8 + *(.vector_57) + .vector_57 0x9d002920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d002920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d002940 0x8 + *(.vector_58) + .vector_58 0x9d002940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d002940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d002960 0x8 + *(.vector_59) + .vector_59 0x9d002960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d002960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d002980 0x8 + *(.vector_60) + .vector_60 0x9d002980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d002980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0029a0 0x8 + *(.vector_61) + .vector_61 0x9d0029a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0029a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0029c0 0x8 + *(.vector_62) + .vector_62 0x9d0029c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0029c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0029e0 0x8 + *(.vector_63) + .vector_63 0x9d0029e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0029e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup + *(.startup) + +.text 0x9d003800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d003800 . = ALIGN (0x4) + +.init 0x9d003800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d003800 . = ALIGN (0x4) + +.fini 0x9d003800 0x0 + *(.fini) + 0x9d003800 . = ALIGN (0x4) + +.preinit_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d003800 PROVIDE (__preinit_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.init_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d003800 PROVIDE (__init_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.fini_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d003800 PROVIDE (__fini_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.ctors 0x9d003800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d003800 . = ALIGN (0x4) + +.dtors 0x9d003800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d003800 . = ALIGN (0x4) + +.rodata 0x9d003800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d003800 . = ALIGN (0x4) + +.sdata2 0x9d003000 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d003000 . = ALIGN (0x4) + +.sbss2 0x9d003000 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d003000 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d003000 . = ALIGN (0x4) + +.dbg_data 0xa0000200 0x0 + 0xa0000200 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000200 0x0 + *(.jcr) + 0xa0000200 . = ALIGN (0x4) + +.eh_frame 0xa0000200 0x30 + *(.eh_frame) + .eh_frame 0xa0000200 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000230 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000230 . = ALIGN (0x4) + +.persist 0xa0000230 0x0 + 0xa0000230 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000230 . = ALIGN (0x4) + 0xa0000230 _persist_end = . + +.data 0xa0000230 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000230 . = ALIGN (0x4) + 0xa0000230 . = . + 0xa0008220 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000230 0x0 + *(.got.plt) + *(.got) + 0xa0000230 . = ALIGN (0x4) + +.sdata 0xa0000230 0x74 + 0xa0000230 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000230 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000230 egstrNmBusCapabilities + .sdata 0xa0000234 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .sdata 0xa000023c 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .sdata 0xa0000240 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .sdata 0xa0000244 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000244 State + *fill* 0xa0000246 0x2 + .sdata 0xa0000248 0xc build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .sdata 0xa0000254 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0xa0000254 gUartStrings + .sdata 0xa0000258 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .sdata 0xa0000260 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa0000267 TerminalSocket + 0xa0000268 TerminalServerSocket + 0xa0000269 SyslogSocket + 0xa000026a SyslogServerSocket + 0xa000026b NetworkSocket + 0xa000026c NetworkServerSocket + 0xa000026d BootloaderSocket + 0xa000026e BootloaderServerSocket + 0xa000026f mWiFiState + .sdata 0xa0000270 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + 0xa0000270 mLoraPreamble + .sdata 0xa0000274 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .sdata 0xa000027c 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .sdata 0xa0000284 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .sdata 0xa000028c 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa0000292 BootloaderState + 0xa0000294 BootloaderDataStartPtr + .sdata 0xa000029c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000029c _Files + .sdata 0xa00002a0 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa00002a0 __XC_UART + 0xa00002a4 . = ALIGN (0x4) + 0xa00002a4 _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa00002a4 . = ALIGN (0x4) + 0xa00002a4 _data_end = . + 0xa00002a4 _bss_begin = . + +.sbss 0xa00002a4 0x194 + 0xa00002a4 _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa00002a4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .sbss 0xa00002a8 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + 0xa00002b0 pfWifiCb + 0xa00002b4 pfIpCb + 0xa00002b8 pfOtaCb + 0xa00002bc pfSigmaCb + 0xa00002c0 pfHifCb + 0xa00002c4 pfSSLCb + .sbss 0xa00002c8 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .sbss 0xa00002d0 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .sbss 0xa00002d8 0x14 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .sbss 0xa00002ec 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .sbss 0xa00002f0 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + *fill* 0xa00002f1 0x1 + .sbss 0xa00002f2 0x6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa00002f2 gu16SessionID + 0xa00002f4 gbSocketInit + .sbss 0xa00002f8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .sbss 0xa00002fc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00002fc LoraData + .sbss 0xa0000300 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000300 DataSize + 0xa0000304 DataCtr + 0xa0000308 BufPtr + 0xa000030c RxPtr + 0xa000030d Command + 0xa000030e CRC + 0xa000030f SenderID + 0xa0000310 SenderAddress + 0xa0000311 Flags + 0xa0000312 IsUpdating + 0xa0000314 BmpDataPtr + .sbss 0xa0000318 0xc build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .sbss 0xa0000324 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa0000324 gu32HostIp + 0xa0000328 gu8RetryCount + 0xa0000338 mWiFiInitOK + .sbss 0xa000033c 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .sbss 0xa0000340 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0xa0000340 ina219_currentDivider_mA + 0xa0000344 ina219_powerDivider_mW + .sbss 0xa0000348 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + 0xa0000348 WatchdogTriggered + .sbss 0xa000034c 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa000034c BootloaderHeader + 0xa0000350 BootloaderDataSize + 0xa0000354 BootloaderDataCtr + 0xa0000358 BootloaderBufPtr + 0xa000035c BootloaderCRC + 0xa0000360 BootloaderCommand + .sbss 0xa0000364 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .sbss 0xa0000365 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0000365 _outdone + *fill* 0xa0000366 0x2 + .sbss 0xa0000368 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0000368 __allocp + 0xa000036c __alloct + 0xa0000370 __allocx + .sbss 0xa0000378 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa0000378 errno + .sbss 0xa000037c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa000037c _minbrk + 0xa0000380 _maxbrk + *(.scommon) + .scommon 0xa0000384 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0xa0000384 at_sb_printf + .scommon 0xa0000388 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000388 mWifiSPIBaudrate + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .scommon 0xa0000389 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + *fill* 0xa0000389 0x3 + .scommon 0xa000038c 0x15 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa000038c gpfAppResolveCb + 0xa0000390 gu16BufferSize + 0xa0000394 gpfAppSocketCb + 0xa0000398 gsockerrno + 0xa000039c gfpPingCb + 0xa00003a0 gu8OpCode + .scommon 0xa00003a1 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .scommon 0xa00003a1 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + *fill* 0xa00003a1 0x3 + .scommon 0xa00003a4 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00003a4 acIntUartRxBuff + *fill* 0xa00003a6 0x2 + .scommon 0xa00003a8 0x14 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0xa00003a8 mTerminalOpened + 0xa00003ac TerminalDataPtr + 0xa00003b0 mTerminalPendingAction + 0xa00003b4 mHelpStringPtr + 0xa00003b8 mTerminalTickState + .scommon 0xa00003bc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0xa00003bc ActualTemp + .scommon 0xa00003c0 0xa build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa00003c0 u8IsMacAddrValid + 0xa00003c4 mac_addr + .scommon 0xa00003ca 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + *fill* 0xa00003ca 0x2 + .scommon 0xa00003cc 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + 0xa00003cc PowerRelayState + .scommon 0xa00003d0 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + 0xa00003d0 mBatteryCurrent + 0xa00003d4 mVoltageMeanSum + 0xa00003d8 mVoltageMeanCount + 0xa00003dc mBatterySOC + 0xa00003e0 mBatteryVoltage + 0xa00003e4 mCurrentModuleOK + .scommon 0xa00003e8 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + 0xa00003e8 mLastTransactionOK + 0xa00003ec mI2CWaitCounter + .scommon 0xa00003f0 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0xa00003f0 mSPIFlashHighSpeedBaudrate + 0xa00003f1 mSPIFlashBaudrate + *fill* 0xa00003f2 0x2 + .scommon 0xa00003f4 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0xa00003f4 mSyslogBufPtr + .scommon 0xa00003f8 0x38 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0xa00003f8 CurDataChunkSize + 0xa00003fc BootloaderFirmwareChunkWriteCount + 0xa0000400 BootloaderFlashWriteDataPtr + 0xa0000404 BootloaderFlashErased + 0xa0000408 BootloaderFlashWriteState + 0xa000040c BootloaderCurFlashWriteAddress + 0xa0000410 BooloaderFlashEraseState + 0xa0000414 BootloaderCurFlashEraseAddress + 0xa0000418 BootloaderFlashWritePollCount + 0xa000041c BootloaderInterfaceState + 0xa0000420 DataChunkWritten + 0xa0000424 BooloaderFlashErasePollCount + 0xa0000428 FirmwareUploaded + 0xa000042c CurDataChunkIndex + .scommon 0xa0000430 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .scommon 0xa0000430 0x2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + 0xa0000430 mDeviceID + *fill* 0xa0000432 0x2 + .scommon 0xa0000434 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0xa0000434 BootloaderRxPtr + 0xa0000438 _sbss_end = . + 0xa0000438 . = ALIGN (0x4) + +.bss 0xa0000438 0x2e30 + *(.dynbss) + *(COMMON) + COMMON 0xa0000438 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0xa0000438 gastrSockets + COMMON 0xa00004e8 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0xa00004e8 astInternalUartData + COMMON 0xa0000528 0x26e build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0xa0000528 mRxData + 0xa0000660 mTxData + *fill* 0xa0000796 0x2 + COMMON 0xa0000798 0x384 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0xa0000798 TerminalWorkString + 0xa00008c4 TerminalPrevDataBuf + 0xa00009f0 TerminalDataBuf + COMMON 0xa0000b1c 0x620 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0xa0000b1c astUartData + COMMON 0xa000113c 0xf0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0xa000113c astTimer + COMMON 0xa000122c 0xd04 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0xa000122c NetworkRxBuf + 0xa000162c TerminalRxBuf + 0xa0001a2c BootloaderRxBuf + 0xa0001e2c addr_in + 0xa0001e3c param + 0xa0001e58 mModuleIPConfig + 0xa0001e68 SyslogRxBuf + COMMON 0xa0001f30 0x16 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0xa0001f30 I2CSlaveBuffer + 0xa0001f3c I2CMasterBuffer + *fill* 0xa0001f46 0x2 + COMMON 0xa0001f48 0x1000 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0xa0001f48 mFlashSectorBuffer + COMMON 0xa0002f48 0x1f4 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0xa0002f48 mSyslogBuffer + COMMON 0xa000313c 0x12c build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0xa000313c BootloaderBuffer + 0xa0003268 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0003268 . = ALIGN (0x4) + 0xa0003268 _end = . + 0xa0003268 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0003268 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .mdebug.abi32 0xa0003268 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .mdebug.abi32 0xa0003268 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x248 + *(.comment) + .comment 0x00000000 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xaa8 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_aranges + 0x00000440 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_aranges + 0x00000460 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_aranges + 0x00000480 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_aranges + 0x000004a0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_aranges + 0x000004c0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_aranges + 0x000004e0 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_aranges + 0x00000500 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_aranges + 0x00000520 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_aranges + 0x00000540 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000560 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000688 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x000006a8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_aranges + 0x000006d8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x00000700 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000728 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000748 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_aranges + 0x00000768 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000788 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x000007a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000007c8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x000007f0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_aranges + 0x00000818 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000848 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000868 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000888 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x000008a8 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000948 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000968 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000988 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000009c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000009e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x00000a08 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000a28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000a48 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000a68 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_aranges + 0x00000a88 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_pubnames + 0x00000000 0x34e5 + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_pubnames + 0x00000030 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000050 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubnames + 0x000000f6 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubnames + 0x0000019c 0x8f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_pubnames + 0x0000022b 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubnames + 0x0000024e 0x173 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_pubnames + 0x000003c1 0xe5 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_pubnames + 0x000004a6 0xa6 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_pubnames + 0x0000054c 0x104 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000650 0x6fd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000d4d 0x207 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_pubnames + 0x00000f54 0xcd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_pubnames + 0x00001021 0xee build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_pubnames + 0x0000110f 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_pubnames + 0x00001132 0xb8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_pubnames + 0x000011ea 0x23 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_pubnames + 0x0000120d 0x1ce build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_pubnames + 0x000013db 0x75 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubnames + 0x00001450 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_pubnames + 0x00001481 0x24 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_pubnames + 0x000014a5 0x125 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_pubnames + 0x000015ca 0x194 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_pubnames + 0x0000175e 0x174 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_pubnames + 0x000018d2 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_pubnames + 0x000019d3 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_pubnames + 0x00001aab 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_pubnames + 0x00001adc 0x49 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_pubnames + 0x00001b25 0xec build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_pubnames + 0x00001c11 0x347 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_pubnames + 0x00001f58 0x25 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_pubnames + 0x00001f7d 0x72 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001fef 0xca build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_pubnames + 0x000020b9 0x41 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_pubnames + 0x000020fa 0x13b build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_pubnames + 0x00002235 0x1af build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_pubnames + 0x000023e4 0x92 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_pubnames + 0x00002476 0x18a build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_pubnames + 0x00002600 0xa3 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_pubnames + 0x000026a3 0x71 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_pubnames + 0x00002714 0x3b9 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_pubnames + 0x00002acd 0x7d build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_pubnames + 0x00002b4a 0x5c build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_pubnames + 0x00002ba6 0x2fb build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002ea1 0x2f build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_pubnames + 0x00002ed0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002ef0 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x00002f2b 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x00002f54 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002f7e 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x00002fa9 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00002fd4 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x00003007 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x00003027 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x0000304b 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00003073 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00003090 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_pubnames + 0x000030c2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x000030e7 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x00003110 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x0000312e 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_pubnames + 0x00003158 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00003182 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x000031a2 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x000031be 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x000031ea 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_pubnames + 0x00003216 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x00003237 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x00003255 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00003271 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x0000328c 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x0000336d 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x0000338a 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x000033a8 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x00003404 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x0000341f 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x0000343b 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x0000345d 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x00003481 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x000034a1 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubnames + 0x000034c1 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_info 0x00000000 0x40fc7 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0xd2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_info 0x000000d2 0x37b0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_info 0x00003882 0x1cee build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_info 0x00005570 0x166e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_info 0x00006bde 0x406 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_info 0x00006fe4 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_info 0x00006fe4 0x146 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_info 0x0000712a 0x11ca build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_info 0x000082f4 0x9b1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_info 0x00008ca5 0x496 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_info 0x0000913b 0xc4d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_info 0x00009d88 0x3b2f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_info 0x0000d8b7 0xa67 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_info 0x0000e31e 0x55b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_info 0x0000e879 0x6a8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_info 0x0000ef21 0x141 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_info 0x0000f062 0x986 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_info 0x0000f9e8 0x142 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_info 0x0000fb2a 0x1e42 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_info 0x0001196c 0x825 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_info 0x00012191 0x55b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_info 0x000126ec 0x115d build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_info 0x00013849 0x3b5e build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_info 0x000173a7 0x1aba build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_info 0x00018e61 0x1977 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_info 0x0001a7d8 0x1a1a build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_info 0x0001c1f2 0x151d build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_info 0x0001d70f 0x127e build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_info 0x0001e98d 0x113f build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_info 0x0001facc 0x1a49 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_info 0x00021515 0x113b build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_info 0x00022650 0x113d build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_info 0x0002378d 0x217b build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_info 0x00025908 0x3219 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_info 0x00028b21 0x131c build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_info 0x00029e3d 0x1d7d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_info 0x0002bbba 0x17a9 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_info 0x0002d363 0x1305 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_info 0x0002e668 0x18a8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_info 0x0002ff10 0x15d0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_info 0x000314e0 0x1710 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_info 0x00032bf0 0x185c build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_info 0x0003444c 0x15aa build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_info 0x000359f6 0x1330 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_info 0x00036d26 0x2b79 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_info 0x0003989f 0x1314 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_info 0x0003abb3 0x14d2 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_info 0x0003c085 0x1f95 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_info 0x0003e01a 0x2e4 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_info 0x0003e2fe 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003e3ac 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0003e467 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0003e515 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0003e5c5 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0003e677 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0003e729 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0003e80b 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0003e8c7 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0003e98b 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0003ea61 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0003ea61 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x0003eb16 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_info 0x0003ebfa 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0003ecbf 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0003ed8a 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0003ee41 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_info 0x0003ef03 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x0003efc6 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003f07e 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x0003f131 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0003f20b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0003f20b 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_info 0x0003f2f0 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003f3d0 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x0003f486 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x0003f539 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x0003f5ea 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x0003f5ea 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x0003f803 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x0003f803 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x0003f8b8 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0003f96e 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x0003fa83 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x0003fb2e 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x0003fbdb 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x0003fbdb 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x0003fca6 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x0003ff68 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x000406ea 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_info 0x00040ea2 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_abbrev 0x00000000 0x60e2 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_abbrev 0x00000025 0x1f2 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_abbrev 0x00000217 0x203 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_abbrev 0x0000041a 0x257 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_abbrev 0x00000671 0xd7 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_abbrev 0x00000748 0x1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_abbrev 0x00000749 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_abbrev 0x0000079e 0x27a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_abbrev 0x00000a18 0x175 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_abbrev 0x00000b8d 0x123 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_abbrev 0x00000cb0 0x22a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_abbrev 0x00000eda 0x26f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_abbrev 0x00001149 0x1cb build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_abbrev 0x00001314 0x111 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_abbrev 0x00001425 0x162 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_abbrev 0x00001587 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_abbrev 0x000015dc 0x1b1 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_abbrev 0x0000178d 0x55 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_abbrev 0x000017e2 0x2ae build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_abbrev 0x00001a90 0x140 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_abbrev 0x00001bd0 0xf7 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_abbrev 0x00001cc7 0x17b build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_abbrev 0x00001e42 0x2d9 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_abbrev 0x0000211b 0x295 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_abbrev 0x000023b0 0x2af build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_abbrev 0x0000265f 0x2e5 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_abbrev 0x00002944 0x26e build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_abbrev 0x00002bb2 0x1b1 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_abbrev 0x00002d63 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_abbrev 0x00002ec9 0x351 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_abbrev 0x0000321a 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_abbrev 0x00003380 0x166 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_abbrev 0x000034e6 0x226 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_abbrev 0x0000370c 0x343 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_abbrev 0x00003a4f 0x19d build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_abbrev 0x00003bec 0x281 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_abbrev 0x00003e6d 0x1c4 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_abbrev 0x00004031 0x18e build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_abbrev 0x000041bf 0x22f build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_abbrev 0x000043ee 0x26b build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_abbrev 0x00004659 0x1e9 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_abbrev 0x00004842 0x298 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_abbrev 0x00004ada 0x233 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_abbrev 0x00004d0d 0x18c build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_abbrev 0x00004e99 0x2f7 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_abbrev 0x00005190 0x1b5 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_abbrev 0x00005345 0x1c1 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_abbrev 0x00005506 0x2b3 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_abbrev 0x000057b9 0xa9 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_abbrev 0x00005862 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x00005894 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x000058b7 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000058da 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x000058fd 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x00005920 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00005943 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x00005968 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x0000598d 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x000059b2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x000059d7 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x000059d8 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x000059fd 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_abbrev 0x00005a3e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x00005a63 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x00005a88 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00005aad 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_abbrev 0x00005ad2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x00005af7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x00005b1c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x00005b41 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x00005b8a 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x00005b8b 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_abbrev 0x00005bce 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x00005c04 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x00005c29 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00005c4e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00005c73 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x00005c74 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x00005c99 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00005c9a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00005cbf 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x00005ce4 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x00005d1c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x00005d41 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x00005d66 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x00005d67 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x00005d99 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x00005e12 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00005f44 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_abbrev 0x00006083 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_line 0x00000000 0x835d + *(.debug_line) + .debug_line 0x00000000 0x8a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_line 0x0000008a 0x20d build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_line 0x00000297 0x251 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_line 0x000004e8 0x339 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_line 0x00000821 0x195 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_line 0x000009b6 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_line 0x000009b6 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_line 0x00000a30 0x3b2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_line 0x00000de2 0x22d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_line 0x0000100f 0x1e8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_line 0x000011f7 0x2cd build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_line 0x000014c4 0x568 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_line 0x00001a2c 0x34b build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_line 0x00001d77 0x207 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_line 0x00001f7e 0x27e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_line 0x000021fc 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_line 0x00002276 0x2db build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_line 0x00002551 0x7a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_line 0x000025cb 0x4ef build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_line 0x00002aba 0x2d3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_line 0x00002d8d 0x1f0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_line 0x00002f7d 0x156 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_line 0x000030d3 0x2c6 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_line 0x00003399 0x262 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_line 0x000035fb 0x3c5 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_line 0x000039c0 0x2ef build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_line 0x00003caf 0x25b build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_line 0x00003f0a 0x161 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_line 0x0000406b 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_line 0x0000416c 0x38e build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_line 0x000044fa 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_line 0x000045fb 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_line 0x000046fc 0x23b build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_line 0x00004937 0x574 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_line 0x00004eab 0x155 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_line 0x00005000 0x23d build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_line 0x0000523d 0x1b9 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_line 0x000053f6 0x16d build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_line 0x00005563 0x2d8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_line 0x0000583b 0x23e build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_line 0x00005a79 0x1f5 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_line 0x00005c6e 0x29a build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_line 0x00005f08 0x2af build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_line 0x000061b7 0x165 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_line 0x0000631c 0x4ed build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_line 0x00006809 0x193 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_line 0x0000699c 0x19a build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_line 0x00006b36 0x3b6 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_line 0x00006eec 0x137 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_line 0x00007023 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x000070d4 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00007136 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x000071a7 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00007219 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x0000728c 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x000072ff 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x00007396 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x0000741a 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x000074a2 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x00007538 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00007538 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x000075a8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_line 0x00007618 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x00007686 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x000076f6 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x00007767 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_line 0x000077d7 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x00007848 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x000078b8 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x00007927 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x00007994 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x00007994 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_line 0x00007a04 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x00007a74 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00007ae4 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00007b53 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00007bc1 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00007bc1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00007c31 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x00007c31 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00007ca1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00007d11 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x00007d89 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00007e01 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00007e7a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00007e7a 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x00007f0d 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x00008012 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x0000817a 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_line 0x000082cf 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_frame 0x00000000 0x3788 + *(.debug_frame) + .debug_frame 0x00000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_frame 0x00000020 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_frame 0x0000004c 0xfc build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_frame 0x00000148 0x9c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_frame 0x000001e4 0xd4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_frame 0x000002b8 0x208 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_frame 0x000004c0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_frame 0x000005cc 0xd4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_frame 0x000006a0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_frame 0x000007ac 0x748 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_frame 0x00000ef4 0x294 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_frame 0x00001188 0x128 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_frame 0x000012b0 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_frame 0x000013bc 0x20c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_frame 0x000015c8 0x25c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_frame 0x00001824 0x17c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_frame 0x000019a0 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_frame 0x000019cc 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_frame 0x000019f8 0x138 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_frame 0x00001b30 0x130 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_frame 0x00001c60 0xf4 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_frame 0x00001d54 0x128 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_frame 0x00001e7c 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_frame 0x00001f88 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_frame 0x00001fb4 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_frame 0x00002018 0x148 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_frame 0x00002160 0x2b8 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_frame 0x00002418 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_frame 0x00002444 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_frame 0x000024a8 0xb8 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_frame 0x00002560 0x48 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_frame 0x000025a8 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_frame 0x00002680 0x198 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_frame 0x00002818 0x9c build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_frame 0x000028b4 0x160 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_frame 0x00002a14 0xa0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_frame 0x00002ab4 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_frame 0x00002b34 0x1b4 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_frame 0x00002ce8 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_frame 0x00002d68 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_frame 0x00002dcc 0x198 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_frame 0x00002f64 0x64 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_frame 0x00002fc8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00002ff0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x00003020 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x00003040 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x00003060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00003080 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x000030a0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x000030c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x000030e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x00003108 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00003128 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00003154 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_frame 0x000031c0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x00003208 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x00003240 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00003260 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_frame 0x00003288 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x000032b4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x000032dc 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x00003308 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x00003340 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_frame 0x00003398 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x0000340c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00003434 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00003464 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00003484 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x000035a4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x000035c4 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x000035f4 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x00003680 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x000036ac 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x000036d4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x000036f4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00003720 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00003740 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_frame 0x00003760 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_str 0x00000000 0x3167 + *(.debug_str) + .debug_str 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_str 0x00000000 0x242 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_str 0x00000242 0x14a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_str 0x0000038c 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_str 0x000004d5 0xa build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_str 0x000004df 0x36 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_str 0x00000515 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_str 0x00000515 0xa build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_str 0x0000051f 0x25 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_str 0x00000544 0x178 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_str 0x000006bc 0x2d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_str 0x000006e9 0x31 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_str 0x0000071a 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_str 0x0000072c 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_str 0x0000072c 0x19 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_str 0x00000745 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_str 0x00000745 0x168 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_str 0x000008ad 0x2d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_str 0x000008da 0x16 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_str 0x000008f0 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_str 0x00000a1f 0x226 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_str 0x00000c45 0x14f build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_str 0x00000d94 0x1ac build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_str 0x00000f40 0x181 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_str 0x000010c1 0x145 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_str 0x00001206 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_str 0x00001335 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_str 0x00001464 0x14d build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_str 0x000015b1 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_str 0x000016e0 0x12f build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_str 0x0000180f 0x17f build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_str 0x0000198e 0x281 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_str 0x00001c0f 0x146 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_str 0x00001d55 0x170 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_str 0x00001ec5 0x15b build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_str 0x00002020 0x138 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_str 0x00002158 0x1ac build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_str 0x00002304 0x18b build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_str 0x0000248f 0x17e build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_str 0x0000260d 0x193 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_str 0x000027a0 0x14b build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_str 0x000028eb 0x15e build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_str 0x00002a49 0x29e build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_str 0x00002ce7 0x13a build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_str 0x00002e21 0x159 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_str 0x00002f7a 0x1ed build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_str 0x00003167 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_str 0x00003167 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_loc 0x00000000 0xfec1 + *(.debug_loc) + .debug_loc 0x00000000 0x130 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_loc 0x00000130 0x168 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_loc 0x00000298 0x4b8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_loc 0x00000750 0x59d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_loc 0x00000ced 0xcb3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_loc 0x000019a0 0x48f build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_loc 0x00001e2f 0x2e2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_loc 0x00002111 0x7ba build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_loc 0x000028cb 0x1f19 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_loc 0x000047e4 0xfbb build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_loc 0x0000579f 0x5e3 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_loc 0x00005d82 0x685 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_loc 0x00006407 0xd65 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_loc 0x0000716c 0x12f2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_loc 0x0000845e 0xd61 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_loc 0x000091bf 0x6a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_loc 0x00009229 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_loc 0x00009255 0x5ee build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_loc 0x00009843 0x369 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_loc 0x00009bac 0x25f build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_loc 0x00009e0b 0x72a build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_loc 0x0000a535 0x6a1 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_loc 0x0000abd6 0x4b build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_loc 0x0000ac21 0x31e build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_loc 0x0000af3f 0x484 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_loc 0x0000b3c3 0xa0d build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_loc 0x0000bdd0 0x56 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_loc 0x0000be26 0x3e5 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_loc 0x0000c20b 0x108 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_loc 0x0000c313 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_loc 0x0000c36b 0x1bf build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_loc 0x0000c52a 0x412 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_loc 0x0000c93c 0x21a build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_loc 0x0000cb56 0x8a5 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_loc 0x0000d3fb 0x10e build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_loc 0x0000d509 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_loc 0x0000d5b9 0x7f8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_loc 0x0000ddb1 0xb0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_loc 0x0000de61 0xf4 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_loc 0x0000df55 0x812 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_loc 0x0000e767 0x2d1 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_loc 0x0000ea38 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x0000eb01 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x0000f4c4 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_loc 0x0000fe59 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x3431 + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x276 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000276 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubtypes + 0x000003bf 0x14c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubtypes + 0x0000050b 0x3c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .debug_pubtypes + 0x00000547 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubtypes + 0x00000559 0x5e build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .debug_pubtypes + 0x000005b7 0xa2 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000659 0x48 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .debug_pubtypes + 0x000006a1 0x10c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubtypes + 0x000007ad 0x41c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00000bc9 0x40 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .debug_pubtypes + 0x00000c09 0x56 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .debug_pubtypes + 0x00000c5f 0x5a build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .debug_pubtypes + 0x00000cb9 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .debug_pubtypes + 0x00000ccb 0x47 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .debug_pubtypes + 0x00000d12 0x12 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .debug_pubtypes + 0x00000d24 0x29d build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .debug_pubtypes + 0x00000fc1 0x3c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00000ffd 0xcf build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .debug_pubtypes + 0x000010cc 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .debug_pubtypes + 0x000011b3 0x1f8 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .debug_pubtypes + 0x000013ab 0x136 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .debug_pubtypes + 0x000014e1 0x175 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .debug_pubtypes + 0x00001656 0x155 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .debug_pubtypes + 0x000017ab 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .debug_pubtypes + 0x00001892 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .debug_pubtypes + 0x00001979 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .debug_pubtypes + 0x00001a60 0x13c build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .debug_pubtypes + 0x00001b9c 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .debug_pubtypes + 0x00001c83 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .debug_pubtypes + 0x00001d6a 0x14e build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .debug_pubtypes + 0x00001eb8 0x2dc build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002194 0xfc build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .debug_pubtypes + 0x00002290 0x17e build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x0000240e 0x13f build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x0000254d 0x101 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .debug_pubtypes + 0x0000264e 0x137 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .debug_pubtypes + 0x00002785 0x121 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .debug_pubtypes + 0x000028a6 0x119 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .debug_pubtypes + 0x000029bf 0xf8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .debug_pubtypes + 0x00002ab7 0x11a build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .debug_pubtypes + 0x00002bd1 0xf8 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .debug_pubtypes + 0x00002cc9 0x2d9 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .debug_pubtypes + 0x00002fa2 0xe7 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .debug_pubtypes + 0x00003089 0x10d build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .debug_pubtypes + 0x00003196 0x149 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .debug_pubtypes + 0x000032df 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .debug_pubtypes + 0x0000330b 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x0000334b 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x000033a4 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubtypes + 0x000033fd 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_ranges 0x00000000 0x290 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000050 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_ranges 0x00000080 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000098 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x00000100 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x00000118 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_ranges 0x00000130 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000160 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000170 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000180 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x00000210 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x00000220 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000230 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000280 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + .gnu.attributes + 0x00000290 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + .gnu.attributes + 0x000002a0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .gnu.attributes + 0x000002b0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + .gnu.attributes + 0x000002c0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .gnu.attributes + 0x000002d0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + .gnu.attributes + 0x000002e0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + .gnu.attributes + 0x000002f0 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + .gnu.attributes + 0x00000300 0x10 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x00000560 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x00000570 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000580 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .gnu.attributes + 0x00000590 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_775F512H_/debug/ChaletLora.X.debug.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0004478 0x400 + .stack 0xa0004478 0x400 stack + +.data 0xa0003268 0x4bc + .data 0xa0003268 0x4bc build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.bss 0xa0003724 0x800 + .bss 0xa0003724 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .bss 0xa0003b24 0x400 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + +.data 0xa0003f24 0x2c4 + .data 0xa0003f24 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003f24 _iob + .data 0xa0003fc4 0x6c build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + .data 0xa0004030 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + .data 0xa0004088 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + .data 0xa00040e0 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .data 0xa0004138 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + .data 0xa0004190 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.bss 0xa00041e8 0x74 + .bss 0xa00041e8 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa00041e8 _sibuf + 0xa0004208 _sobuf + .bss 0xa0004228 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa0004244 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0004244 __allocs + .bss 0xa0004254 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa0004258 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z23 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z24 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z40 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z41 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z43 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z44 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z60 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.bss%z61 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z62 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z63 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z64 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z65 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z66 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z67 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z68 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z69 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z70 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z71 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z72 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z73 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z74 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z75 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z76 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z77 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z78 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z79 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z80 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z81 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z82 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z83 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z84 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z85 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z86 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z87 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z88 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z89 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z90 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z91 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z92 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z93 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z94 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z95 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z96 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z97 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z98 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z99 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z100 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z101 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z102 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z103 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z104 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z105 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z106 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z107 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z108 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z109 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z110 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z111 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z112 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z113 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z114 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z115 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z116 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z117 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z118 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z119 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z120 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z121 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z122 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z123 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z124 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z125 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z126 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z127 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z128 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z129 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z130 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z131 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z132 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z133 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z134 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z135 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z136 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z137 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z138 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z139 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z140 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z141 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z142 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z143 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z144 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z145 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z146 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z147 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z148 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z149 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z150 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z151 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z152 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z153 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z154 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z155 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z156 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z157 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z158 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z159 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z160 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z161 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z162 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z163 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z164 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z165 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z166 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z167 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z168 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z169 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z170 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z171 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z172 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z173 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z174 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z175 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z176 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z177 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z178 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z179 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z180 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z181 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z182 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z183 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z184 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z185 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z186 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z187 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z188 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z189 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z190 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z191 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z192 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z193 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z194 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z195 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z196 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z197 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z198 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z199 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z200 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z201 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z202 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z203 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z204 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z205 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z208 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z212 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z213 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z214 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z215 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z216 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z217 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z218 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z219 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z220 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z221 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z222 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z229 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.bss%z231 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.data%z232 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.bss%z233 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + +.bss%z239 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.data%z240 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.bss%z241 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + +.data%z242 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + +.bss%z243 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + +.data%z244 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + +.bss%z245 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + +.data%z251 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + +.bss%z252 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + +.data%z253 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + +.bss%z254 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + +.data%z255 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + +.bss%z256 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.data%z257 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.bss%z258 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.data%z259 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.bss%z260 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.data%z262 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.bss%z263 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + +.data%z264 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + +.bss%z265 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + +.data%z266 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + +.bss%z267 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.data%z268 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.bss%z269 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + +.data%z275 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + +.bss%z276 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + +.data%z277 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + +.bss%z278 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + +.data%z279 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + +.bss%z280 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + +.data%z281 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + +.bss%z282 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.data%z283 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.bss%z284 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.data%z285 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.bss%z286 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.data%z287 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.bss%z288 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + +.data%z289 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + +.bss%z290 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + +.data%z291 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + +.bss%z292 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + +.data%z293 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + +.bss%z294 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + +.data%z295 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + +.bss%z296 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.data%z305 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.bss%z306 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.data%z307 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.bss%z308 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + +.data%z309 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + +.bss%z310 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.data%z311 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.bss%z312 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + +.data%z313 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + +.bss%z314 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + +.data%z315 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + +.bss%z316 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.data%z317 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.bss%z318 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z319 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.text 0x9d003800 0xbcd4 + .text 0x9d003800 0x2904 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_wifi.o + 0x9d003fb4 m2m_wifi_download_mode + 0x9d0042f4 m2m_wifi_ble_set_gain_table + 0x9d004368 m2m_wifi_init_hold + 0x9d0043ac m2m_wifi_init_start + 0x9d0044f8 m2m_wifi_init + 0x9d004554 m2m_wifi_deinit + 0x9d00459c m2m_wifi_reinit_hold + 0x9d0045d8 m2m_wifi_reinit_start + 0x9d004610 m2m_wifi_reinit + 0x9d004670 m2m_wifi_yield + 0x9d0046a0 m2m_wifi_handle_events + 0x9d0046d4 m2m_wifi_default_connect + 0x9d004720 m2m_wifi_connect + 0x9d004794 m2m_wifi_connect_sc + 0x9d004bd8 m2m_wifi_disconnect + 0x9d004c24 m2m_wifi_set_mac_address + 0x9d004c90 m2m_wifi_set_static_ip + 0x9d004d24 m2m_wifi_request_dhcp_client + 0x9d004d48 m2m_wifi_request_dhcp_server + 0x9d004d70 m2m_wifi_enable_dhcp + 0x9d004de8 m2m_wifi_set_lsn_int + 0x9d004e3c m2m_wifi_set_cust_InfoElement + 0x9d004e9c m2m_wifi_set_scan_options + 0x9d004f14 m2m_wifi_set_scan_region + 0x9d004f84 m2m_wifi_request_scan + 0x9d00502c m2m_wifi_request_scan_passive + 0x9d0050d4 m2m_wifi_wps + 0x9d005160 m2m_wifi_wps_disable + 0x9d0051b8 m2m_wifi_p2p + 0x9d005264 m2m_wifi_p2p_disconnect + 0x9d0052bc m2m_wifi_enable_ap + 0x9d005334 m2m_wifi_disable_ap + 0x9d00538c m2m_wifi_req_curr_rssi + 0x9d0053e4 m2m_wifi_req_restrict_ble + 0x9d00543c m2m_wifi_req_unrestrict_ble + 0x9d005494 m2m_wifi_send_ethernet_pkt + 0x9d005534 m2m_wifi_get_otp_mac_address + 0x9d0055b0 m2m_wifi_get_mac_address + 0x9d005624 m2m_wifi_req_scan_result + 0x9d005690 m2m_wifi_get_num_ap_found + 0x9d0056b8 m2m_wifi_get_sleep_mode + 0x9d0056e8 m2m_wifi_set_sleep_mode + 0x9d005774 m2m_wifi_request_sleep + 0x9d0057f8 m2m_wifi_set_device_name + 0x9d005894 m2m_wifi_get_chipId + 0x9d0058c4 m2m_wifi_get_firmware_version + 0x9d005928 m2m_wifi_check_ota_rb + 0x9d005994 m2m_ota_get_firmware_version + 0x9d0059f8 m2m_wifi_enable_monitoring_mode + 0x9d005aac m2m_wifi_disable_monitoring_mode + 0x9d005af8 m2m_wifi_send_wlan_pkt + 0x9d005b94 m2m_wifi_start_provision_mode + 0x9d005c8c m2m_wifi_stop_provision_mode + 0x9d005cd8 m2m_wifi_get_connection_info + 0x9d005d24 m2m_wifi_set_sytem_time + 0x9d005d78 m2m_wifi_get_sytem_time + 0x9d005dc4 m2m_wifi_enable_sntp + 0x9d005e3c m2m_wifi_set_power_profile + 0x9d005ea8 m2m_wifi_set_tx_power + 0x9d005f14 m2m_wifi_enable_firmware_logs + 0x9d005f80 m2m_wifi_set_battery_voltage + 0x9d005ff0 m2m_wifi_prng_get_random_bytes + 0x9d006090 m2m_wifi_ble_api_send + .text 0x9d006104 0x2140 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/socket/source/socket.o + 0x9d006104 Socket_ReadSocketData + 0x9d006a3c socketInit + 0x9d006ab0 socketDeinit + 0x9d006b10 registerSocketCallback + 0x9d006b48 socket + 0x9d006dd0 bind + 0x9d006f00 listen + 0x9d006fe8 accept + 0x9d00705c connect + 0x9d0071d4 send + 0x9d007378 sendto + 0x9d007510 recv + 0x9d0076f8 close + 0x9d007838 recvfrom + 0x9d007a28 nmi_inet_addr + 0x9d007b9c gethostbyname + 0x9d007fd4 setsockopt + 0x9d008160 getsockopt + 0x9d00819c m2m_ping_req + .text 0x9d008244 0x1a7c build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + 0x9d008244 InitUart + 0x9d0084f4 UartResetPort + 0x9d0087a8 UartOpenComPort + 0x9d008998 UartReceiveData + 0x9d008ae4 UartGetPendingDataSize + 0x9d008bdc UartTransmitData + 0x9d009320 DataSentNotification + 0x9d0095f4 UartTick + 0x9d009bcc UartBlockAndTick + 0x9d009c2c UartBlockUntillBufEmpty + .text 0x9d009cc0 0x18ac build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + 0x9d00a83c InitWiFi + 0x9d00ab14 TurnOFFWiFi + 0x9d00aba8 CloseSockets + 0x9d00ac94 GetWiFiSate + 0x9d00acb8 TickWiFi + 0x9d00ada4 OpenTerminalServer + 0x9d00ae60 SendTerminalData + 0x9d00aee8 SentTerminalByte + 0x9d00af64 OpenNetworkServer + 0x9d00b020 SendNetworkData + 0x9d00b0a8 SentNetworkByte + 0x9d00b124 OpenSyslogServer + 0x9d00b1e0 SendSyslogData + 0x9d00b258 SendSyslogByte + 0x9d00b2d4 IsSyslogClientConnected + 0x9d00b314 OpenBootloaderServer + 0x9d00b3d0 CloseBootloaderServer + 0x9d00b438 SendBootloaderData + 0x9d00b4b0 SendSBootloaderByte + 0x9d00b52c IsBootloaderClientConnected + .text 0x9d00b56c 0x15c0 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + 0x9d00b56c BootloaderInterfaceInit + 0x9d00b5c0 BootloaderInterfaceTick + 0x9d00b5f8 BootloaderExecuteCmd + 0x9d00b834 BootloaderCRCError + 0x9d00b89c BootloaderInterfaceStateMachine + 0x9d00c100 BootloaderResetStateMachine + 0x9d00c15c BootloaderActivateBootloader + 0x9d00c19c BootloaderDeactivateBootloader + 0x9d00c1cc BootloaderFlashEraseStateMachine + 0x9d00c400 ResetBootloaderFlashEraseStateMachine + 0x9d00c434 BootloaderFlashWriteStateMachine + 0x9d00c660 BootloaderPrintFlashData + 0x9d00c680 BootloaderCheckFlashBootloaderData + 0x9d00ca34 ResetBootloaderFlashWriteStateMachine + 0x9d00ca74 BootloaderBytesToInt + .text 0x9d00cb2c 0x1584 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmasic.o + 0x9d00cb2c chip_apply_conf + 0x9d00cbe0 nm_clkless_wake + 0x9d00ce20 chip_idle + 0x9d00ce94 enable_rf_blocks + 0x9d00cf34 enable_interrupts + 0x9d00d03c cpu_start + 0x9d00d1b8 nmi_get_chipid + 0x9d00d3d0 nmi_get_rfrevid + 0x9d00d428 restore_pmu_settings_after_global_reset + 0x9d00d47c nmi_update_pll + 0x9d00d4f0 nmi_set_sys_clk_src_to_xo + 0x9d00d54c chip_wake + 0x9d00d5a0 chip_reset_and_cpu_halt + 0x9d00d734 chip_reset + 0x9d00d79c wait_for_bootrom + 0x9d00d928 wait_for_firmware_start + 0x9d00da48 chip_deinit + 0x9d00db64 set_gpio_dir + 0x9d00dc38 set_gpio_val + 0x9d00dd0c get_gpio_val + 0x9d00dd98 pullup_ctrl + 0x9d00de50 nmi_get_otp_mac_address + 0x9d00dfb0 nmi_get_mac_address + .text 0x9d00e0b0 0x1424 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_hif.o + 0x9d00e1e8 hif_chip_wake + 0x9d00e2b4 hif_set_sleep_mode + 0x9d00e2e4 hif_get_sleep_mode + 0x9d00e30c hif_chip_sleep + 0x9d00e430 hif_init + 0x9d00e49c hif_deinit + 0x9d00e4fc hif_check_compatibility + 0x9d00e574 hif_enable_access + 0x9d00e694 hif_check_code + 0x9d00e784 hif_send + 0x9d00f09c hif_yield + 0x9d00f0c4 hif_handle_isr + 0x9d00f190 hif_receive + 0x9d00f3ec hif_register_cb + +.text._vfprintf_cdfFnopsuxX + 0x9d00f4d4 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d00f4d4 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d00f4d4 _vfprintf_cdfFnopsuxX + 0x9d00f4d4 _vfprintf_cdfFnopuxX + 0x9d00f4d4 _vfprintf_cdnopsuxX + 0x9d00f4d4 _vfprintf_fF + 0x9d00f4d4 _vfprintf_cdnopuxX + +.text 0x9d0108a8 0x7248 + .text 0x9d0108a8 0x117c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/spi_flash/source/spi_flash.o + 0x9d0115a8 spi_flash_read + 0x9d011680 spi_flash_write + 0x9d011858 spi_flash_erase + 0x9d0119a4 spi_flash_get_size + .text 0x9d011a24 0x1108 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + 0x9d0124c0 nm_spi_write_reg + 0x9d012598 nm_spi_write_block + 0x9d0126a0 nm_spi_read_reg_with_ret + 0x9d0127ec nm_spi_read_block + 0x9d0129a8 nm_spi_init + 0x9d012ac0 nm_spi_deinit + 0x9d012ae8 nm_spi_read_reg + .text 0x9d012b2c 0xf40 build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + 0x9d012b2c InternalUartInit + 0x9d012d04 OpenInternalPort + 0x9d012f24 SendInternalUartData + 0x9d013240 SendInternalUartDataBlocking + 0x9d013318 TickInternalUart + 0x9d0133f0 InternalUart1AInterrupt + 0x9d01362c InternalUart2Interrupt + 0x9d01384c ResetUart1 + 0x9d013954 ResetUart2 + 0x9d013a4c process + .text 0x9d013a6c 0xe68 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + 0x9d013a6c InitTerminal + 0x9d013aec TickTerminal + 0x9d013b48 RxTerminalBuf + 0x9d013bd4 RxTerminalData + 0x9d013d24 ParseNewBuffer + 0x9d014820 TerminalPrintString + 0x9d014874 TerminalPrintChar + 0x9d0148b4 TerminalStateMachine + .text 0x9d0148d4 0xda8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + 0x9d0148d4 InitSPIFlash + 0x9d014a48 SPIFlashCheckAndConfigure + 0x9d014b18 SPIFlashWriteEnable + 0x9d014b7c SPIFlashReadStatusReg + 0x9d014c24 SPIFlashCheckBusy + 0x9d014c80 SPIFlashCheckChipID + 0x9d014dbc SPIFlashReadBuffer + 0x9d014f3c SPIFlashEraseSector + 0x9d015064 SPIFlashErase64KSector + 0x9d0151b8 SPIFlashWriteSectorWorkingBuffer + 0x9d015374 SPIFlashWriteByte + 0x9d0154c8 SPIFlashWriteBuffer + .text 0x9d01567c 0xce8 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + 0x9d01567c SwapEndianShort + 0x9d0156c8 SwapEndianInt + 0x9d015724 ConvertIntToStrLeadingZero + 0x9d015b48 ConvertIntToStr + 0x9d015e9c ConvertCharToStrLeadingZero + 0x9d016004 ConvertStrToValue + 0x9d0161f0 ConvertCharToStr + 0x9d0162a8 Crc8 + 0x9d016340 Delay + .text 0x9d016364 0xbf4 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ssl.o + 0x9d016670 m2m_ssl_handshake_rsp + 0x9d0166e8 m2m_ssl_send_certs_to_winc + 0x9d016a30 m2m_ssl_retrieve_cert + 0x9d016d6c m2m_ssl_retrieve_hash + 0x9d016e2c m2m_ssl_stop_processing_certs + 0x9d016e6c m2m_ssl_ecc_process_done + 0x9d016e90 m2m_ssl_set_active_ciphersuites + 0x9d016ef8 m2m_ssl_init + .text 0x9d016f58 0xb98 build/ChaletDuinoV2_775F512H_/debug/Source/timer.o + 0x9d016f58 TimerInit + 0x9d017028 IsMilliSecTimerExpired + 0x9d017190 IsSecTimerExpired + 0x9d0172f4 IsTimerExpired + 0x9d0176a8 TimerStart + 0x9d0177d0 TimerStartSeconds + 0x9d017874 TimerReset + 0x9d0178f8 IsTimerRunning + 0x9d01793c TimerStop + 0x9d017980 Sleep + 0x9d0179dc Timer1MilliSecInterrupt + +.dinit 0x9d017af0 0xb50 + .dinit 0x9d017af0 0xb50 data_init + +.text 0x9d018640 0xb04 + .text 0x9d018640 0xb04 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + 0x9d018640 BootloaderProtocolInit + 0x9d018670 BootloaderProtocolStateMachine + 0x9d018a74 BootloaderProtocolProtocolAnalyzeNewData + 0x9d018af0 BootloaderProtocolResetStateMachine + 0x9d018b3c BootloaderProtocolSendFrame + 0x9d018cb4 BootloaderProtocolGetDataBufferPtr + 0x9d018cd8 BootloaderProtocolSendHeartbeat + 0x9d018d20 BootloaderProtocolSendACK + 0x9d018d74 BootloaderProtocolSendNACK + 0x9d018dc4 BootloaderProtocolSendInitUploadResponse + 0x9d018f24 BootloaderProtocolSendDataChunkResult + 0x9d019018 BootloaderProtocolSendBootloaderState + 0x9d01907c BootloaderProtocolSendFirmwareUploadResult + 0x9d0190e0 BootloaderProtocolSendFlashCheckResult + +.rodata 0x9d019144 0x990 + .rodata 0x9d019144 0x990 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderInterface.o + +.text 0x9d019ad4 0x974 + .text 0x9d019ad4 0x974 build/ChaletDuinoV2_775F512H_/debug/Source/NetworkProtocol.o + 0x9d019ad4 ProtocolInit + 0x9d019b04 StateMachine + 0x9d01a080 ProtocolAnalyzeNewData + 0x9d01a0c0 ResetStateMachine + 0x9d01a108 ProtocolExecCmd + 0x9d01a144 ProtocolAcknowledge + 0x9d01a1a8 ProtocolCalcCrc + 0x9d01a224 ProtocolIsReceiving + 0x9d01a264 ProtocolGetFrame + 0x9d01a420 ProtocolMsgDataPtr + +.text._vfscanf_s + 0x9d01a448 0x868 + .text._vfscanf_s + 0x9d01a448 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01a448 _vfscanf_s + 0x9d01a448 _vfscanf_0 + +.text 0x9d01acb0 0x2a84 + .text 0x9d01acb0 0x740 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmdrv.o + 0x9d01acb0 nm_get_hif_info + 0x9d01ad50 nm_get_firmware_full_info + 0x9d01aee4 nm_get_ota_firmware_info + 0x9d01b078 nm_drv_init_download_mode + 0x9d01b0f4 nm_drv_init_hold + 0x9d01b1a0 nm_drv_init_start + 0x9d01b2d4 nm_drv_init + 0x9d01b338 nm_drv_deinit + 0x9d01b3b8 nm_cpu_start + .text 0x9d01b3f0 0x6fc build/ChaletDuinoV2_775F512H_/debug/Source/ChaletduinoV2Board.o + 0x9d01b3f0 InitBoard + .text 0x9d01baec 0x674 build/ChaletDuinoV2_775F512H_/debug/Source/LoraNetworkInterface.o + 0x9d01baec ExecuteMasterCommand + 0x9d01c070 SendLoraNetworkCommand + 0x9d01c118 TestTx + .text 0x9d01c160 0x654 build/ChaletDuinoV2_775F512H_/debug/Source/ina219.o + 0x9d01c368 ina219SetCalibration_13V_10A + 0x9d01c3cc ina219SetCalibration_32V_2A + 0x9d01c430 ina219SetCalibration_32V_1A + 0x9d01c494 ina219SetCalibration_16V_500mA + 0x9d01c4f8 ina219SetCalibration_16V_200mA + 0x9d01c55c ina219Init + 0x9d01c5dc ina219GetShuntVoltage + 0x9d01c620 ina219GetBusVoltage + 0x9d01c674 ina219GetPower + 0x9d01c6b8 ina219GetPower_mW + 0x9d01c714 ina219GetCurrent + 0x9d01c758 ina219GetCurrent_mA + .text 0x9d01c7b4 0x574 build/ChaletDuinoV2_775F512H_/debug/Source/I2C.o + 0x9d01c7b4 I2CInit + 0x9d01c820 I2CWrite + 0x9d01c9e4 I2CTransmitByte + 0x9d01ca10 I2CRead + 0x9d01cd04 I2CWasLastTransactionOK + .text 0x9d01cd28 0x51c build/ChaletDuinoV2_775F512H_/debug/Source/main.o + 0x9d01cd28 main + 0x9d01d204 _mon_putc + .text 0x9d01d244 0x4f0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ota.o + 0x9d01d37c m2m_ota_init + 0x9d01d3f0 m2m_ota_notif_set_url + 0x9d01d464 m2m_ota_notif_check_for_update + 0x9d01d4bc m2m_ota_notif_sched + 0x9d01d518 m2m_ota_start_update + 0x9d01d58c m2m_ota_rollback + 0x9d01d634 m2m_ota_abort + 0x9d01d68c m2m_ota_switch_firmware + +.rodata 0x9d01d734 0x494 + .rodata 0x9d01d734 0x494 build/ChaletDuinoV2_775F512H_/debug/Source/Terminal.o + +.text 0x9d01dbc8 0x1108 + .text 0x9d01dbc8 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d01dbc8 __umoddi3 + .text 0x9d01e024 0x454 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmbus.o + 0x9d01e024 nm_bus_iface_init + 0x9d01e070 nm_bus_iface_deinit + 0x9d01e0ac nm_bus_iface_reconfigure + 0x9d01e0d8 nm_read_reg + 0x9d01e110 nm_read_reg_with_ret + 0x9d01e150 nm_write_reg + 0x9d01e1e0 nm_read_block + 0x9d01e354 nm_write_block + .text 0x9d01e478 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01e478 __udivdi3 + .text 0x9d01e8c4 0x40c build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/common/source/nm_common.o + 0x9d01e8c4 m2m_memcpy + 0x9d01e948 m2m_checksum + 0x9d01e9b8 m2m_memset + 0x9d01ea30 m2m_strlen + 0x9d01ea8c m2m_strncmp + 0x9d01eb60 m2m_strstr + 0x9d01ec38 m2m_memcmp + +.rodata 0x9d01ecd0 0x404 + .rodata 0x9d01ecd0 0x404 build/ChaletDuinoV2_775F512H_/debug/Source/Util.o + 0x9d01ecd4 CRC8_TABLE + +.text 0x9d01f0d4 0x1048 + .text 0x9d01f0d4 0x390 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0x9d01f0d4 nm_spi_rw + 0x9d01f294 nm_bus_init + 0x9d01f380 nm_bus_ioctl + 0x9d01f414 nm_bus_deinit + 0x9d01f43c nm_bus_reinit + .text 0x9d01f464 0x380 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_periph.o + 0x9d01f674 m2m_periph_init + 0x9d01f69c m2m_periph_gpio_set_dir + 0x9d01f6f4 m2m_periph_gpio_set_val + 0x9d01f74c m2m_periph_gpio_get_val + 0x9d01f79c m2m_periph_pullup_ctrl + .text 0x9d01f7e4 0x378 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + 0x9d01f7e4 TC77Configure + 0x9d01fa34 TC77GetActualTemp + 0x9d01fb38 TC77GetDeviceID + .text 0x9d01fb5c 0x2f8 build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + 0x9d01fb5c InitBatteryMonitor + 0x9d01fbcc BatteryMonitorTick + 0x9d01fd40 GetBatteryVoltage + 0x9d01fda8 GetSolarPanelCurrent + 0x9d01fdcc GetBatterySOC + 0x9d01fdf0 SendNetworkBatteryData + 0x9d01fe30 GetCurrentModuleOK + .text 0x9d01fe54 0x2c8 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/bsp/source/nm_bsp.o + 0x9d01fe54 chip_isr + 0x9d01ff84 nm_bsp_init + 0x9d01ffac nm_bsp_deinit + 0x9d01ffd0 nm_bsp_reset + 0x9d020058 nm_bsp_sleep + 0x9d020090 nm_bsp_register_isr + 0x9d0200bc nm_bsp_interrupt_ctrl + +.text.scale 0x9d02011c 0x2a0 + .text.scale 0x9d02011c 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d0203bc 0x278 + .text.fpsubadd + 0x9d0203bc 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d0203bc __subsf3 + 0x9d0203bc fpsub + 0x9d0203c4 __addsf3 + 0x9d0203c4 fpadd + +.text.malloc 0x9d020634 0x278 + .text.malloc 0x9d020634 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d020634 malloc + +.text 0x9d0208ac 0x26c + .text 0x9d0208ac 0x26c build/ChaletDuinoV2_775F512H_/debug/Source/crc32.o + 0x9d0208ac crc_32 + 0x9d0209a4 update_crc_32 + +.rodata 0x9d020b18 0x268 + .rodata 0x9d020b18 0x268 build/ChaletDuinoV2_775F512H_/debug/Source/WiFiCtrl.o + +.text 0x9d020d80 0x4a8 + .text 0x9d020d80 0x260 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + 0x9d020d80 InitChaletPowerRelay + 0x9d020ddc ChaletPowerRelayTick + 0x9d020ee0 ChaletPowerRelayKickTimer + 0x9d020f18 ChaletPowerRelayTurnOn + 0x9d020f68 ChaletPowerRelayTurnOff + 0x9d020fb8 GetChaletPowerRelayState + .text 0x9d020fe0 0x248 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + 0x9d020fe0 InitSyslog + 0x9d021034 SyslogTick + 0x9d0210d0 SyslogNewByte + 0x9d021174 SyslogNewString + 0x9d0211ec SyslogIsBufferEmpty + +.text.fp32div 0x9d021228 0x230 + .text.fp32div 0x9d021228 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d021228 fpdiv + 0x9d021228 __divsf3 + +.text.__floatdisf + 0x9d021458 0x220 + .text.__floatdisf + 0x9d021458 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d021458 __floatdisf + +.text.fp32mul 0x9d021678 0x1bc + .text.fp32mul 0x9d021678 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d021678 __mulsf3 + 0x9d021678 fpmul + +.text 0x9d021834 0x1a0 + .text 0x9d021834 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d021834 strcpy + +.text.realloc 0x9d0219d4 0x194 + .text.realloc 0x9d0219d4 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d0219d4 realloc + +.text._sbrk_init + 0x9d021b68 0x194 + .text._sbrk_init + 0x9d021b68 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d021b68 _sbrk_init + +.text._filbuf 0x9d021cfc 0x188 + .text._filbuf 0x9d021cfc 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d021cfc _filbuf + +.text.read 0x9d021e84 0x174 + .text.read 0x9d021e84 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d021e84 read + +.text 0x9d021ff8 0x2d0 + .text 0x9d021ff8 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d021ff8 memcpy + .text 0x9d022160 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d022160 strlen + +.text.fputc 0x9d0222c8 0x15c + .text.fputc 0x9d0222c8 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d0222c8 fputc + +.text._flsbuf 0x9d022424 0x12c + .text._flsbuf 0x9d022424 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d022424 _flsbuf + +.text 0x9d022550 0x11c + .text 0x9d022550 0x11c build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + 0x9d022550 InitTempSensor + 0x9d022594 TempSensorCheckAndConfigure + 0x9d0225f0 TempSensorGetTemp + 0x9d022614 TickTempSensor + +.text.fgetc 0x9d02266c 0x108 + .text.fgetc 0x9d02266c 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d02266c fgetc + +.rodata 0x9d022774 0x204 + .rodata 0x9d022774 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d022774 _ctype + .rodata 0x9d022878 0x100 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmspi.o + +.text.setvbuf 0x9d022978 0xfc + .text.setvbuf 0x9d022978 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d022978 setvbuf + +.rodata 0x9d022a78 0xe0 + .rodata 0x9d022a78 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d022b58 0xdc + .text.general_exception + 0x9d022b58 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d022b58 _general_exception_context + +.text 0x9d022c34 0x1ac + .text 0x9d022c34 0xd8 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + 0x9d022c34 InitWatchdog + 0x9d022c88 EnableWatchdog + 0x9d022cb4 DisableWatchdog + 0x9d022ce0 KickWatchdog + .text 0x9d022d0c 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d022d0c __floatundisf + +.rodata 0x9d022de0 0xc8 + .rodata 0x9d022de0 0xc8 build/ChaletDuinoV2_775F512H_/debug/Source/SPI_Flash.o + +.text._sbrk 0x9d022ea8 0xc4 + .text._sbrk 0x9d022ea8 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d022ea8 _sbrk + +.text 0x9d022f6c 0xa8 + .text 0x9d022f6c 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d022f6c memset + +.text.atoi 0x9d023014 0xa8 + .text.atoi 0x9d023014 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d023014 atoi + +.text.range 0x9d0230bc 0xa0 + .text.range 0x9d0230bc 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d02315c 0x9c + .text.fpcmp 0x9d02315c 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d02315c __eqsf2 + 0x9d02315c __lesf2 + 0x9d02315c __gtsf2 + 0x9d02315c __nesf2 + 0x9d02315c fpcmp + 0x9d02315c __gesf2 + 0x9d02315c __ltsf2 + +.text.fflush 0x9d0231f8 0x94 + .text.fflush 0x9d0231f8 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d0231f8 fflush + +.text.write 0x9d02328c 0x94 + .text.write 0x9d02328c 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d02328c write + +.text.libm 0x9d023320 0x88 + .text.libm 0x9d023320 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d023320 frexpf + 0x9d023320 fpfrexp + +.text 0x9d0233a8 0x80 + .text 0x9d0233a8 0x80 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/winc_init.o + 0x9d0233a8 wifi_init + +.text.fptoul 0x9d023428 0x7c + .text.fptoul 0x9d023428 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d023428 fptoul + 0x9d023428 fptoui + 0x9d023428 __fixunssfsi + +.text.SoftReset + 0x9d0234a4 0x78 + .text.SoftReset + 0x9d0234a4 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d0234a4 SoftReset + +.text.fputs 0x9d02351c 0x78 + .text.fputs 0x9d02351c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d02351c fputs + +.text.strncmp 0x9d023594 0x78 + .text.strncmp 0x9d023594 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d023594 strncmp + +.text.ungetc 0x9d02360c 0x74 + .text.ungetc 0x9d02360c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d02360c ungetc + +.text 0x9d023680 0xd8 + .text 0x9d023680 0x70 build/ChaletDuinoV2_775F512H_/debug/Source/SPI.o + 0x9d023680 SPITransaction + .text 0x9d0236f0 0x68 build/ChaletDuinoV2_775F512H_/debug/Source/HarakiriRelay.o + 0x9d0236f0 InitHarakiriRelay + 0x9d023720 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d023758 0x68 + .text._sprintf_cdfFnopuxX + 0x9d023758 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d023758 _sprintf_cdnopuxX + 0x9d023758 _sprintf_cdfFnopuxX + +.rodata 0x9d0237c0 0x68 + .rodata 0x9d0237c0 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d0237c0 _powers_f + 0x9d0237f4 _npowers_f + +.text.sitofp 0x9d023828 0x60 + .text.sitofp 0x9d023828 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d023828 sitofp + 0x9d023828 litofp + 0x9d023828 __floatsisf + +.text.wspace 0x9d023888 0x60 + .text.wspace 0x9d023888 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d0238e8 0x58 + .text 0x9d0238e8 0x58 build/ChaletDuinoV2_775F512H_/debug/Source/exceptions.o + 0x9d0238e8 _general_exception_handler + +.text._sscanf_s + 0x9d023940 0x54 + .text._sscanf_s + 0x9d023940 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d023940 _sscanf_s + 0x9d023940 _sscanf_0 + +.text._bufallo 0x9d023994 0x54 + .text._bufallo + 0x9d023994 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023994 _bufallo + +.text.sbrk 0x9d0239e8 0x50 + .text.sbrk 0x9d0239e8 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0239e8 sbrk + +.text.main_entry + 0x9d023a38 0x4c + .text.main_entry + 0x9d023a38 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d023a64 __crt0_exit + +.text 0x9d023a84 0x4c + .text 0x9d023a84 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d023a84 __floatunsisf + +.text._bootstrap_exception_handler + 0x9d023ad0 0x48 + .text._bootstrap_exception_handler + 0x9d023ad0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d023ad0 _bootstrap_exception_handler + +.text 0x9d023b18 0x44 + .text 0x9d023b18 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d023b18 __pic32_software_reset + +.text.puts 0x9d023b5c 0x44 + .text.puts 0x9d023b5c 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d023b5c puts + +.text._printf_cdfFnopsuxX + 0x9d023ba0 0x40 + .text._printf_cdfFnopsuxX + 0x9d023ba0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + 0x9d023ba0 _printf_cdnopsuxX + 0x9d023ba0 _printf_cdnopuxX + 0x9d023ba0 _printf_cdfFnopsuxX + 0x9d023ba0 _printf_fF + +.vector_default + 0x9d023be0 0x38 + .vector_default + 0x9d023be0 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d023be0 _DefaultInterrupt + +.rodata 0x9d023c18 0x30 + .rodata 0x9d023c18 0x30 build/ChaletDuinoV2_775F512H_/debug/Source/main.o + +.text.INTConfigureSystem + 0x9d023c48 0x30 + .text.INTConfigureSystem + 0x9d023c48 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d023c48 INTConfigureSystem + +.text.free 0x9d023c78 0x30 + .text.free 0x9d023c78 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d023c78 free + +.rodata 0x9d023ca8 0x2c + .rodata 0x9d023ca8 0x2c build/ChaletDuinoV2_775F512H_/debug/Source/BatteryMonitor.o + +.text._stub_sbd_memlayout + 0x9d023cd4 0x2c + .text._stub_sbd_memlayout + 0x9d023cd4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023cd4 _sbd_memlayout + 0x9d023cd4 _stub_sbd_memlayout + +.rodata 0x9d023d00 0x28 + .rodata 0x9d023d00 0x28 build/ChaletDuinoV2_775F512H_/debug/Source/ChaletPowerRelay.o + +.text.tolower 0x9d023d28 0x24 + .text.tolower 0x9d023d28 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023d28 tolower + +.text.toupper 0x9d023d4c 0x24 + .text.toupper 0x9d023d4c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023d4c toupper + +.text 0x9d023d70 0x20 + .text 0x9d023d70 0x20 build/ChaletDuinoV2_775F512H_/debug/Source/DigitalIO.o + 0x9d023d70 InitDigitalIO + +.rodata 0x9d023d90 0x1c + .rodata 0x9d023d90 0x1c build/ChaletDuinoV2_775F512H_/debug/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d023dac 0x1c + .text.INTRestoreInterrupts + 0x9d023dac 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d023dac INTRestoreInterrupts + +.text.setbuf 0x9d023dc8 0x1c + .text.setbuf 0x9d023dc8 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d023dc8 setbuf + +.rodata 0x9d023de4 0x18 + .rodata 0x9d023de4 0x18 build/ChaletDuinoV2_775F512H_/debug/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d023dfc 0x18 + .text.CheKseg0CacheOff + 0x9d023dfc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023dfc CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d023e14 0x18 + .text.CheKseg0CacheOn + 0x9d023e14 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023e14 CheKseg0CacheOn + +.text 0x9d023e2c 0x18 + .text 0x9d023e2c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d023e2c _nmi_handler + +.text.isalnum 0x9d023e44 0x18 + .text.isalnum 0x9d023e44 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e44 isalnum + +.text.isalpha 0x9d023e5c 0x18 + .text.isalpha 0x9d023e5c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e5c isalpha + +.text.iscntrl 0x9d023e74 0x18 + .text.iscntrl 0x9d023e74 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e74 iscntrl + +.text.isdigit 0x9d023e8c 0x18 + .text.isdigit 0x9d023e8c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023e8c isdigit + +.text.isgraph 0x9d023ea4 0x18 + .text.isgraph 0x9d023ea4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ea4 isgraph + +.text.islower 0x9d023ebc 0x18 + .text.islower 0x9d023ebc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ebc islower + +.text.isprint 0x9d023ed4 0x18 + .text.isprint 0x9d023ed4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023ed4 isprint + +.text.ispunct 0x9d023eec 0x18 + .text.ispunct 0x9d023eec 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023eec ispunct + +.text.isspace 0x9d023f04 0x18 + .text.isspace 0x9d023f04 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f04 isspace + +.text.isupper 0x9d023f1c 0x18 + .text.isupper 0x9d023f1c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f1c isupper + +.text.isxdigit 0x9d023f34 0x18 + .text.isxdigit + 0x9d023f34 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f34 isxdigit + +.text._buffree 0x9d023f4c 0x14 + .text._buffree + 0x9d023f4c 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023f4c _buffree + +.text.__exception_handler_break + 0x9d023f60 0xc + .text.__exception_handler_break + 0x9d023f60 0xc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + 0x9d023f60 __exception_handler_break + +.rodata 0x9d023f6c 0x1c + .rodata 0x9d023f6c 0xc build/ChaletDuinoV2_775F512H_/debug/Source/InternalUart.o + .rodata 0x9d023f78 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/Syslog.o + .rodata 0x9d023f80 0x8 build/ChaletDuinoV2_775F512H_/debug/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d023f88 0x8 + .text.INTEnableInterrupts + 0x9d023f88 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d023f88 INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d023f90 0x8 + .text.INTDisableInterrupts + 0x9d023f90 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d023f90 INTDisableInterrupts + +.text._on_reset + 0x9d023f98 0x8 + .text._on_reset + 0x9d023f98 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d023f98 _on_reset + +.text._on_bootstrap + 0x9d023fa0 0x8 + .text._on_bootstrap + 0x9d023fa0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d023fa0 _on_bootstrap + +.text.isascii 0x9d023fa8 0x8 + .text.isascii 0x9d023fa8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fa8 isascii + +.text.toascii 0x9d023fb0 0x8 + .text.toascii 0x9d023fb0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fb0 toascii + +.text._tolower 0x9d023fb8 0x8 + .text._tolower + 0x9d023fb8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fb8 _tolower + +.text._toupper 0x9d023fc0 0x8 + .text._toupper + 0x9d023fc0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023fc0 _toupper + +.text.getpagesize + 0x9d023fc8 0x8 + .text.getpagesize + 0x9d023fc8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023fc8 getpagesize + +.rodata 0x9d023fd0 0x8 + .rodata 0x9d023fd0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.rodata 0x9d022a74 0x4 + .rodata 0x9d022a74 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/TemperatureSensor.o + +.rodata 0x9d023fd8 0x4 + .rodata 0x9d023fd8 0x4 build/ChaletDuinoV2_775F512H_/debug/Source/TC77.o + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z427 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/template.o + +.text%z428 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/system.o + +.text%z429 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/interrupts.o + +.text%z430 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmuart.o + +.text%z431 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/nmi2c.o + +.text%z432 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_crypto.o + +.text%z433 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/debug/Source/winc3400/driver/source/m2m_ate_mode.o + +.text%z434 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\software-debug-break.o + +.text%z435 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf new file mode 100644 index 0000000..cde46a4 Binary files /dev/null and b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf differ diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex new file mode 100644 index 0000000..ff6d7b9 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.hex @@ -0,0 +1,8853 @@ +:020000040000fa +:020000041fc01b +:042ff400d9fff8ff0a +:020000040000fa +:020000041fc01b +:042ff800dbcc6cffc3 +:020000040000fa +:020000041fc01b +:042ffc00ffffff7f55 +:020000040000fa +:020000041fc01b +:100000000200f00f0000000000601a40c0045a7f98 +:100010000500401300000000029d1a3c2c405a27a6 +:10002000080040030000000001a01d3cf0ffbd27b8 +:1000300001a01c3c20809c27026009402058200120 +:10004000801e2a7d8449497d02608940c0000000ed +:1000500000e0dc4102608b40c0000000029d083cd3 +:100060008c41082509f800010000000000a0083cb0 +:10007000ac00082500a0093c7030292506000010be +:1000800000000000000000ad040000ad080000ad5d +:100090000c0000ad100008252b080901f9ff201401 +:1000a00000000000029d083cf48708250000098d2f +:1000b000180020110400082500000a8d04000825fe +:1000c00000000b8d090060110400082500000c9150 +:1000d000ffff4a250100082500002ca1fbff401569 +:1000e000010029250500001000000000000020a1eb +:1000f000ffff4a25fdff40150100292503000825c3 +:10010000fcff0a24244048010000098de7ff201568 +:10011000000000000000093c00002925100020110b +:10012000000000000100093c0000292588bf0a3cae +:1001300010204a25000049ad0100093c0000292596 +:1001400088bf0a3c20204a25000049ad0100093c37 +:100150000000292588bf0a3c30204a25000049ad0f +:1001600000488040ffff0a2400588a40009d093c57 +:1001700000202925017889400000093c010029253b +:1001800000000a2444492a7d01608a408000093c1d +:1001900000688940008008408005097d404c0900c6 +:1001a000006008405800013c24400101254028011e +:1001b00000608840029d083c9441082509f8000130 +:1001c0000000000000600840bfff013cffff213439 +:1001d0002440010100608840000084300000a53008 +:1001e000029d083c383c0825080000010000000082 +:020000040000fa +:020000041fc01b +:10038000029d1a3cd03c5a270800400300000000a0 +:020000040000fa +:020000041d00dd +:10218000029d1a3c582d5a27080040030000000009 +:020000040000fa +:020000041d00dd +:08220000788f400b0000000084 +:020000040000fa +:020000041d00dd +:08222000788f400b0000000064 +:020000040000fa +:020000041d00dd +:08224000788f400b0000000044 +:020000040000fa +:020000041d00dd +:082260001680400b0000000095 +:020000040000fa +:020000041d00dd +:08228000b861400b00000000f2 +:020000040000fa +:020000041d00dd +:0822a000788f400b00000000e4 +:020000040000fa +:020000041d00dd +:0822c000788f400b00000000c4 +:020000040000fa +:020000041d00dd +:0822e000788f400b00000000a4 +:020000040000fa +:020000041d00dd +:08230000788f400b0000000083 +:020000040000fa +:020000041d00dd +:08232000788f400b0000000063 +:020000040000fa +:020000041d00dd +:08234000788f400b0000000043 +:020000040000fa +:020000041d00dd +:08236000788f400b0000000023 +:020000040000fa +:020000041d00dd +:08238000788f400b0000000003 +:020000040000fa +:020000041d00dd +:0823a000788f400b00000000e3 +:020000040000fa +:020000041d00dd +:0823c000788f400b00000000c3 +:020000040000fa +:020000041d00dd +:0823e000788f400b00000000a3 +:020000040000fa +:020000041d00dd +:08240000788f400b0000000082 +:020000040000fa +:020000041d00dd +:08242000788f400b0000000062 +:020000040000fa +:020000041d00dd +:08244000788f400b0000000042 +:020000040000fa +:020000041d00dd +:08246000788f400b0000000022 +:020000040000fa +:020000041d00dd +:08248000788f400b0000000002 +:020000040000fa +:020000041d00dd +:0824a000788f400b00000000e2 +:020000040000fa +:020000041d00dd +:0824c000788f400b00000000c2 +:020000040000fa +:020000041d00dd +:0824e000788f400b00000000a2 +:020000040000fa +:020000041d00dd +:08250000174d400b0000000024 +:020000040000fa +:020000041d00dd +:08252000788f400b0000000061 +:020000040000fa +:020000041d00dd +:08254000788f400b0000000041 +:020000040000fa +:020000041d00dd +:08256000788f400b0000000021 +:020000040000fa +:020000041d00dd +:08258000788f400b0000000001 +:020000040000fa +:020000041d00dd +:0825a000788f400b00000000e1 +:020000040000fa +:020000041d00dd +:0825c000788f400b00000000c1 +:020000040000fa +:020000041d00dd +:0825e000788f400b00000000a1 +:020000040000fa +:020000041d00dd +:08260000a64d400b0000000094 +:020000040000fa +:020000041d00dd +:08262000788f400b0000000060 +:020000040000fa +:020000041d00dd +:08264000788f400b0000000040 +:020000040000fa +:020000041d00dd +:08266000788f400b0000000020 +:020000040000fa +:020000041d00dd +:08268000788f400b0000000000 +:020000040000fa +:020000041d00dd +:0826a000788f400b00000000e0 +:020000040000fa +:020000041d00dd +:0826c000788f400b00000000c0 +:020000040000fa +:020000041d00dd +:0826e000788f400b00000000a0 +:020000040000fa +:020000041d00dd +:08270000788f400b000000007f +:020000040000fa +:020000041d00dd +:08272000788f400b000000005f +:020000040000fa +:020000041d00dd +:08274000788f400b000000003f +:020000040000fa +:020000041d00dd +:08276000788f400b000000001f +:020000040000fa +:020000041d00dd +:08278000788f400b00000000ff +:020000040000fa +:020000041d00dd +:0827a000788f400b00000000df +:020000040000fa +:020000041d00dd +:0827c000788f400b00000000bf +:020000040000fa +:020000041d00dd +:0827e000788f400b000000009f +:020000040000fa +:020000041d00dd +:08280000788f400b000000007e +:020000040000fa +:020000041d00dd +:08282000788f400b000000005e +:020000040000fa +:020000041d00dd +:08284000788f400b000000003e +:020000040000fa +:020000041d00dd +:08286000788f400b000000001e +:020000040000fa +:020000041d00dd +:08288000788f400b00000000fe +:020000040000fa +:020000041d00dd +:0828a000788f400b00000000de +:020000040000fa +:020000041d00dd +:0828c000788f400b00000000be +:020000040000fa +:020000041d00dd +:0828e000788f400b000000009e +:020000040000fa +:020000041d00dd +:08290000788f400b000000007d +:020000040000fa +:020000041d00dd +:08292000788f400b000000005d +:020000040000fa +:020000041d00dd +:08294000788f400b000000003d +:020000040000fa +:020000041d00dd +:08296000788f400b000000001d +:020000040000fa +:020000041d00dd +:08298000788f400b00000000fd +:020000040000fa +:020000041d00dd +:0829a000788f400b00000000dd +:020000040000fa +:020000041d00dd +:0829c000788f400b00000000bd +:020000040000fa +:020000041d00dd +:0829e000788f400b000000009d +:020000040000fa +:020000041fc01b +:1004800000f89b40c0000000029d1b3c183d7b27ec +:10049000020060130000000000c09b4000f81b40f9 +:0c04a000c00000001f000042000000002f +:020000040000fa +:020000041d00dd +:1038000038ffbd27c400bfafc000beaf21f0a0038a +:10381000211880002110a000d000c6afc800c3a3ab +:10382000cc00c2a7c800c3932c0002241500621468 +:10383000000000002000c227d000c48f21284000d3 +:103840000400062421380000823c400f00000000e4 +:10385000d201401400000000c480828fcf014010cc +:1038600000000000c480828f2000c3272c000424a5 +:103870002128600009f8400000000000e70f400b1d +:1038800000000000c800c3931d000224150062144c +:10389000000000002400c227d000c48f212840006f +:1038a0000800062421380000823c400f0000000080 +:1038b000ba01401400000000c480828fb70140109c +:1038c00000000000c480828f2400c3271d00042450 +:1038d0002128600009f8400000000000e70f400bbd +:1038e00000000000c800c393080002241500621401 +:1038f000000000005400c227d000c48f21284000df +:103900003000062401000724823c400f0000000024 +:10391000a201401400000000c480828f9f0140106b +:1039200000000000c480828f5400c32708000424d4 +:103930002128600009f8400000000000e70f400b5c +:1039400000000000c800c39310000224930162101d +:1039500000000000c800c393320002241500621466 +:10396000000000002c00c227d000c48f2128400096 +:103970001000062421380000823c400f00000000a7 +:103980008601401400000000c480828f8301401033 +:1039900000000000c480828f2c00c3273200042462 +:1039a0002128600009f8400000000000e70f400bec +:1039b00000000000c800c3932f0002241b00621403 +:1039c000000000005400c2272120400021280000f0 +:1039d00068000624f27a400f000000005400c2275d +:1039e000d000c48f21284000680006242138000040 +:1039f000823c400f000000006801401400000000fd +:103a0000c480828f6501401000000000c480828f56 +:103a10005400c3272f0004242128600009f8400027 +:103a200000000000e70f400b00000000c800c39337 +:103a30003400022414006214000000003c00c2277d +:103a4000d000c48f21284000040006242138000043 +:103a5000823c400f000000005001401400000000b4 +:103a6000c480828f4d01401000000000c480828f0e +:103a7000340004242128000009f840000000000060 +:103a8000e70f400b00000000c800c393130002249e +:103a900017006214000000004000c227d000c48f4d +:103aa000212840000400062421380000823c400ff9 +:103ab0000000000039014014000000004000c293e3 +:103ac000c08082a3c480828f3401401000000000b7 +:103ad000c480828f4000c327130004242128600083 +:103ae00009f8400000000000e70f400b0000000054 +:103af000c800c393150002241500621400000000e2 +:103b00005400c227d000c48f212840002c00062476 +:103b100021380000823c400f000000001f014014cb +:103b200000000000c480828f1c01401000000000d3 +:103b3000c480828f5400c32715000424212860000c +:103b400009f8400000000000e70f400b00000000f3 +:103b5000c800c39304000224150062140000000092 +:103b60001800c227d000c48f21284000040006247a +:103b700021380000823c400f000000000701401483 +:103b800000000000c480828f04014010000000008b +:103b9000c480828f1800c3270400042421286000f9 +:103ba00009f8400000000000e70f400b0000000093 +:103bb000c800c393790002241500621400000000bd +:103bc0001800c227d000c48f21284000040006241a +:103bd00021380000823c400f00000000ef0040143c +:103be00000000000c480828fec0040100000000044 +:103bf000c480828f1800c327790004242128600024 +:103c000009f8400000000000e70f400b0000000032 +:103c1000c800c3930b0002241500621400000000ca +:103c20005400c227d000c48f21284000640006241d +:103c300001000724823c400f00000000d700401420 +:103c400000000000c480828fd400401000000000fb +:103c5000c480828f5400c3270b00042421286000f5 +:103c600009f8400000000000e70f400b00000000d2 +:103c7000c800c3932a00022415006214000000004b +:103c80004400c227d000c48f21284000040006242d +:103c900001000724823c400f00000000bf004014d8 +:103ca00000000000c480828fbc00401000000000b3 +:103cb000c480828f4400c3272a0004242128600086 +:103cc00009f8400000000000e70f400b0000000072 +:103cd000c800c393220002243600621400000000d2 +:103ce0001800c227d000c48f2128400002000624fb +:103cf00021380000823c400f00000000a700401463 +:103d0000000000001900c29300120200ffff4330c0 +:103d10001800c293211062001000c2a71000c297c1 +:103d200002004224212040000e82400f00000000cb +:103d30001400c2af1400c28f9800401000000000b1 +:103d40001400c28f1000c397000043a4d000c28f9c +:103d5000020044241400c28f020043241400c28fc6 +:103d60000000429421286000213040000100072417 +:103d7000823c400f000000000900401400000000d9 +:103d8000c480828f0600401000000000c480828f33 +:103d9000220004241400c58f09f840000000000030 +:103da0001400c48f9e8f400f00000000e70f400bef +:103db00000000000c800c3933c00022420006214ed +:103dc000000000004800c227d000c48f2128400016 +:103dd0000800062421380000823c400f000000004b +:103de0006e00401400000000d000c28f0800442480 +:103df0004800c38f4c00c29721286000213040004a +:103e000001000724823c400f0000000063004014c2 +:103e100000000000c480828f60004010000000009d +:103e2000c480828f4800c3273c00042421286000fe +:103e300009f8400000000000e70f400b0000000000 +:103e4000c800c3932400022415006214000000007f +:103e50005000c227d000c48f21284000040006244f +:103e600021380000823c400f000000004b0040144d +:103e700000000000c480828f480040100000000055 +:103e8000c480828f5000c3272400042421286000ae +:103e900009f8400000000000e70f400b00000000a0 +:103ea000c800c393370002243c00621400000000e5 +:103eb000cc00c2972400422c3800401400000000bf +:103ec0005400c227d000c48f2128400024000624bb +:103ed00021380000823c400f000000002f004014f9 +:103ee00000000000cc00c297dcff4224cc00c2a737 +:103ef000cc00c2971f00401000000000cc80828fd1 +:103f00001c00401000000000cc00c397d2808297b4 +:103f100021204000d0808297211082002a10430087 +:103f20000300401000000000d2808297cc00c2a79e +:103f3000d080829721184000d000c28f21106200eb +:103f400024004224d000c2afcc80838fcc00c29723 +:103f5000d000c48f212860002130400001000724d8 +:103f6000823c400f000000000200401000000000f2 +:103f7000cc00c0a7c880828f08004010000000005d +:103f8000c880828fcc80858fcc00c3975400c42713 +:103f90002130600009f840000000000021e8c00363 +:103fa000c400bf8fc000be8fc800bd270800e0035b +:103fb00000000000e0ffbd271c00bfaf1800beaf2f +:103fc00021f0a0031000c0a321200000a26c400f2c +:103fd000000000001000c2a31000c28305004014be +:103fe00000000000eb33400f00000000fe0f400b0c +:103ff00000000000000000001000c28321e8c003a0 +:104000001c00bf8f1800be8f2000bd270800e003f2 +:1040100000000000e0ffbd271c00bfaf1800beafce +:1040200021f0a0032000c4af1000c0a32000c28f65 +:104030000500401400000000f4ff02241000c2a399 +:104040008110400b000000002000c28f21204000a2 +:10405000107b400f0000000008004010000000002e +:104060002000c28f21204000107b400f0000000084 +:104070002100422c0500401400000000f4ff02243f +:104080001000c2a38110400b000000002000c28f6e +:10409000210042900f00422c05004010000000005b +:1040a0002000c28f21004290050040140000000053 +:1040b000f4ff02241000c2a38110400b0000000096 +:1040c0002000c28f410042900d004014000000000b +:1040d0002000c28f420042900900401400000000fe +:1040e0002000c28f430042900500401400000000f1 +:1040f000f4ff02241000c2a38110400b0000000056 +:104100002000c28f3f004390010002243c00621057 +:10411000000000002000c28f3f00439003000224f3 +:1041200033006214000000002000c28f2200429081 +:1041300006004010000000002000c28f22004290c4 +:104140000500422c0500401400000000f4ff02248a +:104150001000c2a38110400b000000002000c28f9d +:10416000230043900a0002240a00621000000000ad +:104170002000c28f230043901a0002240500621021 +:1041800000000000f4ff02241000c2a38110400bc5 +:10419000000000002000c28f2400422410004010c4 +:1041a000000000002000c28f240042242120400093 +:1041b000107b400f000000000900401000000000cc +:1041c0002000c28f2400422421204000107b400f99 +:1041d000000000001b00422c0a00401400000000f8 +:1041e000f4ff02241000c2a38110400b0000000065 +:1041f000f4ff02241000c2a38110400b0000000055 +:10420000000000001000c28321e8c0031c00bf8f23 +:104210001800be8f2000bd270800e003000000004a +:10422000f0ffbd270c00beaf21f0a0031000c4af0b +:104230000000c0a31000c28f050040140000000061 +:10424000f4ff02240000c2a3b710400b00000000de +:104250001000c28f000042900300401400000000d4 +:10426000f4ff02240000c2a31000c28f010042909c +:104270000a00422c06004014000000001000c28f0b +:1042800001004290fb00422c03004014000000009b +:10429000f4ff02240000c2a31000c28f020042906b +:1042a00006004010000000001000c28f0200429083 +:1042b0000300422c0300401400000000f4ff02241d +:1042c0000000c2a31000c28f03004280030040041c +:1042d00000000000f4ff02240000c2a30000c2831b +:1042e00021e8c0030c00be8f1000bd270800e003ca +:1042f00000000000d0ffbd272c00bfaf2800beafdc +:1043000021f0a003211080003000c2a3f4ff02249a +:104310002000c2a32400c0af3000c2932400c2a377 +:104320002400c2271000a0af1400a0af1800a0af57 +:104330000100042423000524213040000400072448 +:10434000ff39400f000000002000c2a32000c283fc +:1043500021e8c0032c00bf8f2800be8f3000bd278e +:104360000800e00300000000e0ffbd271c00bfaf15 +:104370001800beaf21f0a003f4ff02241000c2a376 +:1043800021200000c16c400f000000001000c2a3fb +:104390001000c28321e8c0031c00bf8f1800be8f2d +:1043a0002000bd270800e00300000000c8ffbd2773 +:1043b0003400bfaf3000beaf21f0a0033800c4af5f +:1043c0001000c0a33800c28f050040140000000098 +:1043d000f4ff02241000c2a33711400b00000000bc +:1043e0003800c28f0000428cc48082af3800c28f78 +:1043f0000400428cc88082af21200000ec6c400f8a +:10440000000000001000c2a31000c2832c00401462 +:1044100000000000212000002a39400f00000000a9 +:104420001000c2a31000c2831f004014000000004f +:1044300001000424009d023c00384524193d400f32 +:10444000000000001400c227212040003116400f58 +:10445000000000001000c2a31400c2272120400069 +:104460006516400f000000001000c28317004014c2 +:10447000000000007b39400f000000001000c2a3c4 +:104480001000c28314004014000000003800c28fe6 +:104490001800429021204000bd10400f0000000095 +:1044a0003711400b00000000000000002120000038 +:1044b000526d400f000000003711400b000000005b +:1044c000000000003711400b000000000000000059 +:1044d0003711400b00000000000000001000c283f4 +:1044e00021e8c0033400bf8f3000be8f3800bd27e5 +:1044f0000800e00300000000e0ffbd271c00bfaf84 +:104500001800beaf21f0a0032000c4af1000c0a36c +:10451000da10400f000000001000c2a31000c28398 +:1045200005004014000000002000c48feb10400f75 +:10453000000000001000c2a31000c28321e8c003e5 +:104540001c00bf8f1800be8f2000bd270800e003ad +:1045500000000000e8ffbd271400bfaf1000beaf91 +:1045600021f0a0031800c4af212000004539400ffe +:104570000000000021200000526d400f00000000ec +:104580002110000021e8c0031400bf8f1000be8f6f +:104590001800bd270800e00300000000e8ffbd2769 +:1045a0001400bfaf1000beaf21f0a0032120000017 +:1045b0005511400f00000000da10400f000000000d +:1045c00021e8c0031400bf8f1000be8f1800bd2764 +:1045d0000800e00300000000e8ffbd271400bfafa3 +:1045e0001000beaf21f0a0031800c4af1800c48fa4 +:1045f000eb10400f0000000021e8c0031400bf8f43 +:104600001000be8f1800bd270800e0030000000066 +:10461000e0ffbd271c00bfaf1800beaf21f0a00314 +:104620002000c4aff4ff02241000c2a36711400fa2 +:10463000000000001000c2a31000c2830500401457 +:10464000000000002000c48f7611400f0000000021 +:104650001000c2a31000c28321e8c0031c00bf8f5a +:104660001800be8f2000bd270800e00300000000f6 +:10467000e8ffbd271400bfaf1000beaf21f0a003bc +:10468000453c400f0000000021e8c0031400bf8f2c +:104690001000be8f1800bd270800e00300000000d6 +:1046a000e8ffbd271400bfaf1000beaf21f0a0038c +:1046b0001800c4af4f3c400f0000000021e8c003c9 +:1046c0001400bf8f1000be8f1800bd270800e00344 +:1046d00000000000d8ffbd272400bfaf2000beaf00 +:1046e00021f0a0031000a0af1400a0af1800a0afed +:1046f0000100042429000524213000002138000095 +:10470000ff39400f0000000021e8c0032400bf8fe4 +:104710002000be8f2800bd270800e0030000000035 +:10472000d8ffbd272400bfaf2000beaf21f0a003fb +:104730002800c4af2120a0002118c0003400c7af5a +:104740003800c28f2c00c4a33000c3a31800c2a736 +:104750002c00c3933000c2931800c4971000a4af7c +:104760001400a0af2800c48f212860002130400031 +:104770003400c78fe511400f0000000021e8c0039e +:104780002400bf8f2000be8f2800bd270800e00353 +:104790000000000048ffbd27b400bfafb000beafaf +:1047a00021f0a003b800c4af2120c000c400c7afef +:1047b000c800c38fcc00c28fbc00c5a3c000c4a377 +:1047c000a800c3a7ac00c2a32000c0a3c000c3932d +:1047d000010002244e00621000000000c400c28fdd +:1047e0000500401400000000f4ff02242000c2a3d2 +:1047f000ef12400b00000000c000c393020002242f +:104800004300621400000000c400c28f2120400059 +:10481000107b400f000000002118400040000224df +:104820003b006214000000002100c0a3c400c28f3e +:104830002400c2af4012400b000000002100c293d0 +:104840002400c38f21106200000042903000422cef +:1048500024004014000000002100c2932400c38ff4 +:1048600021106200000042903a00422c08004014df +:10487000000000002100c2932400c38f21106200b9 +:10488000000042904100422c16004014000000003d +:104890002100c2932400c38f2110620000004290c7 +:1048a0004700422c08004014000000002100c29381 +:1048b0002400c38f21106200000042906100422c4e +:1048c00008004014000000002100c2932400c38fa0 +:1048d00021106200000042906700422c0500401445 +:1048e00000000000f4ff02242000c2a3ef12400bde +:1048f000000000002100c293010042242100c2a355 +:104900002100c2934000422cccff40140000000064 +:10491000bc00c2930500401000000000bc00c29320 +:104920002100422c0500401400000000f4ff022486 +:104930002000c2a3ef12400b00000000a800c297a5 +:104940000500401000000000a800c2970f00422c94 +:104950000900401400000000a800c397ff000224d3 +:104960000500621000000000f4ff02242000c2a332 +:10497000ef12400b00000000b800c38fbc00c293d0 +:104980003800c427460084242128600021304000dc +:10499000b57a400f00000000bc00c2932000c3277e +:1049a000211062005e0040a0a800c2977c00c2a750 +:1049b000ac00c2932b100200ff0042309f00c2a344 +:1049c0003800c2272800c2af2800c28fc000c3939e +:1049d000410043a0c000c3930300022439006214c5 +:1049e00000000000c400c28f2c00c2af2800c28f9c +:1049f0003000c2af2c00c28f00004290ffff422463 +:104a0000ff0043303000c28f000043a03000c28f4f +:104a1000000042900400422c0500401400000000f9 +:104a2000f4ff02242000c2a3ef12400b000000009c +:104a30002c00c28f01004290ffff4224ff00433050 +:104a40003000c28f010043a03000c28f01004390ac +:104a50000a0002240a006210000000003000c28f29 +:104a6000010043901a0002240500621000000000bb +:104a7000f4ff02242000c2a3ef12400b000000004c +:104a80003000c28f020044242c00c28f0200432455 +:104a90002c00c28f0100429021286000213040008c +:104aa000b57a400f000000002c00c28f0100429038 +:104ab0003000c38f21106200020040a0e412400bbe +:104ac00000000000c000c393020002241b00621417 +:104ad00000000000c400c28f21204000107b400f66 +:104ae000000000003400c2a73400c2970500401047 +:104af000000000003400c2974100422c0500401421 +:104b000000000000f4ff02242000c2a3ef12400bbb +:104b1000000000002800c48fc400c38f3400c29777 +:104b2000010042242128600021304000b57a400f66 +:104b300000000000e412400b00000000c000c3931e +:104b4000040002240a006214000000002800c38f41 +:104b5000c400c28f212060002128400040000624ac +:104b6000b57a400f00000000e412400b0000000086 +:104b7000c000c39301000224050062100000000081 +:104b8000f4ff02242000c2a3ef12400b000000003b +:104b90003800c2271000a0af1400a0af1800a0afcb +:104ba0000100042428000524213040006c00072463 +:104bb000ff39400f000000002000c2a32000c28384 +:104bc00021e8c003b400bf8fb000be8fb800bd277e +:104bd0000800e00300000000d8ffbd272400bfaf9d +:104be0002000beaf21f0a0031000a0af1400a0afc2 +:104bf0001800a0af010004242b0005242130000080 +:104c000021380000ff39400f0000000021e8c003f8 +:104c10002400bf8f2000be8f2800bd270800e003be +:104c200000000000d0ffbd272c00bfaf2800beafa2 +:104c300021f0a0033000c4af2000c2272120400093 +:104c40003000c58f06000624b57a400f0000000032 +:104c50001000a0af1400a0af1800a0af0100042402 +:104c6000020005242000c22721304000080007244c +:104c7000ff39400f0000000021e8c0032c00bf8f67 +:104c80002800be8f3000bd270800e00300000000b0 +:104c9000d8ffbd272400bfaf2000beaf21f0a00386 +:104ca0002800c4af2800c28f0800438c2800c28fa0 +:104cb000080043ac2800c28f0400438c2800c28f38 +:104cc000040043ac2800c28f0000438c2800c28f30 +:104cd000000043ac2800c28f0c00438c2800c28f18 +:104ce0000c0043ac2800c28f1000a0af1400a0af8e +:104cf0001800a0af020004240a000524213040005f +:104d000010000724ff39400f0000000021e8c00315 +:104d10002400bf8f2000be8f2800bd270800e003bd +:104d200000000000f8ffbd270400beaf21f0a00383 +:104d30002110000021e8c0030400be8f0800bd2739 +:104d40000800e00300000000f8ffbd270400beaf2c +:104d500021f0a0030800c4af2110000021e8c00327 +:104d60000400be8f0800bd270800e003000000001b +:104d7000d0ffbd272c00bfaf2800beaf21f0a0039d +:104d8000211080003000c2a33000c2930400401004 +:104d9000000000000b0002246913400b000000001b +:104da0000c0002242000c2a32000c2931000a0af78 +:104db0001400a0af1800a0af020004242128400076 +:104dc0002130000021380000ff39400f00000000b2 +:104dd00021e8c0032c00bf8f2800be8f3000bd2704 +:104de0000800e00300000000d8ffbd272400bfaf8b +:104df0002000beaf21f0a0032800c4af2800c28f5e +:104e00001000a0af1400a0af1800a0af0100042450 +:104e1000390005242130400004000724ff39400fe9 +:104e20000000000021e8c0032400bf8f2000be8fd7 +:104e30002800bd270800e00300000000d8ffbd27c0 +:104e40002400bfaf2000beaf21f0a0032800c4aff4 +:104e50002800c28f0000429001004224ffff423030 +:104e60001000a0af1400a0af1800a0af01000424f0 +:104e7000110005242800c68f21384000ff39400f5b +:104e80000000000021e8c0032400bf8f2000be8f77 +:104e90002800bd270800e00300000000d0ffbd2768 +:104ea0002c00bfaf2800beaf21f0a0033000c4af7c +:104eb000f4ff02242000c2a33000c48f8810400fea +:104ec000000000000c004014000000003000c28f01 +:104ed0001000a0af1400a0af1800a0af0100042480 +:104ee000160005242130400008000724ff39400f38 +:104ef000000000002000c2a32000c28321e8c003fc +:104f00002c00bf8f2800be8f3000bd270800e003b3 +:104f100000000000d0ffbd272c00bfaf2800beafaf +:104f200021f0a003211080003000c2a7f4ff02246a +:104f30002000c2a33000c2972400c2a72400c227c9 +:104f40001000a0af1400a0af1800a0af010004240f +:104f5000170005242130400004000724ff39400fca +:104f6000000000002000c2a32000c28321e8c0038b +:104f70002c00bf8f2800be8f3000bd270800e00343 +:104f800000000000d0ffbd272c00bfaf2800beaf3f +:104f900021f0a003211080003000c2a32000c0a394 +:104fa0003000c29305004010000000003000c293a2 +:104fb0000f00422c05004014000000003000c39395 +:104fc000ff00022410006214000000003000c293b1 +:104fd0002400c2a32400c2271000a0af1400a0af79 +:104fe0001800a0af01000424120005242130400065 +:104ff00004000724ff39400f000000002000c2a376 +:105000000414400b00000000f1ff02242000c2a3a2 +:105010002000c28321e8c0032c00bf8f2800be8f70 +:105020003000bd270800e00300000000d0ffbd27ce +:105030002c00bfaf2800beaf21f0a00321108000dc +:105040003000c2a32000c0a33000c293050040106e +:10505000000000003000c2930f00422c05004014f5 +:10506000000000003000c393ff000224100062140f +:10507000000000003000c2932400c2a32400c22715 +:105080001000a0af1400a0af1800a0af01000424ce +:10509000250005242130400004000724ff39400f7b +:1050a000000000002000c2a32e14400b00000000ee +:1050b000f1ff02242000c2a32000c28321e8c00324 +:1050c0002c00bf8f2800be8f3000bd270800e003f2 +:1050d00000000000c8ffbd273400bfaf3000beafe6 +:1050e00021f0a003211080003c00c5af3800c2a30e +:1050f0003800c2932000c2a33800c29308004014b5 +:10510000000000002100c3273c00c28f2120600066 +:105110002128400008000624b57a400f0000000056 +:105120001000a0af1400a0af1800a0af010004242d +:105130002f0005242000c227213040000c00072446 +:10514000ff39400f0000000021e8c0033400bf8f8a +:105150003000be8f3800bd270800e00300000000cb +:10516000d0ffbd272c00bfaf2800beaf21f0a003a9 +:105170002000c0a31000a0af1400a0af1800a0af83 +:1051800001000424310005242130000021380000f2 +:10519000ff39400f000000002000c2a32000c2839e +:1051a00021e8c0032c00bf8f2800be8f3000bd2730 +:1051b0000800e00300000000d0ffbd272c00bfafb7 +:1051c0002800beaf21f0a003211080003000c2a350 +:1051d0002000c0a33000c393010002240900621024 +:1051e000000000003000c393060002240500621096 +:1051f000000000003000c3930b0002241000621472 +:10520000000000003000c2932400c2a32400c22783 +:105210001000a0af1400a0af1800a0af010004243c +:105220005b0005242130400004000724ff39400fb3 +:10523000000000002000c2a39214400b00000000f8 +:10524000f4ff02242000c2a32000c28321e8c0038f +:105250002c00bf8f2800be8f3000bd270800e00360 +:1052600000000000d0ffbd272c00bfaf2800beaf5c +:1052700021f0a0032000c0a31000a0af1400a0af35 +:105280001800a0af010004245c00052421300000b8 +:1052900021380000ff39400f000000002000c2a3a9 +:1052a0002000c28321e8c0032c00bf8f2800be8fde +:1052b0003000bd270800e00300000000d0ffbd273c +:1052c0002c00bfaf2800beaf21f0a0033000c4af58 +:1052d000f4ff02242000c2a33000c48f0510400f49 +:1052e000000000000c004014000000003000c28fdd +:1052f0001000a0af1400a0af1800a0af010004245c +:10530000460005242130400048000724ff39400fa3 +:10531000000000002000c2a32000c28321e8c003d7 +:105320002c00bf8f2800be8f3000bd270800e0038f +:1053300000000000d0ffbd272c00bfaf2800beaf8b +:1053400021f0a0032000c0a31000a0af1400a0af64 +:105350001800a0af010004244700052421300000fc +:1053600021380000ff39400f000000002000c2a3d8 +:105370002000c28321e8c0032c00bf8f2800be8f0d +:105380003000bd270800e00300000000d0ffbd276b +:105390002c00bfaf2800beaf21f0a0032000c0a3a7 +:1053a0001000a0af1400a0af1800a0af01000424ab +:1053b000030005242130000021380000ff39400f90 +:1053c000000000002000c2a32000c28321e8c00327 +:1053d0002c00bf8f2800be8f3000bd270800e003df +:1053e00000000000d0ffbd272c00bfaf2800beafdb +:1053f00021f0a0032000c0a31000a0af1400a0afb4 +:105400001800a0af0100042405000524213000008d +:1054100021380000ff39400f000000002000c2a327 +:105420002000c28321e8c0032c00bf8f2800be8f5c +:105430003000bd270800e00300000000d0ffbd27ba +:105440002c00bfaf2800beaf21f0a0032000c0a3f6 +:105450001000a0af1400a0af1800a0af01000424fa +:10546000060005242130000021380000ff39400fdc +:10547000000000002000c2a32000c28321e8c00376 +:105480002c00bf8f2800be8f3000bd270800e0032e +:1054900000000000d0ffbd272c00bfaf2800beaf2a +:1054a00021f0a0033000c4af2110a0003400c2a737 +:1054b000ffff02242000c2a33000c28f160040105c +:1054c000000000003400c2971300401000000000ec +:1054d0003400c2972400c2a70e0002242600c2a7ef +:1054e0002400c2273400c3973000c48f1000a4af3b +:1054f0001400a3af1a0003241800a3af0100042472 +:105500009e0005242130400004000724ff39400f8d +:10551000000000002000c2a32000c28321e8c003d5 +:105520002c00bf8f2800be8f3000bd270800e0038d +:1055300000000000e0ffbd271c00bfaf1800beaf99 +:1055400021f0a0032000c4af2400c5af1000c0a309 +:105550009838400f000000001000c2a31000c28362 +:105560000c004014000000002000c48f2400c58ff0 +:10557000b237400f000000001000c2a31000c28329 +:105580000400401400000000e138400f000000005b +:105590001000c2a31000c28321e8c0031c00bf8f0b +:1055a0001800be8f2000bd270800e00300000000a7 +:1055b000e0ffbd271c00bfaf1800beaf21f0a00365 +:1055c0002000c4af1000c0a39838400f00000000b6 +:1055d0001000c2a31000c2830b00401400000000a2 +:1055e0002000c48f0a38400f000000001000c2a342 +:1055f0001000c2830400401400000000e138400f96 +:10560000000000001000c2a31000c28321e8c00304 +:105610001c00bf8f1800be8f2000bd270800e003cc +:1056200000000000d0ffbd272c00bfaf2800beaf98 +:1056300021f0a003211080003000c2a32000c0a3ed +:105640003000c2932400c2a32400c2271000a0afe0 +:105650001400a0af1800a0af01000424140005241a +:105660002130400004000724ff39400f00000000f3 +:105670002000c2a32000c28321e8c0032c00bf8ffa +:105680002800be8f3000bd270800e00300000000a6 +:10569000f8ffbd270400beaf21f0a003c0808293b5 +:1056a000ff00423021e8c0030400be8f0800bd2780 +:1056b0000800e00300000000e8ffbd271400bfafb2 +:1056c0001000beaf21f0a003d738400f000000004b +:1056d00021e8c0031400bf8f1000be8f1800bd2743 +:1056e0000800e00300000000d0ffbd272c00bfaf82 +:1056f0002800beaf21f0a003211880002110a000d7 +:105700003000c3a33400c2a32000c0a33000c29362 +:105710002400c2a33400c2932500c2a32400c227e0 +:105720001000a0af1400a0af1800a0af0100042427 +:105730002d0005242130400004000724ff39400fcc +:10574000000000002000c2a33000c29321204000ce +:10575000cb38400f000000002000c28321e8c003c6 +:105760002c00bf8f2800be8f3000bd270800e0034b +:1057700000000000d0ffbd272c00bfaf2800beaf47 +:1057800021f0a0033000c4af2000c0a3d738400fe1 +:10579000000000002100c2a32100c39304000224e2 +:1057a0000e006214000000003000c28f2400c2af5f +:1057b0002400c2271000a0af1400a0af1800a0afb3 +:1057c000010004243a00052421304000040007248d +:1057d000ff39400f000000002000c2a32000c28358 +:1057e00021e8c0032c00bf8f2800be8f3000bd27ea +:1057f0000800e00300000000a8ffbd275400bfaf71 +:105800005000beaf21f0a0035800c4af2110a0008b +:105810005c00c2a35c00c2933000422c0300401421 +:1058200000000000300002245c00c2a35c00c293b0 +:10583000010042245c00c2a35c00c2932000c32785 +:10584000212060005800c58f21304000b57a400ffc +:10585000000000001000a0af1400a0af1800a0af1f +:1058600001000424090005242000c2272130400043 +:1058700030000724ff39400f0000000021e8c0037a +:105880005400bf8f5000be8f5800bd270800e003b2 +:1058900000000000e8ffbd271400bfaf1000beaf3e +:1058a00021f0a0038c34400f0000000021e8c00369 +:1058b0001400bf8f1000be8f1800bd270800e00342 +:1058c00000000000e0ffbd271c00bfaf1800beaf06 +:1058d00021f0a0032000c4af1000c0a39838400fef +:1058e000000000001000c2a31000c2830700401493 +:1058f000000000002000c48fd86b400f00000000a3 +:105900001000c2a3e138400f000000001000c28365 +:1059100021e8c0031c00bf8f1800be8f2000bd27e8 +:105920000800e00300000000e0ffbd271c00bfaf3f +:105930001800beaf21f0a0031000c0a31200c0a742 +:105940001200c2272120000021284000b06b400f28 +:10595000000000001000c2a31000c2830600401423 +:10596000000000001200c297212040005d39400f66 +:10597000000000001000c2a31000c28321e8c00391 +:105980001c00bf8f1800be8f2000bd270800e00359 +:1059900000000000e0ffbd271c00bfaf1800beaf35 +:1059a00021f0a0032000c4af1000c0a39838400f1e +:1059b000000000001000c2a31000c28307004014c2 +:1059c000000000002000c48f3d6c400f000000006c +:1059d0001000c2a3e138400f000000001000c28395 +:1059e00021e8c0031c00bf8f1800be8f2000bd2718 +:1059f0000800e00300000000d0ffbd272c00bfaf6f +:105a00002800beaf21f0a0033000c4af3400c5af02 +:105a10002118c0002110e0003800c3a73c00c2a735 +:105a2000ffff02242000c2a33000c28f000042907a +:105a300017004010000000003000c28f00004290ac +:105a40000f00422c12004010000000003400c28ff2 +:105a5000cc8082af3800c297d28082a73c00c29728 +:105a6000d08082a73000c28f1000a0af1400a0af7a +:105a70001800a0af010004243500052421304000a7 +:105a800018000724ff39400f000000002000c2a3c7 +:105a90002000c28321e8c0032c00bf8f2800be8fe6 +:105aa0003000bd270800e00300000000d8ffbd273c +:105ab0002400bfaf2000beaf21f0a0031000a0afb4 +:105ac0001400a0af1800a0af010004243600052484 +:105ad0002130000021380000ff39400f0000000095 +:105ae00021e8c0032400bf8f2000be8f2800bd27ff +:105af0000800e00300000000d0ffbd272c00bfaf6e +:105b00002800beaf21f0a0033000c4af2118a000d0 +:105b10002110c0003400c3a73800c2a7ffff022431 +:105b20002000c2a33000c28f13004010000000000c +:105b30003800c2972400c2a73400c2972600c2a72b +:105b40002400c2273800c3973000c48f1000a4afd0 +:105b50001400a3af040003241800a3af0100042421 +:105b6000b80005242130400004000724ff39400f0d +:105b7000000000002000c2a32000c28321e8c0036f +:105b80002c00bf8f2800be8f3000bd270800e00327 +:105b90000000000048ffbd27b400bfafb000beaf9b +:105ba00021f0a003b800c4afbc00c5af2110c000f5 +:105bb000c000c2a3f4ff02242000c2a3b800c28f19 +:105bc0002b00401000000000b800c48f0510400feb +:105bd000000000002600401400000000b800c28f42 +:105be0002400c3272120600021284000480006240b +:105bf000b57a400f00000000bc00c28f2120400099 +:105c0000107b400f00000000190040100000000051 +:105c1000bc00c28f16004010000000002400c22704 +:105c200048004324bc00c28f21206000212840008e +:105c300040000624b57a400f00000000c000c29367 +:105c4000ac00c2a32400c2271000a0af1400a0af74 +:105c50001800a0af010004248a0005242130400070 +:105c60008c000724ff39400f000000002000c2a371 +:105c70002000c28321e8c003b400bf8fb000be8ff4 +:105c8000b800bd270800e00300000000d8ffbd27d2 +:105c90002400bfaf2000beaf21f0a0031000a0afd2 +:105ca0001400a0af1800a0af010004240c000524cc +:105cb0002130000021380000ff39400f00000000b3 +:105cc00021e8c0032400bf8f2000be8f2800bd271d +:105cd0000800e00300000000d8ffbd272400bfaf8c +:105ce0002000beaf21f0a0031000a0af1400a0afb1 +:105cf0001800a0af01000424070005242130000093 +:105d000021380000ff39400f0000000021e8c003e7 +:105d10002400bf8f2000be8f2800bd270800e003ad +:105d200000000000d8ffbd272400bfaf2000beaf99 +:105d300021f0a0032800c4af2800c2271000a0afa4 +:105d40001400a0af1800a0af010004240d0005242a +:105d50002130400008000724ff39400f00000000f8 +:105d600021e8c0032400bf8f2000be8f2800bd277c +:105d70000800e00300000000d8ffbd272400bfafeb +:105d80002000beaf21f0a0031000a0af1400a0af10 +:105d90001800a0af010004241c00052421300000dd +:105da00021380000ff39400f0000000021e8c00347 +:105db0002400bf8f2000be8f2800bd270800e0030d +:105dc00000000000d0ffbd272c00bfaf2800beaff1 +:105dd00021f0a003211080003000c2a33000c29344 +:105de00004004010000000000e0002247e17400b4b +:105df000000000000f0002242000c2a32000c29374 +:105e00001000a0af1400a0af1800a0af0100042440 +:105e1000212840002130000021380000ff39400fc8 +:105e20000000000021e8c0032c00bf8f2800be8fb7 +:105e30003000bd270800e00300000000d0ffbd27b0 +:105e40002c00bfaf2800beaf21f0a00321108000be +:105e50003000c2a32000c0a33000c2932400c2a31c +:105e60002400c2271000a0af1400a0af1800a0affc +:105e700001000424180005242130400004000724f8 +:105e8000ff39400f000000002000c2a32000c283a1 +:105e900021e8c0032c00bf8f2800be8f3000bd2733 +:105ea0000800e00300000000d0ffbd272c00bfafba +:105eb0002800beaf21f0a003211080003000c2a353 +:105ec0002000c0a33000c2932400c2a32400c22734 +:105ed0001000a0af1400a0af1800a0af0100042470 +:105ee000190005242130400004000724ff39400f29 +:105ef000000000002000c2a32000c28321e8c003ec +:105f00002c00bf8f2800be8f3000bd270800e003a3 +:105f100000000000d0ffbd272c00bfaf2800beaf9f +:105f200021f0a003211080003000c2a32000c0a3f4 +:105f30003000c2932400c2a32400c2271000a0afe7 +:105f40001400a0af1800a0af010004241b0005241a +:105f50002130400004000724ff39400f00000000fa +:105f60002000c2a32000c28321e8c0032c00bf8f01 +:105f70002800be8f3000bd270800e00300000000ad +:105f8000d0ffbd272c00bfaf2800beaf21f0a0037b +:105f9000211080003000c2a72000c0a32400c0afa1 +:105fa0003000c2972400c2a72400c2271000a0af6f +:105fb0001400a0af1800a0af010004241a000524ab +:105fc0002130400004000724ff39400f000000008a +:105fd0002000c2a32000c28321e8c0032c00bf8f91 +:105fe0002800be8f3000bd270800e003000000003d +:105ff000c8ffbd273400bfaf3000beaf21f0a00303 +:106000003800c4af2110a0003c00c2a7f4ff022456 +:106010002000c2a32400c0af2800c0af3c00c2973c +:106020003406422c13004010000000003800c28fdc +:1060300010004010000000003c00c2972800c2a7da +:106040003800c28f2400c2af2400c2271000a0afc6 +:106050001400a0af1800a0af01000424bb00052469 +:106060002130400008000724ff39400f00000000e5 +:106070002000c2a32000c28321e8c0033400bf8fe8 +:106080003000be8f3800bd270800e003000000008c +:10609000d0ffbd272c00bfaf2800beaf21f0a0036a +:1060a0003000c4af3400c5af3400c28fffff4230b0 +:1060b0002000c2a72000c2273400c38fffff633037 +:1060c0003000c48f1000a4af1400a3af020003245b +:1060d0001800a3af01000424a100052421304000d2 +:1060e00002000724ff39400f0000000021e8c00330 +:1060f0002c00bf8f2800be8f3000bd270800e003b2 +:1061000000000000d0ffbd272c00bfaf2800beafad +:1061100021f0a0033400c5af2118c0003c00c7af78 +:106120004000c28f3000c4a33800c3a32000c2a720 +:106130003c00c28f1400c2af3400c28f2000c3974e +:10614000060043a42000c2977d004010000000001c +:106150003000c38300a0023c001903004002422427 +:10616000211062000000428c750040100000000009 +:106170003000c38300a0023c001903004002422407 +:106180002110620004004294ffff42306c00401076 +:10619000000000003000c38300a0023c001903008f +:1061a00040024224211062000a004290ff00433066 +:1061b0000100022462006214000000002000c29767 +:1061c0001000c2a73000c38300a0023c00190300e6 +:1061d000400242242110620004004294ffff42303a +:1061e0001000c39723106200ffff42301800c2a7bf +:1061f0001800c28708004018000000003000c38368 +:1062000000a0023c00190300400242242110620059 +:10621000040042941000c2a73000c38300a0023cd7 +:106220000019030040024224211062000000438c48 +:106230001000c2971400c48f212860002130400054 +:1062400001000724823c400f000000003c00401485 +:10625000000000003000c38300a0023c00190300ce +:1062600040024224211062000000438c3400c28f9f +:10627000000043ac1000c3873400c28f040043a465 +:106280003400c28f060043941000c29723106200ae +:10629000ffff43303400c28f060043a43000c483a4 +:1062a0003000c38300a0023c0019030040024224d6 +:1062b0002110620004004294ffff43301000c29797 +:1062c00023106200ffff433000a0023c00210400c5 +:1062d0004002422421108200040043a43000c38302 +:1062e00000a0023c00190300400242242110620079 +:1062f00004004294ffff42300700401400000000f9 +:106300003000c38300a0023c001903004002422475 +:1063100021106200000040ac7c81828f0800401098 +:10632000000000007c81828f3000c4833800c3935a +:10633000212860003400c68f09f8400000000000ea +:1063400021e8c0032c00bf8f2800be8f3000bd277e +:106350000800e00300000000e8febd271401bfaf05 +:106360001001beaf21f0a003211880002110a00071 +:106370002001c6af1801c3a31c01c2a71801c39313 +:106380004100022419006214000000002800c22706 +:106390002001c48f21284000040006242138000079 +:1063a000823c400f000000009e01401400000000ed +:1063b0002900c2832c00c2a37c81828f99014010e6 +:1063c000000000007c81828f2800c38321206000b0 +:1063d0002c00c327010005242130600009f840008b +:1063e00000000000891a400b000000001801c39350 +:1063f0004200022419006214000000003000c2278d +:106400002001c48f21284000040006242138000008 +:10641000823c400f00000000820140140000000098 +:106420003100c2833400c2a37c81828f7d01401081 +:10643000000000007c81828f3000c3832120600037 +:106440003400c327020005242130600009f8400011 +:1064500000000000891a400b000000001801c393df +:106460004300022448006214000000003800c227e4 +:106470002001c48f212840000c0006242138000090 +:10648000823c400f00000000660140140000000044 +:106490004100c28327004004000000004100c28385 +:1064a0002118400000a0023c0019030040024224d1 +:1064b000211062000b0040a04100c283211840005f +:1064c00000a0023c00190300400242242110620097 +:1064d000010003240a0043a0da808297ffff4230c4 +:1064e00001004224ffff4230da8082a7da808297df +:1064f000ffff42300600401400000000da8082975f +:10650000ffff423001004224ffff4230da8082a7c1 +:106510004100c28321204000da808297ffff433090 +:1065200000a0023c0021040040024224211082000d +:10653000060043a44100c2834400c2a30200022417 +:106540004800c2a73a00c2974a00c2a73c00c28fc7 +:106550004c00c2af7c81828f3201401000000000ed +:106560007c81828f4000c383212060004400c327c8 +:10657000040005242130600009f8400000000000fc +:10658000891a400b000000001801c3934400022444 +:1065900005006210000000001801c3934b000224a4 +:1065a00028006214000000005800c2272001c48f98 +:1065b000212840000400062421380000823c400fbe +:1065c0000000000001014014000000005800c283d8 +:1065d0005c00c2a35900c2835d00c2a35900c283fc +:1065e0000b004014000000005800c283212040002e +:1065f0005a00c297f8ff4224ffff433000a0023c3c +:10660000002104004002422421108200080043a41b +:106610007c81828ff0004010000000007c81828f1e +:106620005800c383212060005c00c32705000524b7 +:106630002130600009f8400000000000891a400b7a +:10664000000000001801c3934a00022417006214de +:1066500000000000a800c2272001c48f21284000ac +:106660006800062421380000823c400f0000000032 +:10667000ec004014000000000c01c28f0c01c2affe +:106680007481828fe7004010000000007481828fc7 +:10669000a800c4270c01c38f2128600009f840001e +:1066a00000000000891a400b000000001801c3938d +:1066b0004600022409006210000000001801c39384 +:1066c0004800022405006210000000001801c39376 +:1066d0004d0002246800621400000000060002243d +:1066e0001800c2a31801c3934800022403006214d7 +:1066f00000000000090002241800c2a310000224b8 +:106700001e00c2a76000c3271e00c2972001c48fcd +:10671000212860002130400021380000823c400fd9 +:1067200000000000af004014000000002000c0a7df +:106730006c00c2932200c2a36e00c2972000c2a7c1 +:106740002200c38300a0023c00190300400242243f +:10675000211062000c0040a06800c2972400c2a76c +:106760006a00c2972600c2a76200c2977a00c2a739 +:106770006400c28f7c00c2af2200c38300a0023c31 +:1067800000190300400242242110620006004294d6 +:10679000ffff42302000c3972a006214000000006f +:1067a0002400c28718004018000000002400c3879e +:1067b0001c01c2972a106200130040100000000064 +:1067c0002600c2972001c38f211062002001c2afb2 +:1067d0002400c2971e00c2a72200c4831800c293df +:1067e0001e00c5977000c3271000a5af21286000c8 +:1067f000213040002001c78f4118400f00000000e9 +:10680000891a400b000000002400c2977400c2a740 +:106810007000c0af7c81828f7500401000000000c6 +:106820007c81828f2200c4831800c5937000c32727 +:106830002130600009f8400000000000891a400b78 +:10684000000000001e00c3971c01c2972b106200bd +:106850006a004010000000002120000021280000f4 +:106860002130000001000724823c400f000000009e +:10687000891a400b000000001801c3934500022450 +:1068800009006210000000001801c39347000224b1 +:1068900005006210000000001801c3934c000224a0 +:1068a0002f00621400000000070002241900c2a398 +:1068b0001801c39347000224030062140000000083 +:1068c000080002241900c2a38c00c2272001c48f33 +:1068d000212840000800062421380000823c400f97 +:1068e0000000000048004014000000001a00c0a78b +:1068f0008c00c2931c00c2a39000c2971a00c2a7ca +:106900008e00c2878800c2a71c00c38300a0023c7f +:106910000019030040024224211062000600429444 +:10692000ffff42301a00c3973a00621400000000d3 +:106930007c81828f3a004010000000007c81828fb1 +:106940001c00c4831900c5938800c3272130600050 +:1069500009f8400000000000891a400b0000000008 +:106960001801c393520002242e006214000000009c +:106970009400c2272001c48f21284000140006245f +:1069800001000724823c400f000000002500401455 +:10699000000000009800c28f848182af8481828fc2 +:1069a00020004010000000008481828f9400c48f7a +:1069b0009c00c58fa400c3932130600009f84000fb +:1069c00000000000891a400b0000000000000000d9 +:1069d000891a400b0000000000000000891a400bdb +:1069e0000000000000000000891a400b00000000b9 +:1069f00000000000891a400b0000000000000000a9 +:106a0000891a400b0000000000000000891a400baa +:106a10000000000000000000891a400b0000000088 +:106a20000000000021e8c0031401bf8f1001be8fd9 +:106a30001801bd270800e00300000000e8ffbd27a3 +:106a40001400bfaf1000beaf21f0a003dc80829322 +:106a5000ff004230100040140000000000a0023c83 +:106a6000400242242120400021280000b0000624da +:106a7000f27a400f0000000002000424009d023c56 +:106a800058634524193d400f000000000100022416 +:106a9000dc8082a3da8080a721e8c0031400bf8fc6 +:106aa0001000be8f1800bd270800e00300000000a2 +:106ab000e8ffbd271400bfaf1000beaf21f0a00358 +:106ac00000a0023c40024224212040002128000076 +:106ad000b0000624f27a400f0000000002000424f7 +:106ae00021280000193d400f000000007c8180af8c +:106af000748180afdc8080a321e8c0031400bf8fc5 +:106b00001000be8f1800bd270800e0030000000041 +:106b1000f8ffbd270400beaf21f0a0030800c4affa +:106b20000c00c5af0800c28f7c8182af0c00c28f01 +:106b3000748182af21e8c0030400be8f0800bd2726 +:106b40000800e00300000000c0ffbd273c00bfaf0d +:106b50003800beaf21f0a0032118a0002110c00012 +:106b60004000c4a74400c3a34800c2a3ffff0224ff +:106b70002000c2a34000c397020002248d006214cb +:106b8000000000004400c3930100022429006214a5 +:106b9000000000002100c0a3071b400b0000000004 +:106ba000dd8082932800c2a3dd808293ff00423003 +:106bb0000019020000a0023c4002422421106200a1 +:106bc0002400c2afdd808293ff00423001004324e5 +:106bd000070002241a006200f401400010100000b7 +:106be000ff004230dd8082a32400c28f0a00429061 +:106bf000ff00423006004014000000002800c2934d +:106c00002000c2a3000000003b1b400b000000005e +:106c10002100c293010042242100c2a32100c2939b +:106c20000700422cdeff4014000000003b1b400b1d +:106c3000000000004400c393020002242b006214f1 +:106c40000000000000a0023cb00242242c00c2afb1 +:106c50002100c0a3371b400b00000000de808293a0 +:106c60002800c2a3de808293ff00423000110200a0 +:106c70002c00c38f211062002400c2afde808293fb +:106c8000ff00423001004324c317030082170200b3 +:106c9000211862000300633023106200ff004230bd +:106ca000de8082a32400c28f0a004290ff0042309f +:106cb00007004014000000002800c293070042248f +:106cc000ff0042302000c2a33b1b400b000000002d +:106cd0002100c293010042242100c2a32100c293db +:106ce0000400422cddff4014000000002000c2839d +:106cf00030004004000000002400c28f212040002a +:106d00002128000010000624f27a400f0000000045 +:106d10002400c28f010003240a0043a0da80829776 +:106d2000ffff423001004224ffff4230da8082a799 +:106d3000da808297ffff4230060040140000000016 +:106d4000da808297ffff423001004224ffff423089 +:106d5000da8082a7da808297ffff43302400c28f57 +:106d6000060043a44800c29301004230ff004230b5 +:106d700010004010000000002000c2933000c2a3a9 +:106d80002400c28f010003240b0043a03000c2275f +:106d90001000a0af1400a0af1800a0af02000424a0 +:106da000500005242130400004000724ff39400f23 +:106db000000000002000c28321e8c0033c00bf8f18 +:106dc0003800be8f4000bd270800e003000000002f +:106dd000c8ffbd273400bfaf3000beaf21f0a00315 +:106de000211880003c00c5af2110c0003800c3a3ab +:106df0004000c2a3faff02242000c2a33c00c28fbd +:106e000038004010000000003800c2833500400404 +:106e1000000000003800c38300a0023c00190300fa +:106e200040024224211062000a004290ff004330d9 +:106e3000010002242b006214000000004000c293f5 +:106e400028004010000000003800c2932c00c2a3ac +:106e50002400c3273c00c28f21206000212840006d +:106e600008000624b57a400f000000002400c297f5 +:106e70002400c2a72600c2972600c2a72800c28ffe +:106e80002800c2af3800c38300a0023c00190300f1 +:106e9000400242242110620006004294ffff42306b +:106ea0002e00c2a72400c2271000a0af1400a0af7c +:106eb0001800a0af02000424410005242130400046 +:106ec0000c000724ff39400f000000002000c2a37f +:106ed0002000c2830300401000000000f7ff0224de +:106ee0002000c2a32000c28321e8c0033400bf8f6a +:106ef0003000be8f3800bd270800e003000000000e +:106f0000d0ffbd272c00bfaf2800beaf21f0a003eb +:106f1000211880002110a0003000c3a33400c2a3b8 +:106f2000faff02242000c2a33000c28327004004dd +:106f3000000000003000c38300a0023c00190300e1 +:106f400040024224211062000a004290ff004330b8 +:106f5000010002241d006214000000003000c293f2 +:106f60002400c2a33400c2932500c2a33000c3830f +:106f700000a0023c001903004002422421106200dc +:106f800006004294ffff42302600c2a72400c22719 +:106f90001000a0af1400a0af1800a0af020004249e +:106fa000420005242130400004000724ff39400f2f +:106fb000000000002000c2a32000c2830300401094 +:106fc00000000000f7ff02242000c2a32000c283bb +:106fd00021e8c0032c00bf8f2800be8f3000bd27e2 +:106fe0000800e00300000000f0ffbd270c00beaf6a +:106ff00021f0a003211080001400c5af1800c6af17 +:107000001000c2a3faff02240000c2a31000c28332 +:107010000c004004000000001000c38300a0023cec +:107020000019030040024224211062000a0042902d +:10703000ff0043300100022402006214000000003f +:107040000000c0a30000c28321e8c0030c00be8f73 +:107050001000bd270800e00300000000c8ffbd27a6 +:107060003400bfaf3000beaf21f0a0032118800074 +:107070003c00c5af2110c0003800c3a34000c2a32c +:10708000faff02242000c2a33800c2834a00400451 +:10709000000000003c00c28f4700401000000000cc +:1070a0003800c38300a0023c0019030040024224c0 +:1070b000211062000a004290ff00433001000224c8 +:1070c0003d006214000000004000c2933a004010ee +:1070d00000000000440002242100c2a33800c38342 +:1070e00000a0023c0019030040024224211062006b +:1070f0000b004290ff00423001004230ff0042305e +:107100000b004010000000004b0002242100c2a32d +:107110003800c38300a0023c00190300400242244f +:10712000211062000b004290ff0042302d00c2a3ec +:107130003800c2932c00c2a32400c3273c00c28f96 +:10714000212060002128400008000624b57a400f65 +:10715000000000003800c38300a0023c00190300b7 +:10716000400242242110620006004294ffff423098 +:107170002e00c2a72100c3932400c2271000a0af95 +:107180001400a0af1800a0af020004242128600062 +:10719000213040000c000724ff39400f00000000a0 +:1071a0002000c2a32000c2830300401000000000a2 +:1071b000f7ff02242000c2a32000c28321e8c003fd +:1071c0003400bf8f3000be8f3800bd270800e003b9 +:1071d00000000000c0ffbd273c00bfaf3800beafbd +:1071e00021f0a0034400c5af2118c0002110e00029 +:1071f0004000c4a34800c3a74c00c2a7faff022462 +:107200002000c2a74000c2835400400400000000d8 +:107210004400c28f51004010000000004800c29797 +:107220007905422c4d004010000000004000c3834f +:1072300000a0023c00190300400242242110620019 +:107240000a004290ff004330010002244300621410 +:1072500000000000450002242400c2a350000224c4 +:107260002200c2a74000c2932800c2a34800c297d0 +:107270002a00c2a74000c38300a0023c00190300fb +:10728000400242242110620006004294ffff423077 +:107290003400c2a74000c283070042280300401404 +:1072a00000000000440002242200c2a74000c38363 +:1072b00000a0023c00190300400242242110620099 +:1072c0000b004290ff00423001004230ff0042308c +:1072d0000a004010000000004c0002242400c2a359 +:1072e0004000c38300a0023c001903004002422476 +:1072f00021106200080042942200c2a72400c39318 +:1073000080ff022425106200ff0042302118400057 +:107310002800c2274400c68f4800c5972200c497a2 +:107320001000a6af1400a5af1800a4af02000424fb +:10733000212860002130400010000724ff39400f51 +:10734000000000002000c2a72000c28703004010f8 +:1073500000000000f2ff02242000c2a72000c28724 +:1073600021e8c0033c00bf8f3800be8f4000bd271e +:107370000800e00300000000b8ffbd274400bfafd5 +:107380004000beaf21f0a003214080004c00c5affb +:107390002120c0002118e0005c00c28f4800c8a373 +:1073a0005000c4a75400c3a73800c2a3faff0224a8 +:1073b0002000c2a74800c2834e0040040000000025 +:1073c0004c00c28f4b004010000000005000c297dc +:1073d0007905422c47004010000000004800c3839c +:1073e00000a0023c00190300400242242110620068 +:1073f0000a004290ff004330010002243d00621465 +:10740000000000004800c38300a0023c00190300f4 +:1074100040024224211062000a004290ff004230e4 +:1074200034004010000000002800c2272120400046 +:107430002128000010000624f27a400f000000000e +:107440004800c2932800c2a35000c2972a00c2a7d6 +:107450004800c38300a0023c0019030040024224fc +:107460002110620006004294ffff42303400c2a7a0 +:107470005800c28f0c004010000000005800c28f5e +:107480002400c2af2400c28f000042942c00c2a787 +:107490002400c28f020042942e00c2a72400c28f93 +:1074a0000400428c3000c2af2800c2274c00c48fb9 +:1074b0005000c3971000a4af1400a3af44000324ee +:1074c0001800a3af02000424c700052421304000a7 +:1074d00010000724ff39400f000000002000c2a761 +:1074e0002000c2870300401000000000f2ff0224c9 +:1074f0002000c2a72000c28721e8c0034400bf8f3c +:107500004000be8f4800bd270800e00300000000d7 +:10751000c8ffbd273400bfaf3000beaf21f0a003cd +:10752000211880003c00c5af2110c0004400c7af47 +:107530003800c3a34000c2a7faff02242000c2a75c +:107540003800c28365004004000000003c00c28f88 +:1075500062004010000000004000c2975f00401031 +:10756000000000003800c38300a0023c00190300a3 +:1075700040024224211062000a004290ff00433082 +:107580000100022455006214000000002000c0a782 +:107590003800c4833c00c38f00a0023c00210400db +:1075a0004002422421108200000043ac3800c38313 +:1075b00000a0023c00190300400242242110620096 +:1075c0004000c397040043a43800c38300a0023cda +:1075d0000019030040024224211062000c00429076 +:1075e000ff0042303d00401400000000460002242d +:1075f0002200c2a33800c38300a0023c001903008c +:107600004002422421106200010003240c0043a028 +:107610003800c38300a0023c00190300400242244a +:10762000211062000b004290ff0042300100423006 +:10763000ff00423003004010000000004d00022413 +:107640002200c2a34400c28f0500401400000000c5 +:10765000ffff02242400c2af9a1d400b000000006f +:107660004400c28f2400c2af3800c2932800c2a3d6 +:107670003800c38300a0023c0019030040024224ea +:107680002110620006004294ffff42302a00c2a788 +:107690004000c2972c00c2a72200c3932400c22737 +:1076a0001000a0af1400a0af1800a0af0200042487 +:1076b00021286000213040000c000724ff39400fd2 +:1076c000000000002000c2a72000c2870300401075 +:1076d00000000000f2ff02242000c2a72000c287a1 +:1076e00021e8c0033400bf8f3000be8f3800bd27b3 +:1076f0000800e00300000000d0ffbd272c00bfaf52 +:107700002800beaf21f0a003211080003000c2a3ea +:10771000faff02242000c2a33000c2833f004004cd +:10772000000000003000c38300a0023c00190300e9 +:1077300040024224211062000a004290ff004330c0 +:1077400001000224350062140000000049000224f8 +:107750002100c2a33000c2932400c2a33000c3831f +:1077600000a0023c001903004002422421106200e4 +:1077700006004294ffff42302600c2a73000c383b8 +:1077800000a0023c001903004002422421106200c4 +:107790000b004290ff00423001004230ff004230b7 +:1077a00003004010000000004e0002242100c2a38c +:1077b0002100c3932400c2271000a0af1400a0af83 +:1077c0001800a0af020004242128600021304000ee +:1077d00004000724ff39400f000000002000c2a36e +:1077e0002000c2830300401000000000f7ff0224c5 +:1077f0002000c2a300a0023c400243243000c28308 +:107800000011020021106200212040002128000008 +:1078100010000624f27a400f000000002000c2830e +:1078200021e8c0032c00bf8f2800be8f3000bd2789 +:107830000800e00300000000c8ffbd273400bfaf10 +:107840003000beaf21f0a003211880003c00c5af7e +:107850002110c0004400c7af3800c3a34000c2a736 +:107860002000c0a73800c283600040040000000070 +:107870003c00c28f5d004010000000004000c29735 +:107880005a004010000000003800c38300a0023cf2 +:107890000019030040024224211062000a004290b5 +:1078a000ff00433001000224500062140000000079 +:1078b0003800c38300a0023c0019030040024224a8 +:1078c000211062000a004290ff0042304f00401039 +:1078d000000000002000c0a73800c4833c00c38f14 +:1078e00000a0023c0021040040024224211082003a +:1078f000000043ac3800c38300a0023c0019030021 +:1079000040024224211062004000c397040043a4b7 +:107910003800c38300a0023c001903004002422447 +:10792000211062000c004290ff00423033004014ee +:10793000000000003800c38300a0023c00190300cf +:107940004002422421106200010003240c0043a0e5 +:107950004400c28f0500401400000000ffff022415 +:107960002400c2af5d1e400b000000004400c28f27 +:107970002400c2af3800c2932800c2a33800c383da +:1079800000a0023c001903004002422421106200c2 +:1079900006004294ffff42302a00c2a74000c2976f +:1079a0002c00c2a72400c2271000a0af1400a0af73 +:1079b0001800a0af02000424480005242130400034 +:1079c0000c000724ff39400f000000002000c2a770 +:1079d0002000c2870c00401000000000f2ff0224cb +:1079e0002000c2a7831e400b00000000faff022403 +:1079f0002000c2a7831e400b000000000000000012 +:107a0000831e400b00000000000000002000c28721 +:107a100021e8c0033400bf8f3000be8f3800bd277f +:107a20000800e00300000000d8ffbd272400bfaf1e +:107a30002000beaf21f0a0032800c4af1400c0afe7 +:107a40001000c0a31100c0a3d51e400b0000000011 +:107a50001200c0a32800c28f000042801300c2a3fe +:107a60001200c293010042241200c2a31200c2936a +:107a70000500422c0400401400000000211000000a +:107a8000e11e400b000000001300c3932e000224ef +:107a900004006210000000001300c29309004014ab +:107aa000000000001100c2931000c32721106200e3 +:107ab0001000c393080043a01000c0a3c81e400bd1 +:107ac000000000001300c2933000422c110040144b +:107ad000000000001300c2933a00422c0d00401039 +:107ae000000000001000c293401002008018020045 +:107af00021104300ff0043301300c29321106200a5 +:107b0000ff004230d0ff42241000c2a3c81e400b29 +:107b10000000000021100000e11e400b00000000ea +:107b20002800c28f010042242800c2af1300c39373 +:107b30002e00022404006210000000001300c29313 +:107b4000c4ff4014000000001100c2930100422451 +:107b50001100c2a31100c2930400422cbcff4014c8 +:107b6000000000001400c3271800c2272120600075 +:107b70002128400004000624b57a400f00000000d0 +:107b80001400c28f21e8c0032400bf8f2000be8fe5 +:107b90002800bd270800e00300000000d0ffbd273b +:107ba0002c00bfaf2800beaf21f0a0033000c4af4f +:107bb000faff02242000c2a33000c48f107b400fc4 +:107bc000000000002100c2a32100c2936500422ce6 +:107bd00014004010000000002100c293ffff42305b +:107be00001004224ffff42301000a0af1400a0affc +:107bf0001800a0af02000424ca0005243000c68f7c +:107c000021384000ff39400f000000002000c2a3cf +:107c10002000c2830300401000000000f7ff022490 +:107c20002000c2a32000c28321e8c0032c00bf8f24 +:107c30002800be8f3000bd270800e00300000000d0 +:107c400058ffbd27a400bfafa000beaf21f0a00326 +:107c50002118a000b000c6af2110e000a800c4a306 +:107c6000ac00c3a3b400c2a7faff02242000c2a341 +:107c7000a800c28307004228cf0040100000000087 +:107c8000a800c38300a0023c001903004002422464 +:107c9000211062000b004290ff0042300100423090 +:107ca000ff004230c400401000000000ac00c3934d +:107cb000010002242b00621400000000b000c28ffb +:107cc0000000428c2400c2af2400c28f120040107a +:107cd00000000000a800c483a800c38300a0023ce9 +:107ce0000019030040024224211062000b00429060 +:107cf000ff00423002004234ff00433000a0023c4b +:107d00000021040040024224211082000b0043a005 +:107d1000561f400b00000000a800c483a800c383c6 +:107d200000a0023c0019030040024224211062001e +:107d30000b004290ff004330fdff0224241062003c +:107d4000ff00433000a0023c002104004002422416 +:107d5000211082000b0043a02000c0a3ee1f400ba7 +:107d600000000000ac00c393030002242b00621447 +:107d700000000000b000c28f0000428c2800c2af9b +:107d80002800c28f1200401000000000a800c48329 +:107d9000a800c38300a0023c001903004002422453 +:107da000211062000b004290ff004230100042346c +:107db000ff00433000a0023c0021040040024224a6 +:107dc000211082000b0043a0841f400b0000000024 +:107dd000a800c483a800c38300a0023c00190300cc +:107de00040024224211062000b004290ff00433009 +:107df000efff022424106200ff00433000a0023c89 +:107e00000021040040024224211082000b0043a004 +:107e10002000c0a3ee1f400b00000000ac00c39385 +:107e2000040002242b00621400000000b000c28f86 +:107e30000000428c2c00c2af2c00c28f12004010f8 +:107e400000000000a800c483a800c38300a0023c77 +:107e50000019030040024224211062000b004290ee +:107e6000ff00423040004234ff00433000a0023c9b +:107e70000021040040024224211082000b0043a094 +:107e8000b21f400b00000000a800c483a800c383f9 +:107e900000a0023c001903004002422421106200ad +:107ea0000b004290ff004330bfff02242410620009 +:107eb000ff00433000a0023c0021040040024224a5 +:107ec000211082000b0043a02000c0a3ee1f400b36 +:107ed00000000000ac00c3930200022436006214cc +:107ee00000000000b400c2976400422c3200401031 +:107ef00000000000b000c28f3000c2afa800c293e3 +:107f00003400c2a3a800c38300a0023c00190300f0 +:107f1000400242242110620006004294ffff4230da +:107f20003600c2a7ac00c2933500c2a3b400c2970a +:107f30003800c2af3400c22708004224212040008c +:107f40003000c58f64000624b57a400f00000000a1 +:107f50003400c2271000a0af1400a0af1800a0afdb +:107f60000200042451000524213040006c00072445 +:107f7000ff39400f0000000021184000fdff0224df +:107f80000c006214000000003400c2271000a0aff3 +:107f90001400a0af1800a0af02000424d1000524f3 +:107fa000213040006c000724ff39400f0000000022 +:107fb0002000c2a32000c0a32000c28321e8c00388 +:107fc000a400bf8fa000be8fa800bd270800e0035b +:107fd00000000000c0ffbd273c00bfaf3800beafaf +:107fe00021f0a003214080002120a0002118c00022 +:107ff0004c00c7af5000c28f4000c8a34400c4a3c8 +:108000004800c3a33000c2a7faff02242000c2a385 +:108010004000c2834b004004000000004c00c28faf +:1080200048004010000000004000c38300a0023c54 +:108030000019030040024224211062000a0042900d +:10804000ff004330010002243e00621400000000e3 +:108050004400c393020002241400621400000000d4 +:108060004800c393020002240500621000000000d3 +:108070003000c397040002243200621400000000a4 +:108080004000c4834800c3933000c2972128600099 +:108090004c00c68f21384000101f400f0000000028 +:1080a0002000c2a35120400b000000003000c39705 +:1080b0000400022423006214000000004f00022488 +:1080c0002100c2a34800c2932900c2a34000c2936a +:1080d0002800c2a34c00c28f0000428c2400c2af13 +:1080e0004000c38300a0023c001903004002422468 +:1080f0002110620006004294ffff42302a00c2a70e +:108100002100c3932400c2271000a0af1400a0af29 +:108110001800a0af02000424212860002130400094 +:1081200008000724ff39400f000000002000c2a310 +:108130002000c2830300401000000000f7ff02246b +:108140002000c2a32000c28321e8c0033c00bf8fef +:108150003800be8f4000bd270800e003000000008b +:10816000f8ffbd270400beaf21f0a0032118a00036 +:108170002110c0001400c7af0800c4a30c00c3a3a3 +:108180001000c2a3faff022421e8c0030400be8f3e +:108190000800bd270800e00300000000c8ffbd275d +:1081a0003400bfaf3000beaf21f0a0033800c4af31 +:1081b0002110a0004000c6af3c00c2a3f1ff022482 +:1081c0002000c2a33800c28f17004010000000003a +:1081d0004000c28f14004010000000000100022483 +:1081e0002c00c2a73800c28f2400c2af4000c28f4b +:1081f0002800c2af3c00c2932e00c2a32400c227b5 +:108200001000a0af1400a0af1800a0af020004241b +:1082100052000524213040000c000724ff39400f94 +:10822000000000002000c2a32000c28321e8c00398 +:108230003400bf8f3000be8f3800bd270800e00338 +:1082400000000000e0ffbd271c00bfaf1800beaf5c +:1082500021f0a003e64a400f0000000000a0023c0d +:108260002409442421280000200606245b8c400faa +:10827000000000001000c0af1e21400b00000000f5 +:1082800000a0043c1000c28f2118400040110300e0 +:1082900021184000c010030023104300c018020042 +:1082a000231862002409822421106200080040acd7 +:1082b0001000c28f21184000401103002118400017 +:1082c000c010030023104300c018020023186200ee +:1082d0000800632400a0023c24094224211062000b +:1082e0000400442400a0033c1000c28f240965242c +:1082f000211840004011030021184000c010030065 +:1083000023104300c0180200231062002110a200b5 +:108310000c0444ac1000c28f21184000401103002f +:1083200021184000c010030023104300c0180200b1 +:10833000231862000800632400a0023c24094224a0 +:10834000211062000400442400a0053c1000c28fec +:10835000211840004011030021184000c010030004 +:1083600023104300c0180200231862002409a2242d +:1083700021106200100444ac1000c28f211840008c +:108380004011030021184000c010030023104300d7 +:10839000c0180200231862001004632400a0023ced +:1083a00024094224211062000400442400a0053c5a +:1083b0001000c28f21184000401103002118400016 +:1083c000c010030023104300c018020023186200ed +:1083d0002409a22421106200180644ac00a0043c29 +:1083e0001000c28f211840004011030021184000e6 +:1083f000c010030023104300c018020023186200bd +:1084000024098224211062001806448c00a0033c39 +:108410001000c28f24096524211840004011030078 +:1084200021184000c010030023104300c0180200b0 +:10843000231062002110a200140644ac00a0033ceb +:108440001000c28f24096424211840004011030049 +:1084500021184000c010030023104300c018020080 +:1084600023106200211082001c0640ac1000c28f55 +:10847000010042241000c2af1000c28f80ff4018dc +:108480000000000000a0023c01000324240943acca +:1084900000a0023c2409422401000324040043ac50 +:1084a00000a0023c403d442421280000f28f400ff0 +:1084b0000000000000a0023c403d4424fe8c400f20 +:1084c000000000002120000080250524213000004c +:1084d00021380000ea21400f0000000021e8c0031d +:1084e0001c00bf8f1800be8f2000bd270800e003ce +:1084f00000000000e8ffbd271400bfaf1000beafb2 +:1085000021f0a0031800c4af1800c28f0200422857 +:10851000040040140000000021100000e421400b82 +:108520000000000000a0043c1800c28f2118400089 +:108530004011030021184000c01003002310430025 +:10854000c01802002318620024098224211062004e +:10855000080040ac1800c28f2118400040110300f1 +:1085600021184000c010030023104300c01802006f +:10857000231862000800632400a0023c240942245e +:10858000211062000400442400a0033c1800c28fa4 +:1085900024096524211840004011030021184000df +:1085a000c010030023104300c01802002310620013 +:1085b0002110a2000c0444ac1800c28f2118400006 +:1085c0004011030021184000c01003002310430095 +:1085d000c0180200231862000800632400a0023cb7 +:1085e00024094224211062000400442400a0053c18 +:1085f0001800c28f211840004011030021184000cc +:10860000c010030023104300c018020023186200aa +:108610002409a22421106200100444ac1800c28f67 +:10862000211840004011030021184000c010030031 +:1086300023104300c01802002318620010046324b2 +:1086400000a0023c240942242110620004004424ba +:1086500000a0053c1800c28f211840004011030003 +:1086600021184000c010030023104300c01802006e +:10867000231862002409a22421106200180644acc9 +:1086800000a0043c1800c28f2118400040110300d4 +:1086900021184000c010030023104300c01802003e +:1086a0002318620024098224211062001806448cd9 +:1086b00000a0033c1800c28f240965242118400043 +:1086c0004011030021184000c01003002310430094 +:1086d000c0180200231062002110a200140644ac4e +:1086e00000a0033c1800c28f240964242118400014 +:1086f0004011030021184000c01003002310430064 +:10870000c018020023106200211082001c0640ac39 +:1087100000a0023c2409438c010002241b006214c7 +:108720000000000000a0033c1800c28f240964244c +:10873000211840004011030021184000c010030020 +:1087400023104300c0180200231062002110820091 +:108750000400428c060040100000000001000324c9 +:108760000700431000000000e321400b0000000060 +:108770002e4e400f00000000e321400b00000000df +:10878000704e400f000000000000000001000224b5 +:1087900021e8c0031400bf8f1000be8f1800bd2752 +:1087a0000800e00300000000c8ffbd273400bfaf91 +:1087b0003000beaf21f0a0033800c4af3c00c5af0d +:1087c0004000c6af4400c7af3800c28f0400401c51 +:1087d000000000003800c28f0400410400000000c7 +:1087e000050002246022400b0000000000a0043cb1 +:1087f0003800c28f211840004011030021184000aa +:10880000c010030023104300c018020023186200a8 +:1088100024098224211062000000438c01000224fc +:1088200056006214000000004000c28f0f00400498 +:108830000000000002004328060060140000000051 +:108840000200032406004310000000001b22400b1e +:10885000000000002000c0af1b22400b0000000001 +:10886000010002242000c2af000000004400c28fbb +:10887000010003240900431000000000020003244b +:108880000a004310000000000b004014000000002c +:108890002400c0af2e22400b000000000100022483 +:1088a0002400c2af2e22400b000000000200022470 +:1088b0002400c2af0000000000a0033c3800c28fbb +:1088c00024096424211840004011030021184000ad +:1088d000c010030023104300c018020023106200e0 +:1088e000211082000400448c3800c28f21184000ff +:1088f0004011030021184000c01003002310430062 +:10890000c0180200231862000800632400a0023c83 +:108910002409422421106200040046243800c28f3a +:10892000211840004011030021184000c01003002e +:1089300023104300c01802002318620007046324b8 +:1089400000a0023c240942242110620004004224b9 +:108950003c00c38f1000a3af2000c38f1400a3af4f +:108960002400c38f1800a3af3800c58f2138400002 +:108970005c4b400f000000002800c2af2800c28fef +:1089800021e8c0033400bf8f3000be8f3800bd2700 +:108990000800e00300000000e0ffbd271c00bfaf9f +:1089a0001800beaf21f0a0032000c4af2400c5af63 +:1089b0002800c6af2000c28f2118400040110300dc +:1089c00021184000c010030023104300c01802000b +:1089d0002318620000a0023c2409422421106200f6 +:1089e0001400c2af2000c28f070041040000000045 +:1089f0002000c28f04004018000000002110000079 +:108a0000b322400b000000001000c0af9e22400bbc +:108a1000000000001400c28f1406428c2400c38f93 +:108a200000006380000043a0010043241400c28fb3 +:108a3000140643ac2400c28f010042242400c2afbc +:108a40001400c28f1406438c1400c28f13064224f4 +:108a50002b10430005004010000000001400c28fde +:108a6000140443241400c28f140643ac1000c28fb8 +:108a7000010042241000c2af1000c38f2800c28f33 +:108a80002a106200e3ff4014000000001400c28faf +:108a90001c06438c2800c28f211862001400c28f6c +:108aa0001c0643ac1400c28f1c06428c00024228f4 +:108ab0000500401400000000029d023c983f442441 +:108ac000578f400f000000000100022421e8c0037e +:108ad0001c00bf8f1800be8f2000bd270800e003d8 +:108ae00000000000f0ffbd270c00beaf21f0a00386 +:108af0001000c4af1000c28f2118400040110300c5 +:108b000021184000c010030023104300c0180200c9 +:108b10002318620000a0023c2409422421106200b4 +:108b20000000c2af0000c28f1406438c0000c28f49 +:108b30001806428c0400621400000000211000009e +:108b4000f222400b000000000000c28f1806438c88 +:108b50000000c28f1406428c2b10620009004010e6 +:108b6000000000000000c28f1406428c2118400053 +:108b70000000c28f1806428c23106200f222400bc4 +:108b8000000000000000c28f13064224211840009c +:108b90000000c28f1806428c231062000400c2af8e +:108ba0000000c28f1406428c211840000000c28fc2 +:108bb00014044224231062000400c38f21106200b9 +:108bc0000400c2af0400c28f21e8c0030c00be8fb6 +:108bd0001000bd270800e00300000000f0ffbd27e3 +:108be0000c00beaf21f0a0031000c4af1400c5af4d +:108bf0001800c6af0400c0af00a0043c1000c28f34 +:108c0000211840004011030021184000c01003004b +:108c100023104300c0180200231862002409822494 +:108c2000211062001004448c00a0033c1000c28f8d +:108c30002409652421184000401103002118400038 +:108c4000c010030023104300c0180200231062006c +:108c50002110a2000c04428c2b1082007d004010d9 +:108c60000000000000a0043c1000c28f211840004a +:108c70004011030021184000c010030023104300de +:108c8000c018020023186200240982242110620007 +:108c90001004428c212040001000c28f2118400097 +:108ca0004011030021184000c010030023104300ae +:108cb000c0180200231862000800632400a0023cd0 +:108cc000240942242110620004004224232082004f +:108cd0001000c28f211840004011030021184000ed +:108ce000c010030023104300c018020023186200c4 +:108cf0000704632400a0023c2409422421106200de +:108d0000040042242128400000a0033c1000c28f30 +:108d10002409662421184000401103002118400056 +:108d2000c010030023104300c0180200231062008b +:108d30002110c2000c04428c2310a20021188200d2 +:108d40001800c28f2a1062000101401000000000cc +:108d500000a0043c1000c28f211840004011030005 +:108d600021184000c010030023104300c018020067 +:108d7000231862002409822421106200080040acfc +:108d80001000c28f2118400040110300211840003c +:108d9000c010030023104300c01802002318620013 +:108da0000800632400a0023c240942242110620030 +:108db0000400442400a0033c1000c28f2409652451 +:108dc000211840004011030021184000c01003008a +:108dd00023104300c0180200231062002110a200db +:108de0000c0444ac1000c28f211840004011030055 +:108df00021184000c010030023104300c0180200d7 +:108e0000231862000800632400a0023c24094224c5 +:108e1000211062000400442400a0053c1000c28f11 +:108e2000211840004011030021184000c010030029 +:108e300023104300c0180200231862002409a22452 +:108e400021106200100444ac04000224c324400b2f +:108e50000000000000a0033c1000c28f240964241d +:108e6000211840004011030021184000c0100300e9 +:108e700023104300c018020023106200211082005a +:108e80000c04448c00a0053c1000c28f2118400047 +:108e90004011030021184000c010030023104300bc +:108ea000c0180200231862002409a22421106200c5 +:108eb0001004428c2b108200600040100000000063 +:108ec00000a0043c1000c28f211840004011030094 +:108ed00021184000c010030023104300c0180200f6 +:108ee0002318620024098224211062001004428c9d +:108ef0002120400000a0033c1000c28f24096524fb +:108f0000211840004011030021184000c010030048 +:108f100023104300c0180200231062002110a20099 +:108f20000c04428c231882001800c28f2a106200a1 +:108f3000870040100000000000a0043c1000c28f19 +:108f4000211840004011030021184000c010030008 +:108f500023104300c0180200231862002409822451 +:108f600021106200080040ac1000c28f21184000a0 +:108f70004011030021184000c010030023104300db +:108f8000c0180200231862000800632400a0023cfd +:108f900024094224211062000400442400a0033c60 +:108fa0001000c28f240965242118400040110300dd +:108fb00021184000c010030023104300c018020015 +:108fc000231062002110a2000c0444ac1000c28fd8 +:108fd000211840004011030021184000c010030078 +:108fe00023104300c0180200231862000800632405 +:108ff00000a0023c24094224211062000400442401 +:1090000000a0053c1000c28f211840004011030051 +:1090100021184000c010030023104300c0180200b4 +:10902000231862002409a22421106200100444ac19 +:1090300004000224c324400b000000001800c28f6b +:1090400000044228420040140000000000a0043c3c +:109050001000c28f21184000401103002118400069 +:10906000c010030023104300c01802002318620040 +:109070002409822421106200080040ac1000c28f35 +:10908000211840004011030021184000c0100300c7 +:1090900023104300c0180200231862000800632454 +:1090a00000a0023c24094224211062000400442450 +:1090b00000a0033c1000c28f240965242118400041 +:1090c0004011030021184000c0100300231043008a +:1090d000c0180200231062002110a2000c0444ac4e +:1090e0001000c28f211840004011030021184000d9 +:1090f000c010030023104300c018020023186200b0 +:109100000800632400a0023c2409422421106200cc +:109110000400442400a0053c1000c28f2118400028 +:109120004011030021184000c01003002310430029 +:10913000c0180200231862002409a2242110620032 +:10914000100444ac04000224c324400b00000000bf +:109150000000c0afb024400b000000001000c28f20 +:10916000211840004011030021184000c0100300e6 +:1091700023104300c018020023186200080463246f +:1091800000a0023c2409422421106200040044246f +:1091900000a0033c1000c28f240965242118400060 +:1091a0004011030021184000c010030023104300a9 +:1091b000c0180200231062002110a2000c04428c8f +:1091c0001400c38f00006380000043a0010042240c +:1091d000000082ac1400c28f010042241400c2af10 +:1091e00000a0033c1000c28f240964242118400011 +:1091f0004011030021184000c01003002310430059 +:10920000c018020023106200211082000c04448c5c +:109210001000c28f211840004011030021184000a7 +:10922000c010030023104300c0180200231862007e +:109230000704632400a0023c240942242110620098 +:10924000040042242b1044001a00401000000000cb +:109250001000c28f21184000401103002118400067 +:10926000c010030023104300c0180200231862003e +:109270000800632400a0023c24094224211062005b +:109280000400442400a0033c1000c28f240965247c +:10929000211840004011030021184000c0100300b5 +:1092a00023104300c0180200231062002110a20006 +:1092b0000c0444ac0000c28f010042240000c2af85 +:1092c0000000c38f1800c28f2a106200a3ff401451 +:1092d0000000000000a0043c1000c28f21184000d4 +:1092e0004011030021184000c01003002310430068 +:1092f000c018020023186200240982242110620091 +:1093000001000324080043ac0400c28f21e8c0031d +:109310000c00be8f1000bd270800e0030000000015 +:10932000f8ffbd270400beaf21f0a0030800c4afc2 +:109330000c00c5af00a0043c0800c28f21184000fb +:109340004011030021184000c01003002310430007 +:10935000c018020023186200240982242110620030 +:109360001004438c0c00c28f212062000800c28fc1 +:10937000211840004011030021184000c0100300d4 +:1093800023104300c0180200231862000800632461 +:1093900000a0023c2409422421106200040042245f +:1093a000000442242b1082001d0040100000000029 +:1093b00000a0043c0800c28f2118400040110300a7 +:1093c00021184000c010030023104300c018020001 +:1093d0002318620024098224211062001004438ca7 +:1093e0000c00c28f2120620000a0053c0800c28f43 +:1093f000211840004011030021184000c010030054 +:1094000023104300c0180200231862002409a2247c +:1094100021106200100444ac4225400b0000000003 +:1094200000a0043c0800c28f211840004011030036 +:1094300021184000c010030023104300c018020090 +:109440002318620024098224211062001004428c37 +:10945000212040000800c28f211840004011030065 +:1094600021184000c010030023104300c018020060 +:10947000231862000800632400a0023c240942244f +:1094800021106200040042240004422423108200c0 +:109490000c00c38f211062000c00c2af0800c28f05 +:1094a000211840004011030021184000c0100300a3 +:1094b00023104300c0180200231862000800632430 +:1094c00000a0023c2409422421106200040043242d +:1094d0000c00c28f2120620000a0053c0800c28f52 +:1094e000211840004011030021184000c010030063 +:1094f00023104300c0180200231862002409a2248c +:1095000021106200100444ac00a0043c0800c28f8b +:10951000211840004011030021184000c010030032 +:1095200023104300c018020023186200240982247b +:10953000211062001004448c00a0033c0800c28f7c +:10954000240965242118400040110300211840001f +:10955000c010030023104300c01802002310620053 +:109560002110a2000c04428c1000821000000000a8 +:1095700000a0043c0800c28f2118400040110300e5 +:1095800021184000c010030023104300c01802003f +:1095900023186200240982242110620001000324a0 +:1095a000080043ac7725400b0000000000a0043cfd +:1095b0000800c28f2118400040110300211840000c +:1095c000c010030023104300c018020023186200db +:1095d0002409822421106200080040ac010002240a +:1095e00021e8c0030400be8f0800bd270800e00387 +:1095f00000000000c0fdbd273c02bfaf3802beaf77 +:1096000021f0a0031800c0afe14c400f00000000a3 +:109610001800c0afe926400b0000000000a0043c89 +:109620001800c28f2118400040110300211840008b +:10963000c010030023104300c0180200231862006a +:1096400024098224211062000800428ccd004010c1 +:109650000000000000a0033c1800c28f240964240d +:10966000211840004011030021184000c0100300e1 +:1096700023104300c0180200231062002110820052 +:109680000c04428c2800c2af00a0043c1800c28f1a +:10969000211840004011030021184000c0100300b1 +:1096a00023104300c01802002318620024098224fa +:1096b000211062001004438c2800c28f2b1062001e +:1096c00012004010000000002800c48f00a0053cdc +:1096d0001800c28f211840004011030021184000db +:1096e000c010030023104300c018020023186200ba +:1096f0002409a224211062001004428c231082004d +:109700002000c2aff025400b000000001800c28fff +:10971000211840004011030021184000c010030030 +:1097200023104300c01802002318620008006324bd +:1097300000a0023c240942242110620004004224bb +:10974000000442242120400000a0053c1800c28fe4 +:10975000211840004011030021184000c0100300f0 +:1097600023104300c0180200231862002409a22419 +:10977000211062001004428c232082002800c58f33 +:109780001800c28f2118400040110300211840002a +:10979000c010030023104300c01802002318620009 +:1097a0000800632400a0023c240942242110620026 +:1097b000040042242310a200211082002000c2af26 +:1097c00000a0043c1800c28f211840004011030083 +:1097d00021184000c010030023104300c0180200ed +:1097e0002318620024098224211062000000428ca8 +:1097f000440040100000000000a0043c1800c28f8c +:10980000211840004011030021184000c01003003f +:1098100023104300c0180200231862002409822488 +:1098200021106200080040ac00a0043c1800c28f68 +:10983000211840004011030021184000c01003000f +:1098400023104300c0180200231862002409822458 +:10985000211062001004448c00a0033c1800c28f49 +:1098600024096524211840004011030021184000fc +:10987000c010030023104300c01802002310620030 +:109880002110a2000400468c1800c28f211840004d +:109890004011030021184000c010030023104300b2 +:1098a000c0180200231862000800632400a0023cd4 +:1098b0002409422421106200040047241800c28faa +:1098c000211840004011030021184000c01003007f +:1098d00023104300c0180200231862000704632409 +:1098e00000a0023c2409422421106200040042240a +:1098f0001000a2af2000c58fe44b400f0000000015 +:109900001c00c2af1c00c28f020003240a004310d7 +:10991000000000000300432816006014000000004f +:109920000300032416004310000000000400032479 +:10993000140043140000000000a0043c1800c28f73 +:10994000211840004011030021184000c0100300fe +:1099500023104300c0180200231862002409822447 +:109960002110620001000324080043ac6126400b73 +:1099700000000000000000006126400b0000000015 +:10998000000000001800c48fb922400f0000000042 +:109990002c00c2af2c00c28f7f00401800000000d6 +:1099a0002400c0afc226400b000000001800c28f88 +:1099b000211840004011030021184000c01003008e +:1099c00023104300c0180200231862001806632405 +:1099d00000a0023c240942242120620000a0053c92 +:1099e0001800c28f211840004011030021184000c8 +:1099f000c010030023104300c018020023186200a7 +:109a00002409a224211062001806428c000045801f +:109a10002400c38f1800c6272118c3001c0065a0ae +:109a200001004224000082ac00a0043c1800c28f58 +:109a3000211840004011030021184000c01003000d +:109a400023104300c0180200231862002409822456 +:109a5000211062001806448c1800c28f21184000a3 +:109a60004011030021184000c010030023104300e0 +:109a7000c0180200231862000f06632400a0023cf5 +:109a80002409422421106200040042242b104400c7 +:109a90001a004010000000001800c28f211840007a +:109aa0004011030021184000c010030023104300a0 +:109ab000c0180200231862001004632400a0023cb6 +:109ac00024094224211062000400442400a0053c23 +:109ad0001800c28f211840004011030021184000d7 +:109ae000c010030023104300c018020023186200b6 +:109af0002409a22421106200180644ac2400c28f5d +:109b0000010042242400c2af2400c38f2c00c28f66 +:109b10002a106200a5ff40140000000000a0033cd2 +:109b20001800c28f2409642421184000401103004a +:109b300021184000c010030023104300c018020089 +:109b400023106200211082001c06438c2c00c28f5f +:109b50002320620000a0033c1800c28f2409652462 +:109b6000211840004011030021184000c0100300dc +:109b700023104300c0180200231062002110a2002d +:109b80001c0644ac1800c28f030040140000000003 +:109b90003000c0af3000c0af1800c28f01004224b7 +:109ba0001800c2af1800c28f9cfe401800000000d1 +:109bb0000100022421e8c0033c02bf8f3802be8f9f +:109bc0004002bd270800e00300000000e0ffbd27c1 +:109bd0001c00bfaf1800beaf21f0a0032000c4af2f +:109be0001000c0af0027400b000000007d25400f93 +:109bf000000000001000c28f010042241000c2af1c +:109c00001000c38f2000c28f2b106200f7ff40149a +:109c10000000000021e8c0031c00bf8f1800be8fa9 +:109c20002000bd270800e00300000000e8ffbd277a +:109c30001400bfaf1000beaf21f0a0031800c4afe6 +:109c40001800c28f0800401800000000211000001a +:109c50002a27400b000000007d25400f0000000077 +:109c60001b27400b000000000000000000a0043c87 +:109c70001800c28f21184000401103002118400035 +:109c8000c010030023104300c01802002318620014 +:109c900024098224211062000800428ceeff401447 +:109ca000000000000100022421e8c0031400bf8f5f +:109cb0001000be8f1800bd270800e0030000000060 +:109cc000e0ffbd271c00bfaf1800beaf21f0a0030e +:109cd0002000c4af2400c5af2400c28f0c8182af26 +:109ce00001000224188182af2400c28fff0045309a +:109cf0002400c28f02120200ff0043302400c28ff2 +:109d000002140200ff0042302400c48f0226040027 +:109d10001000a4af029d043c240d84242130600077 +:109d200021384000688f400f00000000029d023c77 +:109d3000400d44242000c58f688f400f00000000b4 +:109d400021e8c0031c00bf8f1800be8f2000bd2774 +:109d50000800e00300000000d0ffbd272c00bfafcb +:109d60002800beaf21f0a003211880002110a00020 +:109d70003800c6af3000c3a33400c2a33400c2937e +:109d80000800432c8f0160100000000080180200c2 +:109d9000019d023ca89d4224211062000000428cdb +:109da0000800400000000000c4a3009dc89d009d65 +:109db000b89e009dc4a3009d249f009dc4a3009d48 +:109dc0003ca1009dc4a3009d3800c28f1000c2af0b +:109dd0001000c28f000042803100401400000000db +:109de000488082833000c3830800621400000000b2 +:109df000488082832120400021280000c01b400fa2 +:109e000000000000f128400b000000004a8082831f +:109e10003000c38308006214000000004a8082837f +:109e20002120400021280000c01b400f000000003e +:109e3000f128400b000000004c8082833000c38377 +:109e400008006214000000004c8082832120400042 +:109e500021280000c01b400f00000000f128400b2b +:109e6000000000004e8082833000c3834b016214e7 +:109e7000000000004e808283212040002128000045 +:109e8000c01b400f00000000029d023c540d442402 +:109e9000578f400f00000000f128400b0000000029 +:109ea000029d023c700d4424578f400f00000000bb +:109eb000f128400b000000003800c28f1400c2af30 +:109ec0001400c28f000042800c004010000000000f +:109ed0003000c3831400c28f00004280029d043c06 +:109ee0007c0d84242128600021304000688f400fc1 +:109ef00000000000f128400b000000004a8082832f +:109f00003000c383280162140000000021200000fb +:109f1000010005241c7f400f00000000f128400bc9 +:109f2000000000003800c28f1800c2af1800c28fb6 +:109f300000004280790040040000000048808283d5 +:109f40003000c3831e0062140000000000a0023c29 +:109f50003414442421280000000406245b8c400fa4 +:109f6000000000001800c28f00004280478082a3da +:109f7000478082832120400000a0023c3414452405 +:109f80000004062421380000441d400f000000009a +:109f9000029d023ca00d4224212040005f000524c8 +:109fa000982b400f00000000029d023c000e44244c +:109fb000578f400f00000000f128400b0000000008 +:109fc0004a8082833000c3831e00621400000000b8 +:109fd00000a0023c701c442421280000c800062474 +:109fe0005b8c400f000000001800c28f0000428010 +:109ff000498082a3498082832120400000a0023c46 +:10a00000701c4524c800062421380000441d400f60 +:10a010000000000001000424010005241c7f400f03 +:10a0200000000000029d023c1c0e42242120400042 +:10a030000f000524782c400f00000000f128400b91 +:10a04000000000004c8082833000c383180062143b +:10a050000000000000a0023c34104424212800002d +:10a06000000406245b8c400f000000001800c28f23 +:10a07000000042804b8082a34b80828321204000dd +:10a0800000a0023c341045240004062421380000be +:10a09000441d400f00000000029d023c2c0e442491 +:10a0a000578f400f00000000f128400b0000000017 +:10a0b0004e8082833000c383be0062140000000023 +:10a0c00000a0023c34184424212800000004062487 +:10a0d0005b8c400f000000001800c28f000042801f +:10a0e0004d8082a34d8082832120400000a0023c4d +:10a0f000341845240004062421380000441d400f74 +:10a1000000000000029d023c480e4424578f400f7f +:10a1100000000000f128400b000000003000c28366 +:10a12000029d033c640e642421284000688f400f88 +:10a1300000000000f128400b000000003800c28f32 +:10a140001c00c2af1c00c28f0000428c51004010a6 +:10a15000000000001c00c28f040042844d00401823 +:10a1600000000000478082833000c3831200621425 +:10a1700000000000478082832120400000a0023cb4 +:10a18000341445240004062421380000441d400fe7 +:10a19000000000001c00c28f0400428400a0033ca9 +:10a1a0003414642421284000ed4e400f00000000cc +:10a1b000a228400b00000000498082833000c38346 +:10a1c0000b006214000000004980828321204000bf +:10a1d00000a0023c701c4524c80006242138000061 +:10a1e000441d400f00000000a228400b00000000aa +:10a1f0004b8082833000c3830b0062140000000098 +:10a200004b8082832120400000a0023c3410452472 +:10a210000004062421380000441d400f0000000007 +:10a22000a228400b000000004d8082833000c383d1 +:10a2300015006214000000004d8082832120400040 +:10a2400000a0023c341845240004062421380000f4 +:10a25000441d400f000000000300401000000000fb +:10a26000010002242000c2a31c00c28f0000438c06 +:10a270001c00c28f0400428421206000212840007d +:10a280004f5a400f0000000000000000f128400b72 +:10a2900000000000478082833000c3830d006214f9 +:10a2a000000000004780828321204000be1d400f37 +:10a2b00000000000ffff0224478082a3029d023cb1 +:10a2c000800e4424578f400f00000000f128400bff +:10a2d00000000000498082833000c3830d006214b7 +:10a2e000000000004980828321204000be1d400ff5 +:10a2f00000000000ffff0224498082a30100042423 +:10a30000212800001c7f400f00000000f128400bb6 +:10a31000000000004b8082833000c3830d00621474 +:10a32000000000004b80828321204000be1d400fb2 +:10a3300000000000ffff02244b8082a3029d023c2c +:10a34000a00e4424578f400f00000000f128400b5e +:10a35000000000004d8082833000c3831800621427 +:10a36000000000004d80828321204000be1d400f70 +:10a3700000000000ffff02244d8082a3029d023cea +:10a38000bc0e4424578f400f000000008530400f62 +:10a3900000000000f128400b000000000000000059 +:10a3a000f128400b0000000000000000f128400be5 +:10a3b0000000000000000000f128400b0000000039 +:10a3c0000000000021e8c0032c00bf8f2800be8fd2 +:10a3d0003000bd270800e00300000000e0ffbd27bb +:10a3e0001c00bfaf1800beaf21f0a0032000c4af17 +:10a3f0002400c5af2000c48f107b400f0000000078 +:10a400001000c2a71000c2970500422c750040142e +:10a41000000000001000c297ffff42242000c38ffd +:10a42000211862002400c28f0500422400004290df +:10a430000f0042300a0042280a00401400000000c9 +:10a440002400c28f05004224000042900f004230d9 +:10a45000ff00423037004224ff0042302029400be9 +:10a46000000000002400c28f05004224000042903a +:10a470000f004230ff00423030004224ff004230e3 +:10a48000000062a01000c297feff42242000c38f8c +:10a49000211862002400c28f05004224000042906f +:10a4a00002110200ff0042300f0042300a00422831 +:10a4b0000a004014000000002400c28f050042245e +:10a4c0000000429002110200ff0042303700422497 +:10a4d000ff0042303e29400b000000002400c28fe4 +:10a4e000050042240000429002110200ff004230a9 +:10a4f00030004224ff004230000062a01000c297ea +:10a50000fcff42242000c38f211862002400c28f68 +:10a5100004004224000042900f0042300a0042280a +:10a520000a004014000000002400c28f04004224ee +:10a53000000042900f004230ff00423037004224ba +:10a54000ff0042305a29400b000000002400c28f57 +:10a5500004004224000042900f004230ff004230cd +:10a5600030004224ff004230000062a01000c29779 +:10a57000fbff42242000c38f211862002400c28ff9 +:10a58000040042240000429002110200ff00423009 +:10a590000f0042300a0042280a0040140000000068 +:10a5a0002400c28f040042240000429002110200e5 +:10a5b000ff00423037004224ff0042307829400b30 +:10a5c000000000002400c28f0400422400004290da +:10a5d00002110200ff00423030004224ff004230ee +:10a5e000000062a021e8c0031c00bf8f1800be8fce +:10a5f0002000bd270800e00300000000c8ffbd27c1 +:10a600003400bfaf3000beaf2c00b0af21f0a003cc +:10a61000211080003c00c5af3800c2a33800c293af +:10a6200032000324320043100000000033004328ae +:10a6300074006010000000000b0003244b00431066 +:10a64000000000002c0003247100431400000000ef +:10a650003c00c28f1800c2af1800c28f00004390a8 +:10a66000010002240f00621400000000029d023c61 +:10a67000dc0e4424578f400f0000000000a0023c75 +:10a68000601c44242413400f000000000100022439 +:10a69000148182af010002244f8082a3082a400b5c +:10a6a000000000001800c28f000042905b004014c0 +:10a6b00000000000029d023cf00e4424578f400f22 +:10a6c00000000000148180af020002244f8082a3aa +:10a6d000ea2a400f0000000021200000212800008d +:10a6e0001c7f400f00000000082a400b0000000003 +:10a6f0003c00c28f1c00c2af1c00c28f0000429001 +:10a70000212840001c00c28f01004224000042901a +:10a71000211840001c00c28f020042240000429019 +:10a720001c00c48f03008424000084901000a4af98 +:10a73000029d043c040f8424213060002138400035 +:10a74000688f400f0000000001000224148182afd6 +:10a7500000a0023c243e422421204000e71e400f7e +:10a7600000000000082a400b000000003c00c28fdf +:10a770002000c2af029d023c200f4424578f400f9f +:10a78000000000002000c28f6300429017004014b8 +:10a79000000000002000c28f218040002000c28ff6 +:10a7a00021204000d988400f00000000ff00423007 +:10a7b000212840002000c28f6200429021184000f2 +:10a7c0002000c28f21004224ff0004241000a4af07 +:10a7d000212000022130600021384000c811400fc4 +:10a7e00000000000082a400b00000000029d023c0f +:10a7f000480f4424578f400f00000000082a400be8 +:10a800000000000000000000082a400b00000000cb +:10a8100000000000082a400b0000000000000000bb +:10a8200021e8c0033400bf8f3000be8f2c00b08ff2 +:10a830003800bd270800e00300000000b0ffbd277e +:10a840004c00bfaf4800beaf4400b0af21f0a00342 +:10a850001c8180af0500042401000524eb60400f3b +:10a860000000000000a0023c601c442421280000dd +:10a87000100006245b8c400f0000000000a0023c8a +:10a88000327e033cc0a86334601c43ac00a0023c91 +:10a89000601c42240808033c08086334080043ace9 +:10a8a00000a0023c601c42243201033cc0a8633477 +:10a8b000040043ac00a0023c601c4224ff00033ca7 +:10a8c000ffff63340c0043ac6280400f00000000c7 +:10a8d0001c00c22721204000212800001c00062463 +:10a8e0005b8c400f00000000019d023cfca542244f +:10a8f0001c00c2af1c00c227212040003e11400fa7 +:10a90000000000001800c2a31800c2830700401016 +:10a9100000000000208180af030002244f8082a34a +:10a9200021100000be2a400b00000000010002249c +:10a93000208182af020002244f8082a38f1a400f31 +:10a9400000000000019d023c589d4424019d023cf2 +:10a95000c09c4524c41a400f00000000ac8184272d +:10a96000a88185274d15400f00000000a881829323 +:10a970000400401400000000408084270913400fa9 +:10a9800000000000408084276c15400f000000008c +:10a9900000a0023c143e4224212040004080852734 +:10a9a000f728400f0000000000a0023ccc3d4424ea +:10a9b00040808527f728400f0000000000a0023cdf +:10a9c000143e502400a0023c143e422421204000aa +:10a9d000107b400f00000000ff00423021200002e9 +:10a9e00021284000fe15400f00000000212000003b +:10a9f0005c13400f00000000ff0002241000a2af13 +:10aa0000029d023c640f44240b000524020006242e +:10aa1000029d023c700f4724c811400f0000000047 +:10aa20000500401000000000029d023c7c0f442401 +:10aa3000688f400f000000003800c227212040002e +:10aa4000fc7e400f000000002120000001000524d2 +:10aa5000067f400f000000000100042401000524cf +:10aa6000067f400f000000000200042401000524be +:10aa7000067f400f0000000003000424212800008e +:10aa8000067f400f0000000004000424212800007d +:10aa9000067f400f00000000212000002128000058 +:10aaa0001c7f400f0000000001000424212800004a +:10aab0001c7f400f00000000020004242128000039 +:10aac0001c7f400f00000000030004242128000028 +:10aad0001c7f400f00000000040004242128000017 +:10aae0001c7f400f0000000005000424881305248b +:10aaf000eb60400f0000000021e8c0034c00bf8f56 +:10ab00004800be8f4400b08f5000bd270800e0030e +:10ab100000000000e0ffbd271c00bfaf1800beaf63 +:10ab200021f0a003ea2a400f00000000ac1a400ff9 +:10ab300000000000f612400f000000001000c227c5 +:10ab4000212040005511400f0000000088bf033c49 +:10ab50002061628c8410027c206162ac88bf033c5f +:10ab60002061628c0421027c206162ac208180af74 +:10ab7000148180af88bf033c2061628c01000424f3 +:10ab80008431827c206162ac4f8080a3010002246a +:10ab900021e8c0031c00bf8f1800be8f2000bd2716 +:10aba0000800e00300000000e8ffbd271400bfaf6d +:10abb0001000beaf21f0a0031c8180af48808283cb +:10abc00021204000be1d400f00000000478083830d +:10abd000ffff02240500621000000000478082830e +:10abe00021204000be1d400f000000004c808283e9 +:10abf00021204000be1d400f000000004b808383d9 +:10ac0000ffff022405006210000000004b808283d9 +:10ac100021204000be1d400f000000004a808283ba +:10ac200021204000be1d400f0000000049808383aa +:10ac3000ffff0224050062100000000049808283ab +:10ac400021204000be1d400f000000004e80828386 +:10ac500021204000be1d400f000000004d80838376 +:10ac6000ffff022405006210000000004d80828377 +:10ac700021204000be1d400f0000000021e8c0035d +:10ac80001400bf8f1000be8f1800bd270800e0031e +:10ac900000000000f8ffbd270400beaf21f0a003b4 +:10aca0004f80828321e8c0030400be8f0800bd27c7 +:10acb0000800e00300000000e0ffbd271c00bfaf5c +:10acc0001800beaf21f0a0032081828f2e0040101b +:10acd000000000004f8083830200022417006214ea +:10ace000000000001481828f140040140000000056 +:10acf00005000424fe5f400f000000000f0040101c +:10ad000000000000ff0002241000a2af029d023ce0 +:10ad1000640f44240b00052402000624029d023c1b +:10ad2000700f4724c811400f0000000005000424e4 +:10ad300088130524eb60400f000000002120000074 +:10ad4000a811400f000000001481828f0f004010f6 +:10ad5000000000001c81828f0c00401400000000e5 +:10ad6000692b400f000000007530400f000000000c +:10ad7000492c400f00000000010002241c8182af1a +:10ad8000632b400b000000000000000021e8c0031e +:10ad90001c00bf8f1800be8f2000bd270800e003f5 +:10ada00000000000d0ffbd272c00bfaf2800beafc1 +:10adb00021f0a0030200042401000524213000003a +:10adc000d21a400f00000000488082a355000224e0 +:10add0001000c2a7488082831a00400400000000cf +:10ade000020002241400c2a71000c2970012020041 +:10adf000201e027c1000c29702120200ffff4230a8 +:10ae00002016027c251062002016027cffff4230d3 +:10ae10001600c2a71800c0af4880828321184000e6 +:10ae20001400c227212060002128400010000624c1 +:10ae3000741b400f0000000001000224922b400b05 +:10ae4000000000002110000021e8c0032c00bf8f8b +:10ae50002800be8f3000bd270800e003000000007e +:10ae6000e8ffbd271400bfaf1000beaf21f0a00364 +:10ae70001800c4af1c00c5af47808383ffff0224c6 +:10ae800013006210000000004780828321184000f8 +:10ae90001c00c28fffff4230212060001800c58fc8 +:10aea0002130400021380000751c400f00000000d8 +:10aeb000478082832120400000a0023c34144524b6 +:10aec0000004062421380000441d400f000000004b +:10aed00021e8c0031400bf8f1000be8f1800bd27eb +:10aee0000800e00300000000e8ffbd271400bfaf2a +:10aef0001000beaf21f0a003211080001800c2a3f3 +:10af000047808383ffff02241000621000000000ce +:10af100047808283212040001800c52701000624b5 +:10af200021380000751c400f00000000478082831c +:10af30002120400000a0023c3414452400040624d3 +:10af400021380000441d400f0000000021e8c0032c +:10af50001400bf8f1000be8f1800bd270800e0034b +:10af600000000000d0ffbd272c00bfaf2800beafff +:10af700021f0a00302000424010005242130000078 +:10af8000d21a400f000000004c8082a35600022419 +:10af90001000c2a74c8082831a0040040000000009 +:10afa000020002241400c2a71000c297001202007f +:10afb000201e027c1000c29702120200ffff4230e6 +:10afc0002016027c251062002016027cffff423012 +:10afd0001600c2a71800c0af4c8082832118400021 +:10afe0001400c22721206000212840001000062400 +:10aff000741b400f0000000001000224022c400bd3 +:10b00000000000002110000021e8c0032c00bf8fc9 +:10b010002800be8f3000bd270800e00300000000bc +:10b02000e8ffbd271400bfaf1000beaf21f0a003a2 +:10b030001800c4af1c00c5af4b808383ffff022400 +:10b0400013006210000000004b8082832118400032 +:10b050001c00c28fffff4230212060001800c58f06 +:10b060002130400021380000751c400f0000000016 +:10b070004b8082832120400000a0023c34144524f0 +:10b080000004062421380000441d400f0000000089 +:10b0900021e8c0031400bf8f1000be8f1800bd2729 +:10b0a0000800e00300000000e8ffbd271400bfaf68 +:10b0b0001000beaf21f0a003211080001800c2a331 +:10b0c0004b808383ffff0224100062100000000009 +:10b0d0004b808283212040001800c52701000624f0 +:10b0e00021380000751c400f000000004b80828357 +:10b0f0002120400000a0023c341445240004062412 +:10b1000021380000441d400f0000000021e8c0036a +:10b110001400bf8f1000be8f1800bd270800e00389 +:10b1200000000000d0ffbd272c00bfaf2800beaf3d +:10b1300021f0a003020004240100052421300000b6 +:10b14000d21a400f000000004a8082a35700022458 +:10b150001000c2a74a8082831a0040040000000049 +:10b16000020002241400c2a71000c29700120200bd +:10b17000201e027c1000c29702120200ffff423024 +:10b180002016027c251062002016027cffff423050 +:10b190001600c2a71800c0af4a8082832118400061 +:10b1a0001400c2272120600021284000100006243e +:10b1b000741b400f0000000001000224722c400ba1 +:10b1c000000000002110000021e8c0032c00bf8f08 +:10b1d0002800be8f3000bd270800e00300000000fb +:10b1e000e8ffbd271400bfaf1000beaf21f0a003e1 +:10b1f0001800c4af1c00c5af4980828321184000ed +:10b200001c00c28fffff4230212060001800c58f54 +:10b210002130400021380000751c400f0000000064 +:10b22000498082832120400000a0023c701c4524fc +:10b23000c800062421380000441d400f0000000013 +:10b2400021e8c0031400bf8f1000be8f1800bd2777 +:10b250000800e00300000000e8ffbd271400bfafb6 +:10b260001000beaf21f0a003211080001800c2a37f +:10b2700049808383ffff0224100062100000000059 +:10b2800049808283212040001800c5270100062440 +:10b2900021380000751c400f0000000049808283a7 +:10b2a0002120400000a0023c701c4524c800062458 +:10b2b00021380000441d400f0000000021e8c003b9 +:10b2c0001400bf8f1000be8f1800bd270800e003d8 +:10b2d00000000000f8ffbd270400beaf21f0a0036e +:10b2e00049808383ffff02240400621400000000f1 +:10b2f00021100000c02c400b0000000001000224bf +:10b3000021e8c0030400be8f0800bd270800e00349 +:10b3100000000000d0ffbd272c00bfaf2800beaf4b +:10b3200021f0a003020004240100052421300000c4 +:10b33000d21a400f000000004e8082a36300022456 +:10b340001000c2a74e8082831a0040040000000053 +:10b35000020002241400c2a71000c29700120200cb +:10b36000201e027c1000c29702120200ffff423032 +:10b370002016027c251062002016027cffff42305e +:10b380001600c2a71800c0af4e808283211840006b +:10b390001400c2272120600021284000100006244c +:10b3a000741b400f0000000001000224ee2c400b33 +:10b3b000000000002110000021e8c0032c00bf8f16 +:10b3c0002800be8f3000bd270800e0030000000009 +:10b3d000e8ffbd271400bfaf1000beaf21f0a003ef +:10b3e0004e80828321204000be1d400f00000000df +:10b3f000ffff02244e8082a34d808383ffff02243f +:10b4000007006210000000004d8082832120400070 +:10b41000be1d400f00000000ffff02244d8082a3ec +:10b4200021e8c0031400bf8f1000be8f1800bd2795 +:10b430000800e00300000000e8ffbd271400bfafd4 +:10b440001000beaf21f0a0031800c4af1c00c5afb0 +:10b450004d808283211840001c00c28fffff4230c4 +:10b46000212060001800c58f2130400021380000e5 +:10b47000751c400f000000004d8082832120400099 +:10b4800000a0023c701c4524c8000624213800009e +:10b49000441d400f0000000021e8c0031400bf8fce +:10b4a0001000be8f1800bd270800e0030000000058 +:10b4b000e8ffbd271400bfaf1000beaf21f0a0030e +:10b4c000211080001800c2a34d808383ffff022457 +:10b4d00010006210000000004d8082832120400097 +:10b4e0001800c5270100062421380000751c400ff4 +:10b4f000000000004d8082832120400000a0023c1b +:10b50000701c4524c800062421380000441d400f4b +:10b510000000000021e8c0031400bf8f1000be8fa0 +:10b520001800bd270800e00300000000f8ffbd2759 +:10b530000400beaf21f0a0034d808383ffff0224ef +:10b54000040062140000000021100000562d400b82 +:10b55000000000000100022421e8c0030400be8fa7 +:10b560000800bd270800e00300000000e8ffbd2739 +:10b570001400bfaf1000beaf21f0a003f158400f80 +:10b58000000000005e30400f00000000be31400fa0 +:10b59000000000002120000021280000ea82400f66 +:10b5a000000000000100022421e8c0031400bf8f46 +:10b5b0001000be8f1800bd270800e0030000000047 +:10b5c000e8ffbd271400bfaf1000beaf21f0a003fd +:10b5d0002120000021280000322e400f0000000032 +:10b5e00021e8c0031400bf8f1000be8f1800bd27d4 +:10b5f0000800e00300000000e0ffbd271c00bfaf13 +:10b600001800beaf21f0a003211080002400c5afb8 +:10b610002000c2a3f65a400f000000001000c2af85 +:10b620002400c28f08004014000000002000c293d4 +:10b630002120400007000524835a400f000000002d +:10b64000122e400b000000002000c2831900432c82 +:10b65000790060100000000080180200019d023c8b +:10b6600074b64224211062000000428c08004000a1 +:10b670000000000044b8009d44b8009dd8b6009d6d +:10b6800044b8009d0cb7009d44b8009d44b8009d8f +:10b6900034b7009d44b8009d5cb7009d44b8009d40 +:10b6a00044b8009d88b7009d44b8009da0b7009d98 +:10b6b00044b8009dc8b7009d44b8009df0b7009df8 +:10b6c00044b8009d44b8009d44b8009d44b8009d16 +:10b6d00044b8009d10b8009d029d023c5c93442438 +:10b6e000578f400f000000001000c28f010003249c +:10b6f000000043a00300042401000524835a400fe6 +:10b7000000000000122e400b00000000029d023cd1 +:10b710007c934424578f400f000000000100042454 +:10b7200002000524322e400f00000000122e400bb4 +:10b7300000000000029d023ca8934424578f400f54 +:10b74000000000000100042403000524322e400ff5 +:10b7500000000000122e400b00000000029d023c81 +:10b76000c8934424578f400f000000000482828f4a +:10b770002014027c21204000cf5b400f000000001d +:10b78000122e400b000000000100042404000524d8 +:10b79000322e400f00000000122e400b000000006f +:10b7a000029d023ce8934424578f400f00000000a4 +:10b7b0000100042405000524322e400f0000000083 +:10b7c000122e400b00000000029d023c0c94442409 +:10b7d000578f400f000000000100042406000524dc +:10b7e000322e400f00000000122e400b000000001f +:10b7f000029d023c30944424578f400f000000000b +:10b800000100042401000524322e400f0000000036 +:10b81000029d023c54944424578f400f00000000c6 +:10b820000100042408000524322e400f000000000f +:10b83000122e400b0000000000000000122e400bf2 +:10b84000000000000000000021e8c0031c00bf8fc2 +:10b850001800be8f2000bd270800e0030000000094 +:10b86000e8ffbd271400bfaf1000beaf21f0a0035a +:10b87000211080001c00c5af2000c6af1800c2a375 +:10b880001800c283029d033c849464242128400054 +:10b890001c00c68f2000c78f688f400f000000007b +:10b8a0000100042407000524322e400f0000000090 +:10b8b00021e8c0031400bf8f1000be8f1800bd2701 +:10b8c0000800e00300000000d8ffbd272400bfaf40 +:10b8d0002000beaf21f0a0032800c4af2c00c5afec +:10b8e0000482828f0600432c1d02601000000000bd +:10b8f00080180200019d023c0cb942242110620014 +:10b900000000428c080040000000000024b9009da7 +:10b9100088b9009d78bb009df8bc009d0cc0009dbf +:10b9200094c0009d2800c28f01000324080043102a +:10b93000000000000200032410004310000000007b +:10b94000fa01401400000000602e400b00000000cf +:10b950002c00c28f070040140000000001000224e8 +:10b96000048282af029d023cd4944424578f400f3e +:10b9700000000000602e400b0000000000000000ee +:10b980005830400b000000002800c28f0100032443 +:10b99000080043100000000002000324730043105d +:10b9a00000000000e401401400000000dc2e400b09 +:10b9b000000000002c00c28f0900422c63004010e0 +:10b9c000000000002c00c28f80180200019d023c84 +:10b9d000e4b94224211062000000428c08004000bb +:10b9e000000000004cbb009d94ba009d08ba009d69 +:10b9f0003cba009d4cbb009d4cbb009db4ba009d61 +:10ba00004cbb009d0cbb009d1e31400f0000000090 +:10ba100005000424115b400f000000000200022416 +:10ba2000048282af029d023c04954424578f400f4c +:10ba300000000000d92e400b00000000ec81828f36 +:10ba40000600401400000000020004243a5b400f8e +:10ba500000000000a32e400b0000000001000424a1 +:10ba60003a5b400f000000000b000424115b400f04 +:10ba70000000000003000224048282af029d023c09 +:10ba800038954424578f400f00000000d92e400bfa +:10ba900000000000029d023c6c954424578f400f2b +:10baa000000000005e30400f00000000d92e400b67 +:10bab000000000001082838f010002240a0062143b +:10bac0000000000011000424115b400f0000000082 +:10bad000029d023c98954424578f400f00000000bf +:10bae000c12e400b0000000011000424265b400f13 +:10baf00000000000029d023cc4954424578f400f73 +:10bb000000000000d92e400b00000000be31400fa5 +:10bb10000000000021184000010002240600621409 +:10bb20000000000001000424015c400f0000000040 +:10bb3000d12e400b0000000021200000015c400fce +:10bb400000000000d92e400b000000002c00c28f26 +:10bb5000ff00423021204000265b400f0000000023 +:10bb600000000000dc2e400b000000000000000080 +:10bb70005830400b000000002800c28f0100032451 +:10bb8000430043100000000002000324570043104c +:10bb9000000000006b0140140000000021200000a4 +:10bba0009130400f000000001000c2af1000c28fa3 +:10bbb000010003241200431000000000020043288b +:10bbc00005006010000000000b00401000000000a5 +:10bbd000222f400b00000000020003241500431038 +:10bbe00000000000030003241d00431000000000bb +:10bbf000222f400b00000000222f400b000000000d +:10bc0000029d023c00964424578f400f0000000024 +:10bc100006000424115b400f000000000100022414 +:10bc2000048282af01000224ec8182af222f400bfc +:10bc300000000000029d023c44964424578f400fb0 +:10bc40000000000006000424265b400f00000000f6 +:10bc500001000224048282af222f400b000000006a +:10bc6000029d023c88964424578f400f000000003c +:10bc700006000424265b400f00000000010002249f +:10bc8000048282af000000003c2f400b0000000047 +:10bc90002c00c38f010002240c006214000000007d +:10bca000010004249130400f00000000029d023c7e +:10bcb000cc964424578f400f000000005e30400fa8 +:10bcc00000000000392f400b000000002c00c28f44 +:10bcd000ff00423021204000265b400f00000000a2 +:10bce000000000003c2f400b00000000000000009e +:10bcf0005830400b000000002800c28f01000324d0 +:10bd00003f0043100000000002000324bc00431069 +:10bd1000000000000e01401400000000212000007f +:10bd20002b31400f000000001400c2af1400c28f7e +:10bd30000100032412004310000000000200432809 +:10bd400005006010000000000b0040100000000023 +:10bd50007e2f400b00000000020003241800431057 +:10bd60000000000003000324220043100000000034 +:10bd70007e2f400b000000007e2f400b00000000d3 +:10bd80001482828f0100042421284000925b400f1e +:10bd9000000000001482828f029d033cfc96642404 +:10bda00021284000688f400f000000001482828f1d +:10bdb00001004224148282af7e2f400b000000005d +:10bdc0001482828f0500042421284000925b400fda +:10bdd000000000005e30400f00000000029d023ca9 +:10bde00030974424578f400f000000007e2f400bf7 +:10bdf00000000000000000000130400b00000000c7 +:10be00002c00c28f04000324110043100000000026 +:10be10000500432806006010000000000100032414 +:10be20006900431000000000fd2f400b00000000df +:10be30000500032445004310000000000700032410 +:10be40003500431000000000fd2f400b00000000f3 +:10be50001800c0af1c00c0af1c00c0af00a0023c67 +:10be6000442f4424bb32400f000000001800c2af32 +:10be700000a0023c482f4424bb32400f00000000c9 +:10be80001c00c2af00a0023c442f42240800422400 +:10be9000e88182af1482828f211840001800c28f7f +:10bea00011006210000000001482828f040004243c +:10beb00021284000925b400f000000001482828f16 +:10bec000029d033c749764241800c58f2130400004 +:10bed000688f400f00000000ab32400f00000000f0 +:10bee000c42f400b000000001c00c28fe08182af15 +:10bef000010004242b31400f00000000029d023c91 +:10bf0000d49744241800c58f688f400f00000000ac +:10bf1000fe2f400b000000001482828f02000424d8 +:10bf200021284000925b400f000000001482828fa5 +:10bf3000029d033c1c98642421284000688f400f18 +:10bf400000000000fe2f400b00000000029d023c9c +:10bf500068984424578f400f00000000be31400f06 +:10bf60000000000021184000010002240a006214b1 +:10bf70000000000001000224048282af01000424ba +:10bf8000e85b400f0000000001000224108282af35 +:10bf9000f02f400b00000000029d023cb0984424aa +:10bfa000578f400f0000000002000424e85b400fa0 +:10bfb000000000005e30400f00000000108280afe3 +:10bfc000fe2f400b00000000029d023cf09844242c +:10bfd000578f400f00000000020004242b31400f57 +:10bfe000000000005e30400f00000000fe2f400bfc +:10bff00000000000000000000130400b00000000c5 +:10c00000000000005830400b000000002800c28fe4 +:10c010000100032408004310000000000200032474 +:10c0200019004310000000004c0040140000000004 +:10c030002330400b000000002c00c38f01000224bd +:10c040000900621400000000029d023c6c9544242b +:10c05000578f400f000000005e30400f00000000ce +:10c060002030400b000000002c00c28fff00423047 +:10c0700021204000265b400f00000000000000006f +:10c080002330400b00000000000000005830400b3f +:10c09000000000002800c28f0100032408004310a4 +:10c0a00000000000020003241900431000000000fb +:10c0b0001a004010000000005830400b0000000043 +:10c0c0002c00c38f0100022409006214000000004c +:10c0d000029d023c6c954424578f400f00000000e5 +:10c0e0005e30400f000000004230400b00000000b6 +:10c0f0002c00c28fff00423021204000265b400f01 +:10c1000000000000000000004830400b000000006c +:10c11000000000004830400b00000000000000005c +:10c12000000000005830400b00000000000000003c +:10c130005830400b00000000000000005830400b59 +:10c1400000000000000000005830400b000000001c +:10c15000000000005830400b00000000000000000c +:10c1600021e8c0032400bf8f2000be8f2800bd2718 +:10c170000800e00300000000e8ffbd271400bfaf87 +:10c180001000beaf21f0a003048280af088280af10 +:10c19000148280af108280af148280af108280af93 +:10c1a000e08180af1e31400f00000000ab32400f35 +:10c1b00000000000f42c400f0000000021e8c00344 +:10c1c0001400bf8f1000be8f1800bd270800e003c9 +:10c1d00000000000e8ffbd271400bfaf1000beaf95 +:10c1e00021f0a003c52c400f000000000100042432 +:10c1f00021280000322e400f0000000021e8c0037b +:10c200001400bf8f1000be8f1800bd270800e00388 +:10c2100000000000e8ffbd271400bfaf1000beaf54 +:10c2200021f0a0035e30400f0000000021e8c003b1 +:10c230001400bf8f1000be8f1800bd270800e00358 +:10c2400000000000e8ffbd271400bfaf1000beaf24 +:10c2500021f0a0031800c4af1800c38f010002240e +:10c2600006006214000000001e31400f00000000b4 +:10c27000030002241831400b00000000f881828f77 +:10c280000500432c750060100000000080180200bb +:10c29000019d023ca8c24224211062000000428c91 +:10c2a0000800400000000000bcc2009d28c3009da3 +:10c2b0004cc4009d34c4009d40c4009dfc81828f0d +:10c2c00021204000212800003454400f00000000cd +:10c2d0000c00401400000000fc81828f029d033c92 +:10c2e0003499642421284000688f400f000000002a +:10c2f00004000224f88182af020002241831400bae +:10c30000000000000c8280af0900042419000524fd +:10c31000eb60400f0000000001000224f88182afb2 +:10c320001731400b0000000009000424fe5f400f9d +:10c3300000000000211840000100022446006214a1 +:10c34000000000002453400f0000000021004014b2 +:10c3500000000000fc81838f1f00023c0e0062146d +:10c3600000000000fc81838f0c82828f029d043cc0 +:10c37000609984242128600021304000688f400f9c +:10c380000000000003000224f88182af01000224b3 +:10c390001831400b00000000fc81838f0c82828fdb +:10c3a000029d043ca0998424212860002130400093 +:10c3b000688f400f00000000fc81838f0100023c69 +:10c3c00021106200fc8182aff88180af1731400bf1 +:10c3d000000000000c82828f280042280c004014cc +:10c3e000000000000c82828f029d033cd8996424d7 +:10c3f00021284000688f400f000000000400022444 +:10c40000f88182af020002241831400b00000000c6 +:10c410000900042419000524eb60400f000000000f +:10c420000c82828f010042240c8282af1731400bb4 +:10c4300000000000010002241831400b0000000041 +:10c44000020002241831400b000000000000000030 +:10c450001731400b00000000000000002110000018 +:10c4600021e8c0031400bf8f1000be8f1800bd2745 +:10c470000800e00300000000f8ffbd270400beaf85 +:10c4800021f0a003f88180af1800023cfc8182af4c +:10c490000c8280afec8180af21e8c0030400be8f26 +:10c4a0000800bd270800e00300000000e0ffbd27f2 +:10c4b0001c00bfaf1800beaf21f0a0032000c4af26 +:10c4c000f081828f0600432c7b006010000000008a +:10c4d00080180200019d023cecc44224211062003d +:10c4e0000000428c080040000000000004c5009dd0 +:10c4f00038c5009d5cc6009d90c6009d78c6009d15 +:10c5000084c6009d2000c28f64004010000000001f +:10c510002000c38f010002246300621400000000a9 +:10c5200001000224f08182afe48180af211000007d +:10c53000b031400b00000000e881828f3c004014c5 +:10c5400000000000ab32400f000000000200022497 +:10c55000b031400b00000000f481828f21204000a8 +:10c5600001004224f48182afe881828f0000438081 +:10c5700001004224e88182af2128600001000624e6 +:10c58000f854400f000000000a00401400000000b2 +:10c59000029d023c249a4424578f400f0000000063 +:10c5a00005000224f08182af02000224b031400b6a +:10c5b000000000001000c0af7131400b000000000f +:10c5c000000000002453400f00000000060040144b +:10c5d00000000000e481828f01004224e48182afe8 +:10c5e0008d31400b000000001000c28fc9004228ae +:10c5f00001004238ff0042301000c38f0100632465 +:10c600001000c3afeeff401000000000029d023c8e +:10c61000609a4424578f400f000000000500022458 +:10c62000f08182af02000224b031400b0000000014 +:10c6300000000000e481838fe081828f2a10620075 +:10c64000c5ff40140000000002000224f08182af08 +:10c6500021100000b031400b000000002000c28f0c +:10c660001400401400000000f08180af010002249b +:10c67000b031400b0000000001000224b031400b3b +:10c680000000000002000224b031400b0000000056 +:10c6900000000000ae31400b000000000000000070 +:10c6a000ae31400b0000000000000000ae31400b36 +:10c6b0000000000000000000b031400b000000004e +:10c6c00021e8c0031c00bf8f1800be8f2000bd27cb +:10c6d0000800e00300000000f8ffbd270400beaf23 +:10c6e00021f0a00321e8c0030400be8f0800bd278d +:10c6f0000800e00300000000e0fcbd271c03bfaf02 +:10c700001803beaf21f0a0031800023c2000c2af06 +:10c71000ffff02242400c2af029d023cac9a4424d5 +:10c72000578f400f000000002000c28f5800c32721 +:10c730002120600018000524213040008a53400f5a +:10c74000000000005800c22721204000bb32400feb +:10c75000000000003000c2af5800c227040042248d +:10c7600021204000bb32400f000000003400c2af67 +:10c770005800c2270800422421204000bb32400f4d +:10c78000000000003800c2af5800c2270c0042244d +:10c7900021204000bb32400f000000003c00c2af2f +:10c7a0005800c2271000422421204000bb32400f15 +:10c7b000000000004000c2af5800c227140042240d +:10c7c00021204000bb32400f000000004400c2aff7 +:10c7d0003c00c28f1000a2af4000c28f1400a2af75 +:10c7e0004400c28f1800a2af029d023cdc9a442490 +:10c7f0003000c58f3400c68f3800c78f688f400f58 +:10c80000000000003000c38fadba023cefbe4234de +:10c810000800621000000000029d023c4c9b442472 +:10c82000578f400f0000000021100000a532400b80 +:10c83000000000003800c28f080040140000000013 +:10c84000029d023c709b4424578f400f0000000063 +:10c8500021100000a532400b000000002000c28f14 +:10c86000180042242000c2af2800c0af4800c0af6b +:10c870006432400b000000002000c28f5800c32724 +:10c88000212060000c000524213040008a53400f15 +:10c89000000000005800c22721204000bb32400f9a +:10c8a000000000004c00c2af5800c2270400422420 +:10c8b00021204000bb32400f000000005000c2affa +:10c8c0005800c2270800422421204000bb32400ffc +:10c8d000000000005400c2af2000c28f0c004224b0 +:10c8e0002000c2af4c00c38fadde023cefbe42342d +:10c8f0000a00621000000000029d023ca09b44243c +:10c900002800c58f4c00c68f688f400f00000000c4 +:10c9100021100000a532400b000000005000c28f23 +:10c920000800401400000000029d023cd49b4424f7 +:10c93000688f400f0000000021100000a532400b5e +:10c94000000000002800c28f010042242800c2af6e +:10c950002800c38f3800c28f090062140000000055 +:10c96000029d023c149c4424578f400f000000009d +:10c97000010002244800c2af6732400b00000000f3 +:10c980005000c28f2000c38f211062002000c2af70 +:10c990004800c28fb8ff4010000000001800023ca1 +:10c9a000180042342000c2af2c00c0af8132400bcf +:10c9b000000000001403c3272000c28f2000c48f92 +:10c9c000010084242000c4af212060000100052460 +:10c9d000213040008a53400f000000001403c2833e +:10c9e000ff0042302400c48f21284000ea82400f1b +:10c9f000000000002400c2af2c00c28f01004224be +:10ca00002c00c2af2c00c38f3c00c28f2b106200e1 +:10ca1000e8ff4014000000002400c28f271002002d +:10ca20002400c2af2400c38f4400c28f0e006214e2 +:10ca300000000000029d023c409c44242400c58f5d +:10ca40004400c68f688f400f00000000029d023c2a +:10ca5000749c4424578f400f000000000100022402 +:10ca6000a532400b00000000029d023c9c9c442427 +:10ca70002400c58f4400c68f688f400f000000005f +:10ca8000029d023cd09c4424578f400f00000000c0 +:10ca90002110000021e8c0031c03bf8f1803be8fc4 +:10caa0002003bd270800e00300000000f8ffbd27b9 +:10cab0000400beaf21f0a003f08180af1800023c5b +:10cac000f48182af008280afe48180afe88180afe3 +:10cad000e48180af0100022421e8c0030400be8f7e +:10cae0000800bd270800e00300000000f0ffbd279c +:10caf0000c00beaf21f0a0031000c4af1000c28f25 +:10cb0000040040140000000021100000e432400b3b +:10cb1000000000001000c28f000042900000c2af71 +:10cb20000000c28f001202000000c2af1000c28fce +:10cb300001004224000042900000c38f21106200d7 +:10cb40000000c2af0000c28f001202000000c2af9e +:10cb50001000c28f02004224000042900000c38fe8 +:10cb6000211062000000c2af0000c28f001202005c +:10cb70000000c2af1000c28f0300422400004290a8 +:10cb80000000c38f211062000000c2af0000c28ffe +:10cb900021e8c0030c00be8f1000bd270800e00391 +:10cba00000000000d8ffbd272400bfaf2000beafab +:10cbb00021f0a0032800c4af1000c0a32800c28f3a +:10cbc0001400c2aff732400b00000000000000006c +:10cbd000f732400b0000000000000000a014042405 +:10cbe0001400c58fd878400f000000001400c28fd9 +:10cbf00011004010000000001800c0af1800c2274c +:10cc0000a014042421284000c878400f0000000030 +:10cc10001000c2a31000c283ecff4014000000000b +:10cc20001800c38f1400c28febff621400000000d5 +:10cc30000f33400b00000000000000002110000036 +:10cc400021e8c0032400bf8f2000be8f2800bd272d +:10cc50000800e00300000000d0ffbd272c00bfaf9c +:10cc60002800beaf21f0a0031000c0a31400c0af85 +:10cc7000c80002241800c2af010004249780400fae +:10cc8000000000001c00c2270100042421284000ed +:10cc9000c878400f000000001000c2a31000c2833b +:10cca00004004010000000001000c283a033400bbd +:10ccb000000000001c00c28f020042340100042466 +:10ccc00021284000d878400f000000001800c28fd3 +:10ccd00004004010000000001800c28fffff422433 +:10cce0001800c2af010004249780400f000000002c +:10ccf0002080838f2000c22721206000212840004f +:10cd0000c878400f000000001000c2a31000c283ca +:10cd100007004014000000001000c2831b004014f4 +:10cd2000000000002000c28f180040140000000026 +:10cd30002080828f0f0003240800431000000000b1 +:10cd40001300032409004314000000000f00022414 +:10cd5000208082af5d33400b000000000e000224f3 +:10cd6000208082af5d33400b00000000208080af48 +:10cd7000000000002080828f0400401000000000ae +:10cd80001800c28fd1ff4014000000002080828f65 +:10cd900004004014000000001000c283a033400bc8 +:10cda000000000001400c0af7833400b000000000a +:10cdb0001800c28fffff42241800c2af02000424f3 +:10cdc0009780400f000000002080838f2000c22742 +:10cdd0002120600021284000c878400f000000009a +:10cde0002000c28f040042300e00401400000000fa +:10cdf0001400c28f010042241400c2af1400c38f7c +:10ce0000030002241b006200f40140001010000027 +:10ce100004004014000000001800c28fe4ff40141a +:10ce2000000000002000c28f0400423007004014c0 +:10ce3000000000001c00c28f0200423401000424e4 +:10ce400021284000d878400f000000002000c28f49 +:10ce50000400423004004014000000001800c28f9b +:10ce600094ff4014000000001800c28f030040141b +:10ce700000000000fbff02241000c2a31000c283c8 +:10ce800021e8c0032c00bf8f2800be8f3000bd27d3 +:10ce90000800e00300000000e0ffbd271c00bfaf5a +:10cea0001800beaf21f0a0031000c0af01000424a1 +:10ceb0001000c22721284000c878400f0000000061 +:10cec0001000c28f020042300a0040100000000033 +:10ced0001000c38ffdff0224241062001000c2afb7 +:10cee0001000c28f0100042421284000d878400f90 +:10cef0000000000021e8c0031c00bf8f1800be8f97 +:10cf00002000bd270800e00300000000e8ffbd2767 +:10cf10001400bfaf1000beaf21f0a0030600042430 +:10cf2000db000524d878400f00000000070004242f +:10cf300006000524d878400f000000000a000424f1 +:10cf40009780400f00000000801404242128000076 +:10cf5000d878400f00000000841404242128000029 +:10cf6000d878400f000000000a0004249780400f8a +:10cf7000000000000600042421280000d878400f9b +:10cf8000000000000700042421280000d878400f8a +:10cf90000000000021e8c0031400bf8f1000be8f06 +:10cfa0001800bd270800e00300000000e0ffbd27d7 +:10cfb0001c00bfaf1800beaf21f0a0031400c227b1 +:10cfc0000814042421284000c878400f0000000005 +:10cfd0001000c2a31000c283040040100000000033 +:10cfe000faff02242734400b000000001400c28f17 +:10cff000000142341400c2af1400c28f081404248c +:10d0000021284000d878400f000000001000c2a383 +:10d010001000c2830400401000000000faff022448 +:10d020002734400b000000001400c227001a04241b +:10d0300021284000c878400f000000001000c2a363 +:10d040001000c2830400401000000000faff022418 +:10d050002734400b000000001400c38f0100023c85 +:10d06000251062001400c2af1400c28f001a0424fd +:10d0700021284000d878400f000000001000c2a313 +:10d080001000c2830400401000000000faff0224d8 +:10d090002734400b000000002110000021e8c003ed +:10d0a0001c00bf8f1800be8f2000bd270800e003c2 +:10d0b00000000000e0ffbd271c00bfaf1800beaf9e +:10d0c00021f0a0030c00023c0c0044342128000095 +:10d0d000d878400f000000008c10042421280000a4 +:10d0e000d878400f000000000200023cac07443436 +:10d0f00021280000d878400f000000001400c2274b +:10d100001811042421284000c878400f00000000b6 +:10d110001000c2a31000c2830300401000000000f2 +:10d12000faff02241000c2a31400c28f010042348f +:10d130001400c2af1400c28f18110424212840002b +:10d14000d878400f000000001000c2a31500023c78 +:10d150001400443401000524d878400f000000007a +:10d160001000c2a31400c227001404242128400088 +:10d17000c878400f00000000ff0043301000c29349 +:10d1800021106200ff0042301000c2a31400c28fc1 +:10d19000000442300f004010000000001400c38f54 +:10d1a000fffb0224241062001400c2af1400c28fdf +:10d1b0000014042421284000d878400f000000000b +:10d1c000ff0043301000c29321106200ff00423084 +:10d1d0001000c2a31400c28f000442341400c2af76 +:10d1e0001400c28f0014042421284000d878400f76 +:10d1f00000000000ff0043301000c29321106200c5 +:10d20000ff0042301000c2a3010004249780400fa9 +:10d21000000000001000c28321e8c0031c00bf8f83 +:10d220001800be8f2000bd270800e00300000000aa +:10d23000e0ffbd271c00bfaf1800beaf21f0a00368 +:10d24000d480828f79004014000000000010042474 +:10d25000d4808527c878400f0000000005004010ea +:10d2600000000000d48080af211000000c35400b7e +:10d2700000000000f41304241000c22721284000fd +:10d28000c878400f000000000500401000000000ba +:10d29000d48080af211000000c35400b000000004e +:10d2a000d480838f1000023ca00242340a00621432 +:10d2b000000000001000c38f010002244100621032 +:10d2c000000000001000023ca1024234d48082af72 +:10d2d000f134400b00000000d480838f1000023c2a +:10d2e000b002423413006214000000001000c38f2b +:10d2f0000300022433006210000000001000c38ffe +:10d300000400022406006214000000001000023c29 +:10d31000b1024234d48082aff134400b00000000ef +:10d320001000023cb2024234d48082aff134400b90 +:10d3300000000000d480838f1000023cf0004234d3 +:10d3400020006214000000003b00043cd4808527cc +:10d35000c878400f000000000500401000000000e9 +:10d36000d48080af211000000c35400b000000007d +:10d37000d480838f3000023cd0004234110062140c +:10d38000000000001000c38f060002240600621493 +:10d39000000000003000023cd1004234d48082af53 +:10d3a000f134400b000000001000c38f0200022483 +:10d3b00004006214000000003000023cd20042343d +:10d3c000d48082afd480838ff000023c24186200a6 +:10d3d0003000023c0c00621400000000d480838ff7 +:10d3e000f0ff023cffff423424106200d48082af81 +:10d3f000d480838f0400023c25106200d48082af69 +:10d400000b35400b00000000d480838ff0ff023cfe +:10d41000ffff423424106200d48082afd480838f17 +:10d420000500023c25106200d48082afd480828f38 +:10d4300021e8c0031c00bf8f1800be8f2000bd274d +:10d440000800e00300000000e0ffbd271c00bfafa4 +:10d450001800beaf21f0a003f41304241000c2276b +:10d4600021284000c878400f00000000050040104f +:10d47000000000001000c0af211000002235400b5a +:10d48000000000001000c28f21e8c0031c00bf8f05 +:10d490001800be8f2000bd270800e0030000000038 +:10d4a000e8ffbd271400bfaf1000beaf21f0a003fe +:10d4b0008c34400f00000000ff0f4230b002422cbd +:10d4c0000600401400000000481e042484b7023cfb +:10d4d000ce694534d878400f0000000021e8c00331 +:10d4e0001400bf8f1000be8f1800bd270800e00396 +:10d4f00000000000e0ffbd271c00bfaf1800beaf5a +:10d5000021f0a00328140424ba78400f0000000082 +:10d510001000c2af1000c38ffeff0224241062006f +:10d520001000c2af281404241000c58fd878400f13 +:10d53000000000001000c28f010042341000c2af92 +:10d54000281404241000c58fd878400f0000000074 +:10d5500021e8c0031c00bf8f1800be8f2000bd272c +:10d560000800e00300000000e0ffbd271c00bfaf83 +:10d570001800beaf21f0a0031c140424ba78400f99 +:10d58000000000001000c2af1000c28f040042343f +:10d590001000c2af1c1404241000c58fd878400faf +:10d5a000000000003d35400f0000000021e8c003ee +:10d5b0001c00bf8f1800be8f2000bd270800e003ad +:10d5c00000000000e0ffbd271c00bfaf1800beaf89 +:10d5d00021f0a0031000c0a31633400f000000008c +:10d5e0001000c2a31000c28304004010000000001d +:10d5f0001000c2838035400b000000001000c28381 +:10d6000021e8c0031c00bf8f1800be8f2000bd277b +:10d610000800e00300000000e0ffbd271c00bfafd2 +:10d620001800beaf21f0a0031000c0a31400c0afcb +:10d630007135400f000000001000c2a31000c2832b +:10d6400004004010000000001000c283e535400bcc +:10d6500000000000eb35400f000000001400c2275e +:10d660001811042421284000c878400f0000000051 +:10d670001000c2a31000c28303004010000000008d +:10d68000faff02241000c2a31400c28f010042342a +:10d690001400c2af1400c28f1811042421284000c6 +:10d6a000d878400f000000001000c2a31400c22769 +:10d6b0000014042421284000c878400f0000000016 +:10d6c000ff0043301000c29321106200ff0042307f +:10d6d0001000c2a31400c28f000442301900401091 +:10d6e000000000001400c38ffffb0224241062001e +:10d6f0001400c2af1400c28f00140424212840007b +:10d70000d878400f00000000ff0043301000c293a3 +:10d7100021106200ff0042301000c2a31400c22793 +:10d720000014042421284000c878400f00000000a5 +:10d73000ff0043301000c29321106200ff0042300e +:10d740001000c2a30c00023c0c004434212800004d +:10d75000d878400f000000008c100424212800001d +:10d76000d878400f000000000200023cac074434af +:10d7700021280000d878400f00000000081404247d +:10d780001111023c00104534d878400f0000000011 +:10d790001000c28321e8c0031c00bf8f1800be8f99 +:10d7a0002000bd270800e00300000000e0ffbd27c7 +:10d7b0001c00bfaf1800beaf21f0a0031000c0a333 +:10d7c0000014042421280000d878400f0000000035 +:10d7d000ff0043301000c29321106200ff0042306e +:10d7e0001000c2a3320004249780400f0000000004 +:10d7f0002835400f000000001000c28321e8c0035c +:10d800001c00bf8f1800be8f2000bd270800e0035a +:10d8100000000000d8ffbd272400bfaf2000beaf2e +:10d8200021f0a003211080002800c2a31000c0a393 +:10d830001400c0af1800c0af1400c0af141004240f +:10d84000ba78400f000000001400c2af1400c28f6d +:10d850000e004104000000000200023cbc074434fa +:10d86000ba78400f000000001400c2af1400c28f4d +:10d87000010042301400c2af1400c28f08004010f3 +:10d88000000000004336400b0000000001000424ab +:10d890009780400f000000000f36400b0000000092 +:10d8a0001400c0af3e36400b00000000010004240d +:10d8b0009780400f000000000c00023c0c00443434 +:10d8c000ba78400f000000001400c2af1800c28fe9 +:10d8d000010042241800c2af1800c28fd107422ca9 +:10d8e0000500401400000000fbff02241000c2a34a +:10d8f0006136400b000000001400c38fad10023ce5 +:10d900009ed04234e9ff6214000000002800c39357 +:10d910000200022407006214000000000200023c22 +:10d92000ac0744341c3c023c7dd54534d878400fcc +:10d93000000000008c34400f00000000ff0f433057 +:10d94000a003022406006214000000000200042468 +:10d95000e932400f000000005b36400b0000000081 +:10d9600021200000e932400f000000000c00023cc2 +:10d970000c00443452ef023c612f4534d878400ffc +:10d98000000000001000c28321e8c0032400bf8f04 +:10d990002000be8f2800bd270800e0030000000023 +:10d9a000d0ffbd272c00bfaf2800beaf21f0a003e1 +:10d9b000211080003000c2a31000c0a31800c0af27 +:10d9c0001400c0af8c1002241c00c2af5302023cf2 +:10d9d000362642342000c2af3000c3930200022436 +:10d9e00022006214000000000200023cac07423436 +:10d9f0001c00c2af5dd7023cc3c142342000c2af9d +:10da00009c36400b00000000020004249780400f69 +:10da1000000000001c00c38f1800c22721206000f6 +:10da200021284000c878400f00000000040040108a +:10da3000000000002000c28f0100422c1800c2af7d +:10da40001400c28f010042241400c2af1400c28f20 +:10da5000d107422c0600401400000000fbff022406 +:10da60001000c2a3a936400b000000000000000017 +:10da70002000c38f1800c28fe3ff62140000000073 +:10da80002000c38f5302023c362642340500621444 +:10da9000000000008c10042421280000d878400fda +:10daa000000000001000c28321e8c0032c00bf8fdb +:10dab0002800be8f3000bd270800e00300000000f2 +:10dac000e0ffbd271c00bfaf1800beaf21f0a003d0 +:10dad0001400c0af0a0002241100c2a31400c22720 +:10dae0000014042421284000c878400f00000000e2 +:10daf0001000c2a31400c38ffffb02242410620095 +:10db00001400c2af1400c28f001404242128400066 +:10db1000d878400f000000001000c2a31000c2839c +:10db200004004010000000001000c283f136400bda +:10db3000000000001400c227001404242128400023 +:10db4000c878400f000000001000c2a31000c2837c +:10db500004004010000000001000c283f136400baa +:10db6000000000001400c28f000442301300401077 +:10db7000000000001400c38ffffb02242410620089 +:10db80001400c2af1400c28f0014042421284000e6 +:10db9000d878400f000000001000c2a31100c2930b +:10dba000ffff42241100c2a31100c293e1ff401401 +:10dbb00000000000f036400b0000000000000000f4 +:10dbc0001000c28321e8c0031c00bf8f1800be8f65 +:10dbd0002000bd270800e00300000000e0ffbd2793 +:10dbe0001c00bfaf1800beaf21f0a00321188000b9 +:10dbf0002110a0002000c3a32400c2a31400c22748 +:10dc00000200033c0801643421284000c878400f1a +:10dc1000000000001000c2a31000c2831c004014ca +:10dc2000000000002400c293090040100000000022 +:10dc30002000c29301000324041843001400c28f83 +:10dc4000251062001400c2af1b37400b000000001b +:10dc50002000c2930100032404104300271802008f +:10dc60001400c28f241062001400c2af1400c28fcf +:10dc70000200033c0801643421284000d878400f9a +:10dc8000000000001000c2a32537400b0000000078 +:10dc9000000000001000c28321e8c0031c00bf8ff9 +:10dca0001800be8f2000bd270800e0030000000020 +:10dcb000e0ffbd271c00bfaf1800beaf21f0a003de +:10dcc000211880002110a0002000c3a32400c2a3bb +:10dcd0001400c2270200033c0001643421284000e4 +:10dce000c878400f000000001000c2a31000c283db +:10dcf0001c004014000000002400c29309004010e2 +:10dd0000000000002000c293010003240418430017 +:10dd10001400c28f251062001400c2af5037400bb0 +:10dd2000000000002000c2930100032404104300ff +:10dd3000271802001400c28f241062001400c2af22 +:10dd40001400c28f0200033c00016434212840000b +:10dd5000d878400f000000001000c2a35a37400bd3 +:10dd600000000000000000001000c28321e8c00392 +:10dd70001c00bf8f1800be8f2000bd270800e003e5 +:10dd800000000000e0ffbd271c00bfaf1800beafc1 +:10dd900021f0a003211080002400c5af2000c2a301 +:10dda0001400c2270200033c04016434212840000f +:10ddb000c878400f000000001000c2a31000c2830a +:10ddc0000b004014000000001400c38f2000c29319 +:10ddd00006104300ff00423001004230ff00433094 +:10dde0002400c28f000043a07d37400b00000000dc +:10ddf000000000001000c28321e8c0031c00bf8f98 +:10de00001800be8f2000bd270800e00300000000be +:10de1000e0ffbd271c00bfaf1800beaf21f0a0037c +:10de20002000c4af2110a0002400c2a31400c22708 +:10de30002c14042421284000c878400f0000000062 +:10de40001000c2a31000c28317004014000000009d +:10de50002400c29308004010000000002000c28f80 +:10de6000271802001400c28f241062001400c2aff1 +:10de7000a237400b000000001400c38f2000c28fa7 +:10de8000251062001400c2af1400c28f2c140424a9 +:10de900021284000d878400f000000001000c2a3e5 +:10dea000ab37400b00000000000000001000c283f0 +:10deb00021e8c0031c00bf8f1800be8f2000bd27c3 +:10dec0000800e00300000000d0ffbd272c00bfaf1a +:10ded0002800beaf21f0a0033000c4af3400c5afae +:10dee0002000c0af2400c0af1400c2279c1404243b +:10def00021284000c878400f000000001000c2a395 +:10df00001000c28338004014000000001400c38fca +:10df10000300023c251862002000c2272120600077 +:10df20002128400008000624fc78400f0000000073 +:10df30001000c2a31000c2832e0040140000000095 +:10df40002000c28f1400c2af1400c38fffff023c39 +:10df50002410620008004014000000003000c48f4c +:10df60002128000006000624f27a400f000000007d +:10df7000fe37400b000000001400c28f02140200a4 +:10df80001400c2af1400c38f0300023c25186200c6 +:10df90001800c22721206000212840000600062426 +:10dfa000fc78400f000000001000c2a31800c22738 +:10dfb0003000c48f2128400006000624b57a400fa7 +:10dfc000000000003400c28f040040100000000078 +:10dfd0003400c28f01000324000043a01000c2835c +:10dfe0000438400b0000000000000000fe37400b2a +:10dff00000000000000000003400c28f0300401049 +:10e00000000000003400c28f000040a01000c28356 +:10e0100021e8c0032c00bf8f2800be8f3000bd2731 +:10e020000800e00300000000d0ffbd272c00bfafb8 +:10e030002800beaf21f0a0033000c4af2000c0af65 +:10e040002400c0af1400c2279c14042421284000df +:10e05000c878400f000000001000c2a31000c28367 +:10e0600026004014000000001400c38f0300023c8f +:10e07000251862002000c2272120600021284000ce +:10e0800008000624fc78400f000000001000c2a326 +:10e090001000c2831c004014000000002000c28f4a +:10e0a0001400c2af1400c28fffff42301400c2af91 +:10e0b0001400c38f0300023c251862001800c22719 +:10e0c000212060002128400006000624fc78400f33 +:10e0d000000000001000c2a31800c2273000c48f47 +:10e0e0002128400006000624b57a400f00000000f9 +:10e0f0001000c2834438400b000000000000000004 +:10e100004338400b00000000000000001000c283f4 +:10e1100021e8c0032c00bf8f2800be8f3000bd2730 +:10e120000800e00300000000f8ffbd270400beafb8 +:10e1300021f0a00393808293ff004230010042242b +:10e14000ff004230938082a321e8c0030400be8f09 +:10e150000800bd270800e00300000000e0ffbd2725 +:10e160001c00bfaf1800beaf21f0a0031000c0a379 +:10e1700001000424b080400f000000008c34400fe8 +:10e180000000000021184000f0ff023c00f0423483 +:10e19000241862003000023c0800621400000000f5 +:10e1a000a810042401000524d878400f00000000c6 +:10e1b0001000c2a38438400b000000001400c227e6 +:10e1c0007010042421284000c878400f000000008f +:10e1d0001000c2a31000c2830c0040140000000015 +:10e1e0001400c28f020042341400c2af1400c28f68 +:10e1f0007010042421284000d878400f000000004f +:10e200001000c2a38438400b000000000000000092 +:10e210001000c28321e8c0031c00bf8f1800be8f0e +:10e220002000bd270800e00300000000f8ffbd2724 +:10e230000400beaf21f0a003211880002110a0002f +:10e240001000c6af0800c3a30c00c2a721e8c0039a +:10e250000400be8f0800bd270800e0030000000096 +:10e26000e0ffbd271c00bfaf1800beaf21f0a00328 +:10e270001000c0a391808293ff0042301900401427 +:10e280000000000090808293ff00433003000224ce +:10e29000060062100000000090808293ff0043306f +:10e2a000040002240f006214000000001633400f27 +:10e2b000000000001000c2a31000c2831000401430 +:10e2c000000000007410042478560524d878400f0c +:10e2d000000000001000c2a31000c2830b00401415 +:10e2e0000000000091808293ff0042300100422430 +:10e2f000ff004230918082a3c438400b0000000030 +:10e3000000000000c438400b0000000000000000c6 +:10e310001000c28321e8c0031c00bf8f1800be8f0d +:10e320002000bd270800e00300000000f8ffbd2723 +:10e330000400beaf21f0a003211080000800c2a39a +:10e340000800c293908082a321e8c0030400be8f1e +:10e350000800bd270800e00300000000f8ffbd270b +:10e360000400beaf21f0a00390808293ff004230f2 +:10e3700021e8c0030400be8f0800bd270800e003a9 +:10e3800000000000e0ffbd271c00bfaf1800beafbb +:10e3900021f0a0031000c0a391808293ff004230bf +:10e3a000060040100000000091808293ff00423080 +:10e3b000ffff4224ff004230918082a3918082932c +:10e3c000ff00423031004014000000009080829332 +:10e3d000ff0043300300022406006210000000002a +:10e3e00090808293ff0043300400022427006214cf +:10e3f000000000001400c0af741004242143052461 +:10e40000d878400f000000001000c2a31000c283a3 +:10e410001a004014000000001400c2270100042468 +:10e4200021284000c878400f000000001000c2a35f +:10e430001000c28314004014000000001400c28fba +:10e440000200423011004010000000001400c38f91 +:10e45000fdff0224241062001400c2af1400c28f1a +:10e460000100042421284000d878400f000000005b +:10e470001000c2a32339400b000000000000000080 +:10e480002339400b00000000000000001000c28390 +:10e4900021e8c0031c00bf8f1800be8f2000bd27dd +:10e4a0000800e00300000000e8ffbd271400bfaf34 +:10e4b0001000beaf21f0a0031800c4af988080af59 +:10e4c0009c8080af918080a3908080a3938080a364 +:10e4d000019d023c28e14424a580400f000000007b +:10e4e000958080a303000424019d023c2ce2452476 +:10e4f000193d400f000000002110000021e8c0037a +:10e500001400bf8f1000be8f1800bd270800e00365 +:10e5100000000000e0ffbd271c00bfaf1800beaf29 +:10e5200021f0a0032000c4af1000c0a39838400f12 +:10e53000000000001000c2a3908080a3918080a3ff +:10e54000928080a3938080a3988080af9c8080afce +:10e55000a08080afa88080af1000c28321e8c003f4 +:10e560001c00bf8f1800be8f2000bd270800e003ed +:10e5700000000000f0ffbd270c00beaf21f0a0039b +:10e58000211080001000c2a7f3ff02240000c2a3e4 +:10e590001000c29782130200ffff4230ff0042309a +:10e5a00003004330020002240a006214000000004d +:10e5b0001000c29702120200ffff4230ff004230fb +:10e5c0003f004330010002240200621400000000fa +:10e5d0000000c0a30000c28321e8c0030c00be8f6e +:10e5e0001000bd270800e00300000000e0ffbd2789 +:10e5f0001c00bfaf1800beaf21f0a0031000c0a3e5 +:10e600001200c0a71200c2272120400021280000cc +:10e61000b06b400f000000001000c2a31000c283c6 +:10e6200033004014000000001200c2972120400077 +:10e630005d39400f000000001000c2a31000c2832b +:10e640002a004014000000001200c297ff00423070 +:10e6500001000324140043100000000002004328be +:10e6600005006010000000000b00401000000000da +:10e67000b739400b00000000020003240e004310d5 +:10e6800000000000030003240f00431000000000fe +:10e69000b739400b0000000001000224958082a3de +:10e6a000bc39400b0000000002000224958082a3c8 +:10e6b000bc39400b0000000002000224958082a3b8 +:10e6c000bc39400b0000000003000224958082a3a7 +:10e6d00000000000bc39400b0000000003000224d1 +:10e6e000958082a3bc39400b00000000958080a378 +:10e6f0001000c28321e8c0031c00bf8f1800be8f2a +:10e700002000bd270800e00300000000f0ffbd2747 +:10e710000c00beaf21f0a003211880002110a00042 +:10e720001000c3a31400c2a31000c2930012020081 +:10e73000201e027c1400c2932016027c2510620069 +:10e740002016027c0200c2a70200c39769040224bb +:10e7500005006210000000000200c3976804022454 +:10e76000040062140000000021100000fa39400b80 +:10e770000000000095808293040040140000000017 +:10e78000ffff0224fa39400b0000000095808293bd +:10e790000000c2a3f539400b000000000000c29346 +:10e7a0004018020014808227211062000000429469 +:10e7b0000200c3970400621400000000ffff02245f +:10e7c000fa39400b000000000000c293010042240f +:10e7d0000000c2a30000c2930300422cefff4014cc +:10e7e000000000002110000021e8c0030c00be8fd3 +:10e7f0001000bd270800e00300000000c8ffbd278f +:10e800003400bfaf3000beaf21f0a0032140800034 +:10e810004000c6af2120e0004c00c38f5000c28fe3 +:10e820003800c8a33c00c5a34400c4a72800c3a760 +:10e830002c00c2a7ffff02241000c2a33c00c29319 +:10e840007f004230ff0042301500c2a33800c2935f +:10e850001400c2a3080002241600c2a74800c28ff9 +:10e860000c004010000000001600c297ffff43306c +:10e870002c00c4972800c29721108200ffff42306d +:10e8800021106200ffff42301600c2a72b3a400b56 +:10e89000000000001600c297ffff43304400c297fb +:10e8a00021106200ffff42301600c2a71400c2937d +:10e8b000ff004230211840001500c293ff00423093 +:10e8c0002120600021284000c339400f00000000d3 +:10e8d0001000c2a31000c283e20040140000000038 +:10e8e0009838400f000000001000c2a31000c2833f +:10e8f000df004014000000001c00c0af2000c0a7d3 +:10e900001800c0af3800c3931800c28f25106200f2 +:10e910001800c2af3c00c293001a02001800c28f58 +:10e92000251062001800c2af1600c297ffff4230e8 +:10e93000001c02001800c28f251062001800c2af30 +:10e940001800c28f8c10042421284000d878400f72 +:10e95000000000001000c2a31000c283c7004014d2 +:10e96000000000001800c0af1800c28f020042343f +:10e970001800c2af1800c28f78100424212840006c +:10e98000d878400f000000001000c2a31000c2831e +:10e99000bd004014000000008c34400f0000000057 +:10e9a00021184000f0ff023c00f0423424186200bd +:10e9b0003000023c0900621400000000ac10042486 +:10e9c00001000524d878400f000000001000c2a309 +:10e9d0001000c283af004014000000001c00c0af54 +:10e9e0002000c0a7a23a400b000000001800c22778 +:10e9f0007810042421284000c878400f000000004f +:10ea00001000c2a31000c2832600401400000000c2 +:10ea10001800c28f020042300e00401400000000b7 +:10ea20001c00c2271500033c000464342128400068 +:10ea3000c878400f000000001000c2a31000c2837d +:10ea40001b004010000000001c00c0afad3a400b9e +:10ea5000000000002000c297ffff4230e803422c74 +:10ea60000400401400000000050004249780400fbb +:10ea7000000000002000c297ffff42300100422446 +:10ea8000ffff42302000c2a72000c297ffff4230a4 +:10ea90008813422cd5ff401400000000ad3a400b13 +:10eaa0000000000000000000ad3a400b0000000034 +:10eab000000000001c00c28f610040100000000038 +:10eac0001c00c28f2400c2af1600c297ffff423065 +:10ead0001600c2a72400c38f1400c22721206000a3 +:10eae00021284000080006245979400f000000004a +:10eaf0001000c2a31000c28369004014000000008f +:10eb00002400c28f080042242400c2af4000c28ffc +:10eb100010004010000000002400c38f4400c29782 +:10eb2000212060004000c58f213040005979400ffe +:10eb3000000000001000c2a31000c2835b0040145c +:10eb4000000000004400c3972400c28f211062001f +:10eb50002400c2af4800c28f170040100000000020 +:10eb60002c00c3974400c297231062002118400074 +:10eb70002400c28f211062002400c2af2400c38f82 +:10eb80002800c297212060004800c58f2130400036 +:10eb90005979400f000000001000c2a31000c2838a +:10eba00045004014000000002800c3972400c28fd5 +:10ebb000211062002400c2af1c00c28f801002002e +:10ebc0001800c2af1800c28f020042341800c2af52 +:10ebd0001800c28f6c10042421284000d878400f00 +:10ebe000000000001000c2a31000c28335004014d2 +:10ebf000000000008c34400f00000000211840008d +:10ec0000f0ff023c00f04234241862003000023c65 +:10ec10000f00621400000000b0100424010005245d +:10ec2000d878400f000000001000c2a31000c2837b +:10ec30000700401000000000323b400b00000000c5 +:10ec4000fdff02241000c2a3323b400b0000000075 +:10ec5000e138400f000000001000c2a3323b400b1f +:10ec60000000000000000000323b400b00000000ec +:10ec700000000000323b400b0000000000000000dc +:10ec8000323b400b0000000000000000323b400b14 +:10ec90000000000000000000323b400b00000000bc +:10eca00000000000323b400b0000000000000000ac +:10ecb000323b400b0000000000000000323b400be4 +:10ecc00000000000000000001000c28321e8c00323 +:10ecd0003400bf8f3000be8f3800bd270800e0032e +:10ece00000000000d8ffbd272400bfaf2000beaf4a +:10ecf00021f0a0031000c0a31400c2277010042448 +:10ed000021284000c878400f000000001000c2a376 +:10ed10001000c283f8004014000000001400c28fed +:10ed200001004230ff004230f300401000000000bc +:10ed300021200000b080400f000000001400c22716 +:10ed40007010042421284000c878400f0000000003 +:10ed50001000c2a31000c283e300401400000000b2 +:10ed60001400c38ffeff0224241062001400c2afff +:10ed70001400c28f7010042421284000d878400f5e +:10ed8000000000001000c2a31000c283d90040148c +:10ed9000000000001400c227701004242128400045 +:10eda000c878400f000000001000c2a31000c2830a +:10edb000060040100000000001000424b080400f55 +:10edc000000000003e3c400b00000000928080a349 +:10edd0001400c28f82100200ffff4230ff0f42304a +:10ede0001200c2a71200c297bb0040100000000032 +:10edf0001c00c0af1c00c22784100424212840003e +:10ee0000c878400f000000001000c2a31000c283a9 +:10ee1000060040100000000001000424b080400ff4 +:10ee2000000000003e3c400b000000001c00c38faf +:10ee30001800c22721206000212840000400062479 +:10ee4000fc78400f000000001000c2a31a00c29717 +:10ee5000ffff42301a00c2a71000c2830600401014 +:10ee60000000000001000424b080400f00000000fa +:10ee70003e3c400b000000001a00c297ffff4230ea +:10ee80001200c3970f006210000000001200c39729 +:10ee90001a00c297ffff423023106200050042288b +:10eea000080040140000000001000424b080400f5e +:10eeb00000000000faff02241000c2a33e3c400bf9 +:10eec000000000001800c293ff004330010002243c +:10eed00014006214000000009880828f75004010ba +:10eee000000000009880828f1900c393ff006330f8 +:10eef000212060001a00c397ffff6330f8ff6324ee +:10ef0000ffff6330212860001c00c38f08006324ca +:10ef10002130600009f84000000000002d3c400b4b +:10ef2000000000001800c293ff00433002000224da +:10ef300014006214000000009c80828f5d0040106d +:10ef4000000000009c80828f1900c393ff00633093 +:10ef5000212060001a00c397ffff6330f8ff63248d +:10ef6000ffff6330212860001c00c38f080063246a +:10ef70002130600009f84000000000002d3c400beb +:10ef8000000000001800c293ff0043300400022478 +:10ef90001400621400000000a080828f4500401021 +:10efa00000000000a080828f1900c393ff0063302f +:10efb000212060001a00c397ffff6330f8ff63242d +:10efc000ffff6330212860001c00c38f080063240a +:10efd0002130600009f84000000000002d3c400b8b +:10efe000000000001800c293ff0043300600022416 +:10eff0001400621400000000a480828f2d004010d5 +:10f0000000000000a480828f1900c393ff006330ca +:10f01000212060001a00c397ffff6330f8ff6324cc +:10f02000ffff6330212860001c00c38f08006324a9 +:10f030002130600009f84000000000002d3c400b2a +:10f04000000000001800c293ff00433005000224b6 +:10f050001400621400000000ac80828f1500401084 +:10f0600000000000ac80828f1900c393ff00633062 +:10f07000212060001a00c397ffff6330f8ff63246c +:10f08000ffff6330212860001c00c38f0800632449 +:10f090002130600009f84000000000002d3c400bca +:10f0a00000000000faff02241000c2a33e3c400b07 +:10f0b0000000000092808293ff0042300e00401456 +:10f0c000000000005738400f000000001000c2a3ed +:10f0d0003e3c400b00000000feff02241000c2a3d3 +:10f0e0003e3c400b00000000000000003e3c400b96 +:10f0f00000000000000000001000c28321e8c003ef +:10f100002400bf8f2000be8f2800bd270800e00329 +:10f1100000000000f8ffbd270400beaf21f0a003ef +:10f1200001000224948082a321e8c0030400be8f62 +:10f130000800bd270800e00300000000e0ffbd2735 +:10f140001c00bfaf1800beaf21f0a0031000c0a389 +:10f1500093808293ff0042302400401000000000a2 +:10f160009838400f000000001000c2a31000c283b6 +:10f170001e00401400000000948080a3703c400bef +:10f180000000000093808293ff004230ffff422482 +:10f19000ff004230938082a3693c400b00000000d6 +:10f1a00000000000393b400f000000001000c2a327 +:10f1b0001000c283faff40140000000000000000ad +:10f1c00093808293ff004230050040100000000051 +:10f1d00094808293ff004230eaff4010000000005c +:10f1e000e138400f000000001000c2a31000c283ed +:10f1f00021e8c0031c00bf8f1800be8f2000bd2770 +:10f200000800e00300000000d8ffbd272400bfafc6 +:10f210002000beaf21f0a0032800c4af2c00c5af72 +:10f220002118c0002110e0003000c3a73400c2a3a1 +:10f230001000c0a32800c28f07004010000000008b +:10f240002c00c28f04004010000000003000c29764 +:10f2500019004014000000003400c2931200401056 +:10f260000000000001000224928082a35738400f62 +:10f27000000000001000c2a32800c28f0a00401442 +:10f28000000000002c00c28f0700401400000000a6 +:10f290003000c2970400401400000000211000005c +:10f2a000133d400b00000000f4ff02241000c2a335 +:10f2b000123d400b000000001800c227701004240b +:10f2c00021284000c878400f000000001000c2a3b1 +:10f2d0001000c28355004014000000001800c28fc7 +:10f2e00082100200ffff4230ff0f42301200c2a71f +:10f2f0001400c2278410042421284000c878400f3d +:10f30000000000001000c2a31000c2834a00401495 +:10f31000000000003000c2972800c48f2c00c58f69 +:10f3200021304000fc78400f000000001000c2a314 +:10f330001000c28343004014000000003000c39757 +:10f340001200c2972b10430005004010000000007f +:10f35000f4ff02241000c2a3123d400b0000000085 +:10f360001400c28f2800c38f2b1062000a004014c3 +:10f37000000000003000c3972800c28f21186200ef +:10f380001200c4971400c28f211082002b1043007a +:10f390000500401000000000f4ff02241000c2a38a +:10f3a000123d400b000000003400c29318004014ce +:10f3b000000000001200c3971400c28f21186200e1 +:10f3c0003000c4972800c28f211082001000621004 +:10f3d000000000003000c3972800c28f2110620097 +:10f3e0000300423004000324231862001200c49773 +:10f3f0001400c28f212082003000c5972800c28fe0 +:10f400002110a200231082000f00621400000000ef +:10f4100001000224928082a35738400f00000000b0 +:10f420001000c2a3123d400b0000000000000000cd +:10f43000123d400b0000000000000000123d400b98 +:10f4400000000000000000001000c28321e8c0039b +:10f450002400bf8f2000be8f2800bd270800e003d6 +:10f4600000000000f0ffbd270c00beaf21f0a0039c +:10f47000211080001400c5af1000c2a30000c0a37b +:10f480001000c2930700432c27006010000000000a +:10f4900080180200019d023cacf44224211062005d +:10f4a0000000428c080040000000000028f5009d8c +:10f4b000d8f4009dc8f4009df8f4009de8f4009d88 +:10f4c00018f5009d08f5009d1400c28f9c8082af46 +:10f4d0004d3d400b000000001400c28f988082afa9 +:10f4e0004d3d400b000000001400c28fa08082af91 +:10f4f0004d3d400b000000001400c28fa88082af79 +:10f500004d3d400b000000001400c28fa48082af6c +:10f510004d3d400b000000001400c28fac8082af54 +:10f520004d3d400b00000000f4ff02240000c2a388 +:10f53000000000000000c28321e8c0030c00be8f61 +:0cf540001000bd270800e00300000000e0 +:020000040000fa +:020000041d00dd +:10f54c0098ffbd27211000004800b2af4400b1afb6 +:10f55c004000b0af6400bfaf6000beaf5c00b7af9f +:10f56c005800b6af5400b5af5000b4af4c00b3afb9 +:10f57c00219080002188a0007000a6af3000a2afbf +:10f58c0021800000000024826b0080101000a4a3d6 +:10f59c00250002243802821401003326020024269e +:10f5ac00ffff82802d000624211800003000082463 +:10f5bc00200007242b0009242c024610ffff912465 +:10f5cc002e0045282202a0100000000033024750f4 +:10f5dc00010063342f02495002006334029d053c44 +:10f5ec007829a5242120a20002006630feff653098 +:10f5fc00010084900b18a60008006630fbff6530f4 +:10f60c0004008430270280100b18a60021a00000f3 +:10f61c0040201400c0a0140021a094000100312649 +:10f62c0021a08202029d073c000022827829e72457 +:10f63c002120e2000100849004008430f4ff801447 +:10f64c00d0ff94262e0004241c02445001003126c5 +:10f65c000010633421980000100007240080062459 +:10f66c00ff0044307900852c1000a2a33f00a014a9 +:10f67c00010031261000b527010016240400601289 +:10f68c002b10d4022b1076020bb062022b10d4027a +:10f69c000200405021a0000023a096020800773001 +:10f6ac001300e016ffff1324b53d400bffff94261b +:10f6bc003389400f21284002271002000100032645 +:10f6cc000b806200ffff9426f9ff931620000424a0 +:10f6dc00bf3d400bffff13243389400f212840020c +:10f6ec0027100200010003260100b5260b806200e2 +:10f6fc00ffffd626f8ffd3560000a482a2ffe052eb +:10f70c0000002482cb3d400bffff13243389400fb4 +:10f71c002128400227100200010003260b80620002 +:10f72c00ffff9426f9ff9316200004240000248286 +:10f73c0097ff80141000a4a36400bf8f2110000257 +:10f74c006000be8f5c00b78f5800b68f5400b58f29 +:10f75c005000b48f4c00b38f4800b28f4400b18f6f +:10f76c004000b08f0800e0036800bd27019d023cfb +:10f77c0094f7422480200400212044000000828c55 +:10f78c00080040000000000044f7009d80f6009d3a +:10f79c0080f6009d80f6009d80f6009d80f6009d11 +:10f7ac0080f6009d80f6009d80f6009d80f6009d01 +:10f7bc0080f6009d80f6009d80f6009d80f6009df1 +:10f7cc0080f6009d80f6009d80f6009d80f6009de1 +:10f7dc0080f6009d80f6009d80f6009d80f6009dd1 +:10f7ec0080f6009d80f6009d80f6009d80f6009dc1 +:10f7fc0080f6009d80f6009d80f6009d80f6009db1 +:10f80c0080f6009d80f6009d80f6009d80f6009da0 +:10f81c0080f6009d80f6009d80f6009d80f6009d90 +:10f82c0080f6009d80f6009d80f6009d80f6009d80 +:10f83c0080f6009d80f6009d80f6009d80f6009d70 +:10f84c0080f6009d80f6009d80f6009d80f6009d60 +:10f85c0080f6009d80f6009d80f6009d80f6009d50 +:10f86c0080f6009d80f6009d80f6009d80f6009d40 +:10f87c0080f6009d80f6009d80f6009d80f6009d30 +:10f88c0080f6009d80f6009d80f6009d80f6009d20 +:10f89c0080f6009d80f6009d80f6009d80f6009d10 +:10f8ac0080f6009d80f6009d80f6009d80f6009d00 +:10f8bc0080f6009d80f6009d80f6009d80f6009df0 +:10f8cc0080f6009d80f6009d80f6009d80f6009de0 +:10f8dc0080f6009d80f6009d80f6009d80f6009dd0 +:10f8ec0080f6009d80f6009d5cfb009d80f6009ddf +:10f8fc0080f6009d80f6009d80f6009d80f6009db0 +:10f90c0080f6009d80f6009d80f6009d80f6009d9f +:10f91c0080f6009db0fd009d7cf9009d80f6009d59 +:10f92c00a8fd009d80f6009d80f6009d7cf9009d51 +:10f93c0080f6009d80f6009d40fe009d80f6009da7 +:10f94c0080f6009d38fe009d5cfb009d80f6009dbe +:10f95c0080f6009df8fd009d80f6009d78f9009dd5 +:10f96c0080f6009d80f6009d60fb009dc000633416 +:10f97c00000762307b00401021f060000010653001 +:10f98c0006000424100062303b0240100b988500e6 +:10f99c007000a28f07004424f8ff02242410820078 +:10f9ac000000448c0400458c080042243c00a3afaa +:10f9bc009785400f7000a2af3c00a38f21a8400098 +:10f9cc002120a00221280000d78c400f3c00a3afbf +:10f9dc00040041043c00a38f0080023c26a8550083 +:10f9ec0003007e342120a00221280000d78c400f78 +:10f9fc001800a0aff402401421b000001900622ad4 +:10fa0c003e0040100a00c22aff0077326e00e22e40 +:10fa1c00320240140b00e22eeb51033c1f85633481 +:10fa2c001900e302029d063c10180000f439c624ac +:10fa3c0042190300120062248010020021104600bb +:10fa4c000000448c029d023c502d458c3c00a3af21 +:10fa5c001f86400f3800a6af3c00a38f3800a68f3e +:10fa6c008020030000190300211883008028030064 +:10fa7c00212865002328e502cccc033ccdcc633493 +:10fa8c00ff00a5301900a300212040001028000021 +:10fa9c003c00a3afc21005000900422480100200f4 +:10faac00211046001f86400f0000458c3c00a38fa0 +:10fabc00212040001900e3023800a68f1018000026 +:10facc00c218030040100300c018030021104300ab +:10fadc002310e202ff004230801002002130460069 +:10faec001f86400f0000c58c2120a0027281400fa0 +:10fafc002128400021a840000a00c22a1101401010 +:10fb0c00029d023c2120a002d78c400f212800002e +:10fb1c0004014014000000008a8d400f2120a00237 +:10fb2c002120400021280000c38b400f21b8400049 +:10fb3c00212840007081400f2120a00221b04000fc +:10fb4c0021a8e0021800a0afe93f400b21180000eb +:10fb5c0020006334800063340007623087ff401458 +:10fb6c0021f06000c0006230c80140142016037cf4 +:10fb7c002c03400410006230f80140107000a78f75 +:10fb8c007000a58f0000a48c0400a524c3170400ea +:10fb9c007000a5af21a880000302400421f04000b2 +:10fbac0003006016c00077302598be020100732e4a +:10fbbc0040000224c502e2124100e22a7c024010fd +:10fbcc00800002241600e0161000a283010002241b +:10fbdc004603c0131000a2a3029d043cb82c84243d +:10fbec000200072402000224003f400b14000824ea +:10fbfc00213840000400858c2b30c5032c03c054e5 +:10fc0c001000a7a32603be500000858c01004224df +:10fc1c002014027cf6ff4814080084241000a2a3d0 +:10fc2c002a2053005e0280102a2062022014137cca +:10fc3c001000a2a305008012004064300300653060 +:10fc4c00ffff84260ba08500004064300600801066 +:10fc5c002a2054002a2074020200805021a00000a7 +:10fc6c0023a093022a205400160280500400623014 +:10fc7c00231082022000a2af040062301402401054 +:10fc8c002000a28f02006230d202401001006230cc +:10fc9c00010065302d0002242b0004240b204500ac +:10fcac00212840023389400f3c00a3af27100200eb +:10fcbc00010004263c00a38f0b8082002000a28f41 +:10fccc00c001401430000424080064303400a4af98 +:10fcdc00ffff7326029d023cc0201300a82c562463 +:10fcec0021b0c4024010130040201e004100e52a40 +:10fcfc002000633080a013002800a4af219853008b +:10fd0c002400a5af5d3f400b2c00a3af0e00e01606 +:10fd1c001000a4830000c68e0400c78e2120a00210 +:10fd2c00a279400f2128c003212040002128600027 +:10fd3c000a0006247677400f213800003000422458 +:10fd4c002024027c1000a4a33389400f21284002f8 +:10fd5c0027100200010003260b806200f8ffd62654 +:10fd6c00fcff9426fdff7326fdff0224c3016212e3 +:10fd7c0040000224b301e2122400a78fe3ffe01439 +:10fd8c00800002249d01e212c0000224e1ffe21275 +:10fd9c001000a483553f400b000000005f3e400b59 +:10fdac00000463347000a78f100066300100e280fd +:10fdbc000000e58c0400e4247601c0101000a2a31e +:10fdcc00750140501400a5a3ffff06247201465094 +:10fddc001400a5a31400a2a31500a5a302001624c9 +:10fdec001400b527a23d400b7000a4af7000a58f86 +:10fdfc000000a48c0400a524a002801021a880007f +:10fe0c0000008280b20240507000a5af21b000000b +:10fe1c000100d6262110960000004280fdff4054c0 +:10fe2c000100d626a23d400b7000a5af5f3e400bf3 +:10fe3c0040006334100062302120c0000a20e20030 +:10fe4c0025188300ffff63309b3d400b000022828e +:10fe5c00e3fd4814029d053c040063340100842436 +:10fe6c00ffff8280d6fd4614ffff91240800633407 +:10fe7c009b3f400b010084243389400f2128400212 +:10fe8c00ffff0324bffd431021886002643d400b3b +:10fe9c00010010269b3f400b010084249b3f400b2c +:10feac00010084242a000424020144102e0004249e +:10febc00e7fd441421a0000001003126000022823d +:10fecc002a000424e001441000406334029d053ce8 +:10fedc007829a5242120a2000100849004008430fc +:10feec00dcfd80102198000040201300c098130006 +:10fefc00219893000100312621986202029d053c55 +:10ff0c00000022827829a5242120a20001008490df +:10ff1c0004008430f4ff8014d0ff73269a3d400b0c +:10ff2c00100007248a8d400f2120a002fdfe4014f2 +:10ff3c00212040000200c32afbfe6014212800008f +:10ff4c00029d023c542d42243000a48fd78c400fcc +:10ff5c000000458cdf004004edffc326eeffc326f6 +:10ff6c001800a3af2024037cc880400f3c00a3af33 +:10ff7c00212840002120a0020b85400f3000a2afa9 +:10ff8c008a8d400f212040003c00a38f21b84000f7 +:10ff9c0021a8400021b00000010004240a00e22e38 +:10ffac00490240141000a4a3029d043cb82c8424e4 +:10ffbc00211000000200052402000724f53f400b2d +:10ffcc00120009242138a0000400868c7601c0148c +:10ffdc00020048240000868c2b30e6027201c0140b +:10ffec00010042240100e524202c057cf5ff491476 +:10fffc00080084241000a5a31400082423b883024d +:020000041d01dc +:10000c0023b8f30223b8e802ffffe2260bb8530033 +:10001c000300c433ffffe3260400c2334501401044 +:10002c000bb864000200c233e60140100100c23379 +:10003c000100c4332d0002242b0003240a10640099 +:10004c00212040003389400f212840022710020054 +:10005c00010003260b8062000a00e05a0800de3320 +:10006c00300004243389400f21284002271002005d +:10007c0001000326fffff726f9ffe0160b80620054 +:10008c000800de332000beaf029d043c3a40400b1a +:10009c00a82c9424c0180300211883020000668c3d +:1000ac000400678c2120a002a279400f21280000b7 +:1000bc0021204000212860000a0006247677400f9a +:1000cc0021380000300044243389400f212840029d +:1000dc0027100200010003260b8062001000a2838f +:1000ec00ffff4324201c037ceaff40141000a3a351 +:1000fc001800a28f0c0040181300622a3000042450 +:10010c003389400f212840021800a48f01000326d8 +:10011c0027100200ffff84240b806200f7ff801c75 +:10012c001800a4af1300622afc0040142014137ca6 +:10013c00120002241000a2a3eeff73262e0004244a +:10014c003389400f21284002ffff03240200431093 +:10015c001000b48301001026c880400f21208002bb +:10016c00212040001f86400f2128c0028a8d400f9d +:10017c002120400021a84000ffff82262014027c91 +:10018c0021f00000230080121000a2a3029d053c68 +:10019c00a82cb624c01002002110c2020000468c0c +:1001ac000400478c2120a002a279400f2128c00313 +:1001bc00212040000a000624213800007677400fe9 +:1001cc0021286000300044243389400f212840024c +:1001dc001000b48327100200c01814002118c302a9 +:1001ec000000668c0400678c2128c00301000326e4 +:1001fc002120a0027677400f0b80620021a84000de +:10020c00ffff82262014027c21f06000e1ff8016a3 +:10021c001000a2a30a0060122000a78f3000042453 +:10022c003389400f212840022710020001000326c9 +:10023c00ffff7326f9ff60160b8062002000a78f6a +:10024c00d1fce05000002482cffce05a0000248254 +:10025c00200004243389400f21284002271002007b +:10026c0001000326fffff726f9ffe0160b80620062 +:10027c00653d400b000024827000a48f0000958c1b +:10028c0004008424733e400b7000a4af5c01400456 +:10029c00100062303a0040107000a78f7000a58fdc +:1002ac0021f000000000b58c0400a524eb3e400baf +:1002bc007000a5af7000a48f7000a28f01003126d2 +:1002cc00040084240000548c00002282943d400bd6 +:1002dc007000a4afdc3f400b1800a3af5e0140548c +:1002ec00029d023ccccc033ccdcc63341900e30220 +:1002fc00029d063c10180000f439c624c2180300f5 +:10030c000900622480100200211046000000448c79 +:10031c00029d023c502d458c3c00a3af1f86400f24 +:10032c003800a6af3c00a38f3800a68f40200300f6 +:10033c00c0180300211883002318e302ff00633068 +:10034c0080180300213066000000c58c1f86400f0a +:10035c0021204000be3e400b2120a0020000e48c76 +:10036c000400e724c31704007000a7af21a8800085 +:10037c000bfe410421f04000ee40400b23a804008a +:10038c0021f000000000f58c0400e724eb3e400b4c +:10039c007000a7af1400a5a3010016241400b52704 +:1003ac00a23d400b7000a4af23a804002b20150025 +:1003bc002310020003006334eb3e400b23f0440097 +:1003cc0030000424212840023389400f3c00a3afa5 +:1003dc002000a58f2710020001000426ffffa52492 +:1003ec002000a5af0b808200f5ffa0143c00a38f6a +:1003fc0008006730373f400b3400a7af2c00a28faa +:10040c001c004050029d053c029d043c802c832422 +:10041c002800a78f272014000420870006109502bf +:10042c00251082002000853206209e020b108500cc +:10043c000f0042302110620000004480553f400bf9 +:10044c001000a4a32800a38f27101300041043004e +:10045c0006207502252044002000633206107e021f +:10046c000b2043000700843030008424553f400ba0 +:10047c001000a4a30741400b942ca3243400a48f98 +:10048c0041fc8050000024822000a58f3efca05827 +:10049c0000002482200004243389400f21284002cc +:1004ac002000a78f2710020001000326ffffe7247e +:1004bc002000a7aff7ffe0140b806200653d400bf6 +:1004cc0000002482effd40142000a0af2000a28f7a +:1004dc009c00401408006530080064303400a4af60 +:1004ec000200623093004010010062300100653060 +:1004fc002d0002242b0004240b204500212840024f +:10050c003389400f3c00a3af2710020001000426e2 +:10051c000b808200373f400b3c00a38f1000a2a33e +:10052c0006ff401423986202ffff02248840400b10 +:10053c001000a2a30800c3330b0060142000a3af6b +:10054c000a00e01a0200c233200004243389400f51 +:10055c00212840022710020001000326fffff72686 +:10056c00f9ffe0160b8062000200c233910040508c +:10057c000100de330100c4332d0002242b000324c0 +:10058c000a106400212040003389400f21284002ca +:10059c0027100200010003262540400b0b8062004f +:1005ac00103f400b0b9844000240400b1000a5a3d9 +:1005bc002c00e212c000022484fde2121000a2837f +:1005cc000c3f400b2a2053001800a527488d400fe4 +:1005dc002120a0021800a28f6666043cffff422473 +:1005ec004018020021106200676684241800440041 +:1005fc00c3170200102000008320040023b08200e7 +:10060c000000c32affffc2260bb0430023201600b4 +:10061c00c880400f2024047c212040001f86400ffe +:10062c002128a0023000a2af029d023c482d458c2f +:10063c00d78c400f3000a48f6a004104029d023c0d +:10064c00823e400bffffd6267000a78f010031269b +:10065c000000f38c0400e72400002282993d400b3b +:10066c007000a7af01000224a500c0131000a2a3c4 +:10067c0002000224020007240001042421280000a7 +:10068c00ab41400b10000824003105000039040078 +:10069c00253026012120e0002128c000213840000f +:1006ac002b30c5035efdc0541000a2a38200c513fd +:1006bc002b30a4020100e2242014027cf2ff481427 +:1006cc00024f04000b3f400b1000a8a301000224b2 +:1006dc008100c0131000a2a302000824020002240f +:1006ec004000042421280000c541400b15000724bc +:1006fc00c0300500c0400400253026012120000137 +:10070c002128c000214040002b30c5036200c0549a +:10071c001000a8a35d00c5132b30a40201004224d5 +:10072c002014027cf2ff4714424f04000b3f400b95 +:10073c001000a2a367fd4050ffff73264241400bff +:10074c002000042466ffa0143400a5af200004246c +:10075c00212840023389400f3c00a3af2000a78f13 +:10076c002710020001000426ffffe7242000a7af9a +:10077c000b8082005affe0103c00a38f2000042461 +:10078c00212840023389400f3c00a3af2000a78fe3 +:10079c002710020001000426ffffe7242000a7af6a +:1007ac000b808200e9ffe0143c00a38f3c41400b1e +:1007bc000200623035fec053029d043c6541400b83 +:1007cc002000042424fe4010200004241440400b7c +:1007dc00000000003afd40102000a28f2b3f400b80 +:1007ec00200004244c2d448cd78c400f3000a58f56 +:1007fc00010042280100c326823e400b0bb0620070 +:10080c007000a28f07004424f8ff022424108200f9 +:10081c00080044247000a4af0000558ceb3e400b44 +:10082c0004005e8c7000a28f07004524f8ff0224a0 +:10083c002428a2000000a48c0400a28c0800a5248b +:10084c007000a5af21a88000d5fc410421f0400028 +:10085c00ee40400b23a80400f439422480b8170062 +:10086c0021b8e202029d023c0000e48e1f86400f7c +:10087c00502d458cbe3e400b2120a002029d153c04 +:10088c00782cb526833f400b2120a002a4ffc0503a +:10089c00010042241000a8a30b3f400b21100001c3 +:1008ac002b28a502dafca050010042241000a7a3bb +:1008bc000b3f400b2110e0007fffc0500100e224f1 +:1008cc000b3f400b1000a2a30240400b0100082478 +:1008dc00a23d400b21b000000800a22e7fff40502b +:1008ec00020008240b3f400b010002240a00a22e38 +:1008fc00bafc4010029d043c0b3f400b010002244b +:10090c001000a22e5bff4050020002240b3f400b54 +:04091c0001000224b0 +:020000040000fa +:020000041d01dc +:10092000d8ffbd272400bfaf2000beaf21f0a00339 +:100930002800c4af1000c0a3050002241400c2a305 +:100940000100023c0802443404000524d878400f1a +:1009500000000000ff0043301000c293211062002d +:10096000ff0042301000c2a31400c2930100033cf8 +:100970000c02643421284000d878400f00000000a9 +:10098000ff0043301000c29321106200ff0042308c +:100990001000c2a30100023c1402443401000524eb +:1009a000d878400f00000000ff0043301000c293d1 +:1009b00021106200ff0042301000c2a30100023c7f +:1009c0001c02443484100524d878400f0000000035 +:1009d000ff0043301000c29321106200ff0042303c +:1009e0001000c2a30100023c04024434810005242b +:1009f000d878400f00000000ff0043301000c29381 +:100a000021106200ff0042301000c2a31800c2276c +:100a10000100033c1802643421284000c878400fcc +:100a200000000000ff0043301000c293211062005c +:100a3000ff0042301000c2a31000c2830700401420 +:100a4000000000001800c38f01000224efff6214b1 +:100a5000000000009842400b000000000000000071 +:100a60001000c2830600401400000000841004241b +:100a7000ba78400f00000000a142400b00000000c7 +:100a8000211000001800c2af1800c28fff004330d1 +:100a90002800c28f000043a01000c28321e8c003d9 +:100aa0002400bf8f2000be8f2800bd270800e00370 +:100ab00000000000d8ffbd272400bfaf2000beaf5c +:100ac00021f0a0032800c4af2c00c5af3000c6af92 +:100ad0001c00c0af1000c0a30b0002241400c2a36e +:100ae0002c00c28f02140200ff0042301500c2a386 +:100af0002c00c28f02120200ff0042301600c2a377 +:100b00002c00c28fff0042301700c2a3a5ff0224b1 +:100b10001800c2a30100023c080244343000c58f13 +:100b2000d878400f00000000ff0043301000c2934f +:100b300021106200ff0042301000c2a31400c293d3 +:100b4000211840001500c29300120200251862000f +:100b50001600c29300140200251862001700c29309 +:100b600000160200251062000100033c0c026434f0 +:100b700021284000d878400f00000000ff004330db +:100b80001000c29321106200ff0042301000c2a387 +:100b90001800c2930100033c100264342128400075 +:100ba000d878400f00000000ff0043301000c293cf +:100bb00021106200ff0042301000c2a30100023c7d +:100bc000140244341f000524d878400f00000000b0 +:100bd000ff0043301000c29321106200ff0042303a +:100be0001000c2a30100023c1c0244342800c58f3f +:100bf000d878400f00000000ff0043301000c2937f +:100c000021106200ff0042301000c2a30100023c2c +:100c10000402443485000524d878400f0000000009 +:100c2000ff0043301000c29321106200ff004230e9 +:100c30001000c2a31c00c2270100033c1802643448 +:100c400021284000c878400f00000000ff0043301a +:100c50001000c29321106200ff0042301000c2a3b6 +:100c60001000c28307004014000000001c00c38f66 +:100c700001000224efff6214000000002243400b39 +:100c800000000000000000001000c28321e8c00343 +:100c90002400bf8f2000be8f2800bd270800e0037e +:100ca00000000000d8ffbd272400bfaf2000beaf6a +:100cb00021f0a0032800c4af1800c0af1000c0a3eb +:100cc000200002241400c2a32800c28f02140200d4 +:100cd000ff0042301500c2a32800c28f021202009a +:100ce000ff0042301600c2a32800c28fff0042302e +:100cf0001700c2a30100023c08024434212800006e +:100d0000d878400f00000000ff0043301000c2936d +:100d100021106200ff0042301000c2a31400c293f1 +:100d2000211840001500c29300120200251862002d +:100d30001600c29300140200251862001700c29327 +:100d400000160200251062000100033c0c0264340e +:100d500021284000d878400f00000000ff004330f9 +:100d60001000c29321106200ff0042301000c2a3a5 +:100d70000100023c140244340f000524d878400fcf +:100d800000000000ff0043301000c29321106200f9 +:100d9000ff0042301000c2a30100023c1c02443498 +:100da00021280000d878400f00000000ff004330e9 +:100db0001000c29321106200ff0042301000c2a355 +:100dc0000100023c0402443484000524d878400f1a +:100dd00000000000ff0043301000c29321106200a9 +:100de000ff0042301000c2a31800c2270100033cdc +:100df0001802643421284000c878400f0000000029 +:100e0000ff0043301000c29321106200ff00423007 +:100e10001000c2a31000c2830700401400000000ad +:100e20001800c38f01000224efff621400000000cd +:100e30008f43400b00000000000000001000c28340 +:100e400021e8c0032400bf8f2000be8f2800bd27eb +:100e50000800e00300000000d8ffbd272400bfaf5a +:100e60002000beaf21f0a0031800c0af1000c0a347 +:100e7000060002241400c2a30100023c080244340c +:100e800021280000d878400f00000000ff00433008 +:100e90001000c29321106200ff0042301000c2a374 +:100ea0001400c2930100033c0c026434212840006a +:100eb000d878400f00000000ff0043301000c293bc +:100ec00021106200ff0042301000c2a30100023c6a +:100ed0001402443401000524d878400f00000000bb +:100ee000ff0043301000c29321106200ff00423027 +:100ef0001000c2a30100023c1c024434212800005f +:100f0000d878400f00000000ff0043301000c2936b +:100f100021106200ff0042301000c2a30100023c19 +:100f20000402443481000524d878400f00000000fa +:100f3000ff0043301000c29321106200ff004230d6 +:100f40001000c2a31800c2270100033c1802643439 +:100f500021284000c878400f00000000ff00433007 +:100f60001000c29321106200ff0042301000c2a3a3 +:100f70001000c28307004014000000001800c38f57 +:100f800001000224efff621400000000e643400b62 +:100f900000000000000000001000c28321e8c00330 +:100fa0002400bf8f2000be8f2800bd270800e0036b +:100fb00000000000d8ffbd272400bfaf2000beaf57 +:100fc00021f0a0031800c0af1000c0a30400022449 +:100fd0001400c2a30100023c08024434212800008e +:100fe000d878400f00000000ff0043301000c2938b +:100ff00021106200ff0042301000c2a31400c2930f +:101000000100033c0c02643421284000d878400fd2 +:1010100000000000ff0043301000c2932110620066 +:10102000ff0042301000c2a30100023c140244340d +:1010300001000524d878400f00000000ff00433075 +:101040001000c29321106200ff0042301000c2a3c2 +:101050000100023c1c02443421280000d878400fd3 +:1010600000000000ff0043301000c2932110620016 +:10107000ff0042301000c2a30100023c04024434cd +:1010800081000524d878400f00000000ff004330a5 +:101090001000c29321106200ff0042301000c2a372 +:1010a0001800c2270100033c1802643421284000c4 +:1010b000c878400f00000000ff0043301000c293ca +:1010c00021106200ff0042301000c2a31000c28352 +:1010d00007004014000000001800c38f0100022424 +:1010e000efff6214000000003d44400b00000000d0 +:1010f000000000001000c28321e8c0032400bf8f5d +:101100002000be8f2800bd270800e003000000007b +:10111000d8ffbd272400bfaf2000beaf21f0a00341 +:101120002800c4af2c00c5af3000c6af1800c0af58 +:101130001000c0a3020002241400c2a32c00c28f1e +:1011400002140200ff0042301500c2a32c00c28f1f +:1011500002120200ff0042301600c2a32c00c28f10 +:10116000ff0042301700c2a30100023c08024434d1 +:1011700021280000d878400f00000000ff00433015 +:101180001000c29321106200ff0042301000c2a381 +:101190001400c293211840001500c29300120200ef +:1011a000251862001600c293001402002518620080 +:1011b0001700c29300160200251062000100033cd4 +:1011c0000c02643421284000d878400f0000000051 +:1011d000ff0043301000c29321106200ff00423034 +:1011e0001000c2a30100023c140244340f00052485 +:1011f000d878400f00000000ff0043301000c29379 +:1012000021106200ff0042301000c2a30100023c26 +:101210001c0244342800c58fd878400f000000001d +:10122000ff0043301000c29321106200ff004230e3 +:101230001000c2a33000c28f0098427c001202004e +:10124000840042340100033c04026434212840003d +:10125000d878400f00000000ff0043301000c29318 +:1012600021106200ff0042301000c2a31800c22704 +:101270000100033c1802643421284000c878400f64 +:1012800000000000ff0043301000c29321106200f4 +:10129000ff0042301000c2a31000c28307004014b8 +:1012a000000000001800c38f01000224efff621449 +:1012b00000000000b044400b0000000000000000ef +:1012c0001000c28321e8c0032400bf8f2000be8f1e +:1012d0002800bd270800e00300000000e0ffbd2754 +:1012e0001c00bfaf1800beaf21f0a0032000c4afa8 +:1012f0002400c5af2800c6af1000c0a30d00043cf9 +:101300002400c58f2800c68fad42400f00000000aa +:101310001000c2a31000c2830900401400000000a6 +:101320000d00043c2000c58f2800c68ffc78400fbc +:10133000000000001000c2a3d144400b00000000d8 +:10134000000000001000c28321e8c0031c00bf8f12 +:101350001800be8f2000bd270800e0030000000039 +:10136000e0ffbd271c00bfaf1800beaf21f0a003f7 +:101370002000c4af2400c5af2110c0002800c2a7c0 +:101380001000c0a39643400f000000002800c29741 +:101390000d00043c2400c58f213040005979400fd6 +:1013a00000000000ff0043301000c29321106200d3 +:1013b000ff0042301000c2a32800c2970d00043c79 +:1013c0002000c58f213040004444400f0000000041 +:1013d000ff0043301000c29321106200ff00423032 +:1013e0001000c2a31000c2831800401400000000c7 +:1013f0001100c227212040004842400f0000000099 +:10140000ff0043301000c29321106200ff00423001 +:101410001000c2a31100c29301004230ff0042300d +:10142000f0ff401400000000ed43400f00000000fa +:10143000ff0043301000c29321106200ff004230d1 +:101440001000c2a31445400b000000000000000083 +:101450001000c28321e8c0031c00bf8f1800be8f9c +:101460002000bd270800e00300000000d8ffbd27d2 +:101470002400bfaf2000beaf21f0a0031c00c0af0e +:101480001000c0af1400c0a39fff02241800c2a325 +:101490000100023c0802443404000524d878400fbf +:1014a00000000000ff0043301400c29321106200ce +:1014b000ff0042301400c2a31800c2930100033c95 +:1014c0000c02643421284000d878400f000000004e +:1014d000ff0043301400c29321106200ff0042302d +:1014e0001400c2a30100023c14024434010005248c +:1014f000d878400f00000000ff0043301400c29372 +:1015000021106200ff0042301400c2a30100023c1f +:101510001c02443484100524d878400f00000000d9 +:10152000ff0043301400c29321106200ff004230dc +:101530001400c2a30100023c0402443481000524cb +:10154000d878400f00000000ff0043301400c29321 +:1015500021106200ff0042301400c2a31c00c22709 +:101560000100033c1802643421284000c878400f71 +:1015700000000000ff0043301400c29321106200fd +:10158000ff0042301400c2a31400c28312004014b2 +:10159000000000001000c28f010042241000c2af02 +:1015a0001000c28ff501422c05004014000000001d +:1015b000fbff02241400c2a37745400b000000008b +:1015c0001c00c38f01000224e4ff6214000000002d +:1015d0007745400b00000000000000001400c283ab +:1015e000060040140000000084100424ba78400f64 +:1015f000000000008045400b0000000021100000aa +:101600001c00c2af1c00c28f21e8c0032400bf8fa2 +:101610002000be8f2800bd270800e0030000000066 +:10162000e0ffbd271c00bfaf1800beaf21f0a00334 +:101630002000c4af2400c5af2800c6af1000c0a36f +:101640002800c38f018002342b1062001a0040145e +:10165000000000002000c48f2400c58f00800634e5 +:10166000b744400f000000001000c2a31000c28366 +:1016700019004014000000002800c28f008042249e +:101680002800c2af2400c38f008002342110620002 +:101690002400c2af2000c38f0080023421106200fa +:1016a0002000c2af2800c38f018002342b106200db +:1016b000e8ff4010000000002000c48f2400c58f08 +:1016c0002800c68fb744400f000000001000c2a3de +:1016d000b745400b00000000000000001000c2836e +:1016e00021e8c0031c00bf8f1800be8f2000bd275b +:1016f0000800e00300000000d8ffbd272400bfafb2 +:101700002000beaf21f0a0032800c4af2c00c5af5d +:101710003000c6af1000c0a3000102241400c2af05 +:101720002c00c38f1400c28f1b006200f401400024 +:10173000101000001800c2af3000c28f0500401426 +:1017400000000000f4ff02241000c2a32a46400b50 +:10175000000000001800c28f4d0040100000000083 +:101760001400c38f1800c28f231062001c00c2af88 +:101770003000c38f1c00c28f2b10430005004010a7 +:10178000000000001c00c28fffff4230e745400b05 +:10179000000000003000c28fffff42302c00c48fd9 +:1017a0002800c58f21304000d844400f00000000c1 +:1017b0000500401000000000f4ff02241000c2a346 +:1017c0002a46400b000000003000c38f1c00c28f6f +:1017d0002b10620033004014000000002800c38f6b +:1017e0001c00c28f211062002800c2af2c00c38fe2 +:1017f0001c00c28f211062002c00c2af3000c38fca +:101800001c00c28f231062003000c2af2446400b80 +:10181000000000001400c28f3000c38f3000c48f5e +:101820002b2044000a1064001c00c2af1c00c28fb1 +:10183000ffff42302c00c48f2800c58f21304000ac +:10184000d844400f000000000500401000000000d8 +:10185000f4ff02241000c2a32a46400b000000003f +:101860002800c38f1c00c28f211062002800c2af65 +:101870002c00c38f1c00c28f211062002c00c2af4d +:101880003000c38f1c00c28f231062003000c2af33 +:101890003000c28fdfff4014000000002a46400bda +:1018a00000000000000000001000c28321e8c00317 +:1018b0002400bf8f2000be8f2800bd270800e00352 +:1018c00000000000e0ffbd271c00bfaf1800beaf46 +:1018d00021f0a0032000c4af2400c5af1000c0afaa +:1018e0001400c0a31500c0a32000c28f1000c2af17 +:1018f0007346400b000000009643400f00000000bc +:10190000ff0043301400c29321106200ff004230f8 +:101910001400c2a31500c227212040004842400ff6 +:1019200000000000ff0043301400c2932110620049 +:10193000ff0042301400c2a31000c48f2943400f9f +:1019400000000000ff0043301400c2932110620029 +:10195000ff0042301400c2a31500c227212040001e +:101960004842400f00000000ff0043301400c293c3 +:1019700021106200ff0042301400c2a31400c28391 +:101980001b004014000000001500c2272120400069 +:101990004842400f00000000ff0043301400c29393 +:1019a00021106200ff0042301400c2a31500c29350 +:1019b00001004230ff004230f0ff40140000000000 +:1019c0001000c28f001042241000c2af2400c38f49 +:1019d0002000c28f211862001000c28f2b1043001c +:1019e000c5ff4014000000007d46400b00000000d1 +:1019f000000000001400c28321e8c0031c00bf8f58 +:101a00001800be8f2000bd270800e0030000000082 +:101a1000e0ffbd271c00bfaf1800beaf21f0a00340 +:101a20001000c0af1400c0afe080828f11004014de +:101a3000000000001b45400f000000001000c2af76 +:101a40001000c38fffff02240a0062100000000094 +:101a50001000c28f02140200ff004230efff422448 +:101a60001400c2af1400c28f01000324041043000d +:101a7000e08082afe080828f21e8c0031c00bf8f2e +:101a80001800be8f2000bd270800e0030000000002 +:101a9000e8ffbd271400bfaf1000beaf21f0a003c8 +:101aa0001800c4af2110a0001c00c2a71c00c297e0 +:101ab000212000001800c58f21304000b97c400f64 +:101ac0000000000021e8c0031400bf8f1000be8f8b +:101ad0001800bd270800e00300000000e8ffbd2754 +:101ae0001400bfaf1000beaf21f0a0031800c4afb8 +:101af0002110a0001c00c2a71c00c2971800c48fb0 +:101b00002128000021304000b97c400f0000000077 +:101b100021e8c0031400bf8f1000be8f1800bd273e +:101b20000800e00300000000e8ffbd271400bfaf7d +:101b30001000beaf21f0a0031800c4af1c00c5af59 +:101b40002110c0002000c2a72000c2971800c48f37 +:101b50001c00c58f21304000b97c400f0000000000 +:101b600021e8c0031400bf8f1000be8f1800bd27ee +:101b70000800e00300000000f8ffbd270400beaf2e +:101b800021f0a003211880002110a0000800c3a3a9 +:101b90000c00c2a30800c293401802000c00c293bc +:101ba00026186200029d023c7c2a42242110620019 +:101bb0000000429021e8c0030400be8f0800bd274a +:101bc0000800e00300000000e8ffbd271400bfafdd +:101bd0001000beaf21f0a003211080001c00c5af93 +:101be0002000c6af1800c2a30747400b000000004a +:101bf0001800c3931c00c28f000042901c00c48fc9 +:101c0000010084241c00c4af212060002128400072 +:101c1000de46400f000000001800c2a32000c28f63 +:101c20002b100200ff0042302000c38fffff63240f +:101c30002000c3afeeff4014000000001800c29364 +:101c400021e8c0031400bf8f1000be8f1800bd270d +:101c50000800e00300000000c8ffbd273400bfaf4c +:101c60003000beaf2c00b0af21f0a00321188000df +:101c70003c00c5af4000c6af4400c7af4800c28fac +:101c80003800c3a32000c2a3050002241000c2a391 +:101c90001100c0a33800c2931400c2a33800c2933d +:101ca0003dff42240d00432c9c006010000000000a +:101cb00080180200019d023ccc1c422421106200cd +:101cc0000000428c08004000000000001c1e019d26 +:101cd0003c1d019d1c1f019d1c1f019db41d019dec +:101ce000b41d019da41e019d001d019d1c1f019d91 +:101cf0001c1f019d1c1f019d1c1f019d8c1d019d12 +:101d00003c00c28f02140200ff0042301500c2a343 +:101d10003c00c28f02120200ff0042301600c2a334 +:101d20003c00c28fff0042301700c2a3050002240e +:101d30001000c2a3ca47400b000000003c00c28f45 +:101d400002120200ff0042301500c2a32000c2931d +:101d500006004010000000001500c39380ff02241d +:101d600025106200ff0042301500c2a33c00c28f64 +:101d7000ff0042301600c2a31700c0a305000224d2 +:101d80001000c2a3ca47400b00000000ffff02245e +:101d90001500c2a3ffff02241600c2a3ffff022406 +:101da0001700c2a3050002241000c2a3ca47400bbb +:101db000000000003c00c28f02140200ff0042300d +:101dc0001500c2a33c00c28f02120200ff00423085 +:101dd0001600c2a33c00c28fff0042301700c2a30e +:101de0004400c28f02140200ff0042301800c2a358 +:101df0004400c28f02120200ff0042301900c2a349 +:101e00004400c28fff0042301a00c2a3080002241f +:101e10001000c2a3ca47400b000000003c00c28f64 +:101e200002120200ff0042301500c2a32000c2933c +:101e300006004010000000001500c39380ff02243c +:101e400025106200ff0042301500c2a33c00c28f83 +:101e5000ff0042301600c2a34000c28f02160200eb +:101e6000ff0042301700c2a34000c28f02140200dc +:101e7000ff0042301800c2a34000c28f02120200cd +:101e8000ff0042301900c2a34000c28fff00423061 +:101e90001a00c2a3080002241000c2a3ca47400bc4 +:101ea000000000003c00c28f02140200ff0042301c +:101eb0001500c2a33c00c28f02120200ff00423094 +:101ec0001600c2a33c00c28fff0042301700c2a31d +:101ed0004000c28f02160200ff0042301800c2a369 +:101ee0004000c28f02140200ff0042301900c2a35a +:101ef0004000c28f02120200ff0042301a00c2a34b +:101f00004000c28fff0042301b00c2a30900022420 +:101f10001000c2a3ca47400b00000000ffff0224cc +:101f20001100c2a3000000001100c283220040146f +:101f300000000000d88082931200401400000000ce +:101f40001000c293ffff50241000c293ffff4224f1 +:101f50001400c3277f0004242128600021304000a2 +:101f6000f246400f0000000040100200ff00433026 +:101f70001000c22721105000040043a0e447400b8a +:101f8000000000001000c293ffff42241000c2a313 +:101f90001000c2931400c3272120600021284000b4 +:101fa000b746400f00000000030040100000000092 +:101fb000ffff02241100c2a31100c28321e8c00365 +:101fc0003400bf8f3000be8f2c00b08f3800bd278b +:101fd0000800e00300000000e0ffbd271c00bfafc9 +:101fe0001800beaf21f0a003211080002000c2a382 +:101ff0001000c0a30a0002241100c2a31200c227cd +:102000002120400001000524a446400f00000000ec +:102010000500401000000000ffff02241000c2a3d2 +:102020003b48400b000000001200c2932000c39305 +:1020300009006210000000001100c2832a10020093 +:10204000ff0042301100c393ffff63241100c3a3bc +:10205000eaff4014000000001100c28305004104a3 +:1020600000000000ffff02241000c2a33b48400b09 +:10207000000000000a0002241100c2a31200c227bf +:102080002120400001000524a446400f000000006c +:102090000500401000000000ffff02241000c2a352 +:1020a0003b48400b000000001200c29309004010a2 +:1020b000000000001100c2832a100200ff0042301d +:1020c0001100c393ffff63241100c3a3ebff40146f +:1020d000000000001100c283040041040000000061 +:1020e000ffff02241000c2a3000000001000c28302 +:1020f00021e8c0031c00bf8f1800be8f2000bd2741 +:102100000800e00300000000d0ffbd272c00bfaf97 +:102110002800beaf21f0a0031000a0afcf00042420 +:102120002128000021300000213800001647400f10 +:1021300000000000cf000424f647400f000000001c +:1021400013004010000000001800c0af1c00c0af1a +:10215000ffff02241800c2a32000c2271800c327d3 +:10216000212060002128400008000624ca46400fb4 +:10217000000000002700c393ff0002240400621047 +:1021800000000000ffff02246548400b0000000033 +:102190002110000021e8c0032c00bf8f2800be8f53 +:1021a0003000bd270800e00300000000d8ffbd2775 +:1021b0002400bfaf2000beaf21f0a0032800c4afb1 +:1021c0002118a0002110c0002c00c3a73000c2a31a +:1021d0001600c0a31200c0a72c00c2970120422cf9 +:1021e00005004010000000002c00c2971400c2a798 +:1021f0008048400b00000000002002241400c2a709 +:102200000a0002241000c2a71a00c22721204000a1 +:1022100001000524a446400f000000000500401006 +:1022200000000000ffff02241600c2a39d48400bdf +:10223000000000001a00c293f0004330f0000224b6 +:102240000b006210000000001000c2872b1002007b +:10225000ff0042301000c397ffff63241000c3a7a4 +:10226000e9ff4014000000009d48400b0000000002 +:10227000000000001600c383ffff02243500621037 +:10228000000000001000c2870500401c0000000094 +:10229000ffff02241600c2a3d648400b0000000036 +:1022a0001200c2872800c38f211862001400c29751 +:1022b0002120600021284000a446400f00000000bb +:1022c0000500401000000000ffff02241600c2a31a +:1022d000d648400b000000003000c2930f004014ad +:1022e00000000000d88082930c0040140000000021 +:1022f0001800c2272120400002000524a446400ff8 +:10230000000000000500401000000000ffff022454 +:102310001600c2a3d648400b000000001200c3976d +:102320001400c29721106200ffff42301200c2a7c2 +:102330001400c2972c00c397231062002c00c2a780 +:102340002c00c297a4ff401400000000d648400ba8 +:1023500000000000000000001600c28321e8c00356 +:102360002400bf8f2000be8f2800bd270800e00397 +:1023700000000000d8ffbd272400bfaf2000beaf83 +:1023800021f0a0032800c4af2110a0002c00c2a798 +:102390001000c0a71400c0a31800c0a72c00c2974b +:1023a0000120422c05004010000000002c00c297c4 +:1023b0001200c2a7f148400b0000000000200224d8 +:1023c0001200c2a7f0ff02241600c2a31000c287a9 +:1023d0000d004014000000002c00c2970120422c88 +:1023e0000500401000000000030002241500c2a3f5 +:1023f0000c49400b00000000010002241500c2a39c +:102400000c49400b000000002c00c2970120422c18 +:102410000500401000000000030002241500c2a3c4 +:102420000c49400b00000000020002241500c2a36a +:102430001600c3931500c29325106200ff004230be +:102440001600c2a31600c227212040000100052467 +:10245000b746400f000000000500401000000000db +:10246000ffff02241400c2a34449400b00000000f7 +:102470001000c2872800c38f211862001200c29783 +:102480002120600021284000b746400f00000000d6 +:102490000500401000000000ffff02241400c2a34a +:1024a0004449400b00000000d88082930c00401487 +:1024b000000000001800c22721204000020005246f +:1024c000b746400f0000000005004010000000006b +:1024d000ffff02241400c2a34449400b0000000087 +:1024e0001000c3971200c29721106200ffff423014 +:1024f0001000c2a72c00c3971200c29723106200dd +:102500002c00c2a72c00c297a4ff401400000000ba +:102510001400c28321e8c0032400bf8f2000be8fb7 +:102520002800bd270800e00300000000d8ffbd27f9 +:102530002400bfaf2000beaf21f0a0032800c4af2d +:102540002c00c5af1a00c0a3c9ff02241800c2a303 +:102550001900c0a32800c28f3100422c0500401092 +:1025600000000000c3ff02241800c2a301000224df +:102570001900c2a31800c2931900c3931000a3af9f +:10258000212040002800c58f2c00c68f040007249e +:102590001647400f000000001a00c2a31a00c283b1 +:1025a0000400401000000000ffff02247b49400ba4 +:1025b000000000001800c29321204000f647400fa1 +:1025c000000000001a00c2a31a00c28306004010d7 +:1025d000000000004248400f00000000ffff0224fe +:1025e0007b49400b000000002110000021e8c003df +:1025f0002400bf8f2000be8f2800bd270800e00305 +:1026000000000000d8ffbd272400bfaf2000beaff0 +:1026100021f0a0032800c4af2c00c5af2110c000da +:102620003000c2a7c7ff02241800c2a33000c3971e +:1026300001000224030062140000000002000224d2 +:102640003000c2a71800c3933000c2971000a0af9b +:10265000212060002800c58f213000002138400073 +:102660001647400f000000001900c2a31900c283e2 +:102670000400401000000000ffff0224bd49400b91 +:10268000000000001800c29321204000f647400fd0 +:10269000000000001900c2a31900c2830600401008 +:1026a000000000004248400f00000000ffff02242d +:1026b000bd49400b000000003000c2972c00c48fc1 +:1026c00021284000dd48400f000000001900c2a38f +:1026d0001900c28306004010000000004248400f6d +:1026e00000000000ffff0224bd49400b0000000075 +:1026f0002110000021e8c0032400bf8f2000be8ffe +:102700002800bd270800e00300000000d8ffbd2717 +:102710002400bfaf2000beaf21f0a0032800c4af4b +:102720002c00c5af1a00c0a3caff02241800c2a320 +:102730001900c0a32800c28f0001422c05004010e0 +:1027400000000000c4ff02241800c2a301000224fc +:102750001900c2a31800c2931900c3931000a3afbd +:10276000212040002800c58f2130000004000724ec +:102770001647400f000000001a00c2a31a00c283cf +:102780000400401000000000ffff0224104a400b2c +:10279000000000001800c29321204000f647400fbf +:1027a000000000001a00c2a31a00c28306004010f5 +:1027b000000000004248400f00000000ffff02241c +:1027c000104a400b000000001900c2931c00c327f0 +:1027d0002120600004000524213040006b48400f98 +:1027e000000000001a00c2a31a00c28306004010b5 +:1027f000000000004248400f00000000ffff0224dc +:10280000104a400b000000001c00c2932118400039 +:102810001d00c29300120200251862001e00c29320 +:1028200000140200251862001f00c2930016020067 +:10283000251862002c00c28f000043ac211000005c +:1028400021e8c0032400bf8f2000be8f2800bd27d1 +:102850000800e00300000000d8ffbd272400bfaf40 +:102860002000beaf21f0a0032800c4af2c00c5afec +:102870002110c0003000c2a7c8ff02241a00c2a362 +:102880001900c0a33000c3970100022405006214a0 +:1028900000000000020002243000c2a70100022450 +:1028a0001900c2a31a00c3933000c2971000a0af52 +:1028b000212060002800c58f213000002138400011 +:1028c0001647400f000000001800c2a31800c28382 +:1028d0000400401000000000ffff0224664a400b85 +:1028e000000000001a00c29321204000f647400f6c +:1028f000000000001800c2a31800c28306004010a8 +:10290000000000004248400f00000000ffff0224ca +:10291000664a400b000000001900c2930e004010f0 +:10292000000000003000c2971c00c3272120600077 +:1029300021284000213000006b48400f00000000bb +:102940001800c2a31c00c3932c00c28f000043a038 +:102950005d4a400b000000003000c2972c00c48f7d +:1029600021284000213000006b48400f000000008b +:102970001800c2a31800c283060040100000000027 +:102980004248400f00000000ffff0224664a400b4f +:10299000000000002110000021e8c0032400bf8fc8 +:1029a0002000be8f2800bd270800e00300000000c3 +:1029b000e0ffbd271c00bfaf1800beaf21f0a00391 +:1029c00024e80434d54a400f000000001000c2afd4 +:1029d0001000c38f8fff0224241062001000c2afca +:1029e0001000c28f500042341000c2af24e80434fb +:1029f0001000c58f4b49400f0000000021e8c003c4 +:102a00001c00bf8f1800be8f2000bd270800e00308 +:102a100000000000e0ffbd271c00bfaf1800beafe4 +:102a200021f0a0031400c0afd88080a31400c227f7 +:102a300024e8043421284000c349400f000000006e +:102a40000d0040100000000001000224d88082a385 +:102a50001400c22724e8043421284000c349400f51 +:102a6000000000000400401000000000faff0224f3 +:102a7000c54a400b00000000d88082931800401423 +:102a8000000000001400c38ff3ff02242410620032 +:102a90001400c2af1400c38f8fff02242410620001 +:102aa0001400c2af1400c28f500042341400c2aff1 +:102ab0001400c28f24e80434212840004b49400f01 +:102ac000000000000400401000000000faff022493 +:102ad000c54a400b0000000001000224d88082a3f8 +:102ae000001004241000c22721284000c349400fd1 +:102af000000000000400401000000000faff022463 +:102b0000c54a400b000000006c4a400f0000000066 +:102b10002110000021e8c0031c00bf8f1800be8fe9 +:102b20002000bd270800e00300000000f8ffbd27db +:102b30000400beaf21f0a003d88080a321100000c4 +:102b400021e8c0030400be8f0800bd270800e00391 +:102b500000000000e0ffbd271c00bfaf1800beafa3 +:102b600021f0a0032000c4af2000c48f1000c227b2 +:102b700021284000c349400f000000001000c28f10 +:102b800021e8c0031c00bf8f1800be8f2000bd27a6 +:102b90000800e00300000000f0ffbd270c00beaffe +:102ba00021f0a00380bf033c0068628cc47b027ce0 +:102bb000006862ac80bf023c106840ac80bf033c40 +:102bc0001068628c8452027c106862ac88bf033c3f +:102bd0001011628c070004248420827c101162ace6 +:102be00088bf033c1011628c0408027c101162ac97 +:102bf00080bf033c1068628c01000424847b827ccb +:102c0000106862ac88bf033c4010628c8452027c26 +:102c1000401062ac88bf033c7010628c8452027c0e +:102c2000701062ac80bf033c1068628c8439027cf7 +:102c3000106862ac88bf033c4010628c444a027c3e +:102c4000401062ac88bf033c7010628c444a027c26 +:102c5000701062ac80bf033c1068628c01000424d9 +:102c60000463827c106862ac80bf033c1068628c95 +:102c7000010004248452827c106862ac80bf033c53 +:102c80000068628cc47b027c006862ac0000c0af4c +:102c9000534b400b0000000000a0023c0000c38f1b +:102ca00040190300f002422421106200000040acf1 +:102cb00000a0023c0000c38f40190300f002422430 +:102cc00021106200080040ac00a0033c0000c28f4d +:102cd000f002632440110200211062000c0040ac9d +:102ce00000a0023c0000c38f40190300f002422400 +:102cf00021106200100040ac00a0033c0000c28f15 +:102d0000f00263244011020021106200140040ac64 +:102d100000a0023c0000c38f40190300f0024224cf +:102d200021106200180040ac00a0033c0000c28fdc +:102d3000f002632440110200211062001c0040ac2c +:102d40000000c28f010042240000c2af0000c28f09 +:102d500002004228d0ff40140000000021e8c00318 +:102d60000c00be8f1000bd270800e003000000002b +:102d7000f0ffbd270c00beaf21f0a0031000c4afd0 +:102d80001400c5af1800c6af1c00c7af1000c28f3b +:102d90000300422804004014000000000600022442 +:102da000df4b400b000000002000c28f80180200a3 +:102db000c404023c00b442341a004300f401600031 +:102dc0001018000012100000ffff42240400c2afe0 +:102dd0000000c0af2400c28f0900401000000000b6 +:102de0000100032407004314000000000000c28f0c +:102df000010042340000c2af814b400b00000000d4 +:102e00000000000000a0033c1000c28ff002632409 +:102e100040110200211062001400c38f1c0043ac5b +:102e20002800c28f010003240600431000000000a8 +:102e30000200032408004310000000009a4b400bde +:102e4000000000000000c28f020042340000c2af48 +:102e50009a4b400b000000000000c28f0400423477 +:102e60000000c2af000000001000c28f060040103a +:102e700000000000010003241e00431000000000b9 +:102e8000d74b400b0000000088bf033c4061628cc0 +:102e9000c418027c406162ac88bf033c6061628cf4 +:102ea00001000424c418827c606162ac0000c38ffe +:102eb00080bf023c006043ac80bf033c0060628c7a +:102ec00001000424c418827c006062ac0400c38f3b +:102ed00080bf023c406043ac80bf033c0060628c1a +:102ee00001000424c47b827c006062acd74b400ba1 +:102ef0000000000088bf033c4061628c4429027cd2 +:102f0000406162ac88bf033c6061628c01000424b4 +:102f10004429827c606162ac0000c38f80bf023ca8 +:102f2000006843ac80bf033c0068628c010004244d +:102f3000c418827c006862ac0400c38f80bf023c6e +:102f4000406843ac80bf033c0068628c01000424ed +:102f5000c47b827c006862ac0000000000a0023ce0 +:102f60001000c38f40190300f002422421106200b8 +:102f700001000324180043ac0100022421e8c0032f +:102f80000c00be8f1000bd270800e0030000000009 +:102f9000d0ffbd272c00bfaf2800beaf21f0a0039b +:102fa0003000c4af3400c5af3800c6af3c00c7af77 +:102fb0003800c28f4019020000a0023cf0024224f7 +:102fc000211062002400c2af2400c28f1800428c7e +:102fd000040040140000000003000224a54c400b34 +:102fe000000000002400c28f1400438c0100022462 +:102ff000040062140000000002000224a54c400bf3 +:10300000000000003400c28f1000c2af1000c28f59 +:1030100002004228030040140000000001000224c6 +:103020001000c2af2400c28f040043242400c28fca +:10303000000043ac2400c28f0000428c1400c2afd9 +:103040002400c28f1000c38f080043ac1800c0af2b +:103050002a4c400b000000003000c28f000043806b +:103060001400c28f000043a01400c28f010042244c +:103070001400c2af3000c28f010042243000c2af42 +:103080003000c38f4000c28f2b104300030040105c +:10309000000000003c00c28f3000c2af1800c28f99 +:1030a000010042241800c2af1800c38f1000c28f65 +:1030b0002a106200e8ff4014000000002400c28fc4 +:1030c00001000324140043ac3800c28f06004010f6 +:1030d000000000000100032439004310000000003c +:1030e000a44c400b0000000088bf023c6010438ce1 +:1030f0000010023c241062000e004010000000008e +:103100002400c28f1c00428c212040001000c58f7b +:10311000c824400f0000000080bf033c1060628c98 +:10312000010004248452827c106062aca44c400be9 +:10313000000000001c00c0af614c400b000000000c +:103140003000c28f000042802118400080bf023c46 +:10315000206043ac3000c28f010042243000c2af77 +:103160000000000080bf023c1060428c0001423031 +:10317000fcff4010000000001c00c28f0100422430 +:103180001c00c2af1c00c38f3400c28f2a10620023 +:10319000ebff4014000000002400c28f140040ac7c +:1031a0002400c28f1c00428c212040001000c58fdb +:1031b000c824400f00000000a44c400b0000000099 +:1031c00088bf023c7010428c000442300e00401058 +:1031d000000000002400c28f1c00428c212040000f +:1031e0001000c58fc824400f0000000080bf033cc2 +:1031f0001068628c010004248452827c106862ace6 +:10320000a44c400b000000002000c0af964c400bc7 +:10321000000000003000c28f0000428021184000f2 +:1032200080bf023c206843ac3000c28f01004224c2 +:103230003000c2af0000000080bf023c1068428c2a +:1032400000014230fcff4010000000002000c28f4f +:10325000010042242000c2af2000c38f3400c28f7f +:103260002a106200ebff4014000000002400c28f0f +:10327000140040ac2400c28f1c00428c212040006e +:103280001000c58fc824400f00000000000000009f +:103290000100022421e8c0032c00bf8f2800be8f4c +:1032a0003000bd270800e00300000000f0ffbd274c +:1032b0000c00beaf21f0a0031000c4af1400c5afd6 +:1032c0001800c6af0000c0afd14c400b000000009a +:1032d00088bf023ca060428c4003427cff00423029 +:1032e00027100200ff00423001004230ff0044304e +:1032f00088bf033ca060628c446b827ca06062ac9f +:103300001000c28f000042802118400080bf023ca4 +:10331000206843ac1000c28f010042241000c2afed +:103320000000000080bf023c1068428c0001423067 +:10333000fcff4010000000000000c28f010042248a +:103340000000c2af0000c38f1400c28f2a106200b9 +:10335000dfff40140000000088bf033ca060628cc7 +:1033600001000424446b827ca06062ac0100022452 +:1033700021e8c0030c00be8f1000bd270800e00349 +:1033800000000000e0ffbd271c00bfaf1800beaf6b +:1033900021f0a00380bf023c1068428c0100423043 +:1033a000280040100000000080bf023c1068428ce2 +:1033b00002004230050040100000000080bf033cc6 +:1033c0001068628c4408027c106862ac1000c0afc8 +:1033d000094d400b0000000080bf023c3068428c69 +:1033e0001400c2a388bf023ca060428c8003427cd0 +:1033f000ff00423027100200ff004230010042303f +:10340000ff00443088bf033ca060628c8473827ce0 +:10341000a06062ac1400c29321204000a468400f59 +:103420000000000080bf023c1068428c0100423066 +:1034300004004010000000001000c28fe6ff40189a +:103440000000000021e8c0031c00bf8f1800be8fe1 +:103450002000bd270800e0030000000000e85d41f7 +:1034600000701a4000601b40c8ffbd273400bbaf8e +:1034700044781b7c001c7b3700609b402400bfaf5e +:103480002000beaf121000002c00a2af10180000e8 +:103490002800a3af21f0a00300a0023cf0024224c8 +:1034a0001400c2af88bf023c3010438c0010023cb5 +:1034b000241062002e0040100000000088bf023c73 +:1034c0006010438c0010023c241062002800401061 +:1034d0000000000088bf033c3010628c04e7027ccf +:1034e000301062ac1400c28f0800428c09004014f6 +:1034f0000000000080bf033c1060628c8452027c9c +:10350000106062ac1400c28f140040ac5c4d400be4 +:10351000000000001400c28f0000428c00004380b5 +:103520002120600080bf033c206064ac0100432484 +:103530001400c28f000043ac1400c28f0800428cfc +:10354000ffff43241400c28f080043ac80bf023c3d +:103550001060428c00024230050040140000000060 +:103560001400c28f0800428ceaff401400000000e3 +:1035700088bf023c3010438c0008023c24106200db +:10358000390040100000000088bf023c6010438cee +:103590000008023c241062003300401000000000cc +:1035a00088bf033c3010628cc4de027c301062acf9 +:1035b00080bf023c1060428c020042300f0040107d +:1035c0000000000080bf033c1060628c4408027c55 +:1035d000106062ac88bf033c3010628cc4de027c99 +:1035e000301062ac029d023c60414424578f400f72 +:1035f000000000009a4d400b000000001000c0af1a +:103600008d4d400b0000000080bf023c3060428cba +:103610001800c2a31000c38f8c8182272110620082 +:103620001800c393000043a01000c28f0100422481 +:103630001000c2af80bf023c1060428c01004230db +:10364000f1ff4014000000001400c28f1c00438ce6 +:103650008c81822721206000212840001000c68f25 +:103660006622400f0000000021e8c0032c00a28f5a +:10367000130040002800a38f110060002400bf8fba +:103680002000be8f3400bb8f3800bd2700e8dd412d +:1036900000609b401800004200e85d4100701a4045 +:1036a00000601b40c8ffbd273400bbaf44781b7cc3 +:1036b000001c7b3700609b402400bfaf2000beafe2 +:1036c000121000002c00a2af101800002800a3afb9 +:1036d00021f0a00300a0023c100342241400c2af5a +:1036e00088bf023c4010428c000442302d00401044 +:1036f0000000000088bf023c7010428c0004423081 +:10370000280040100000000088bf033c4010628c7d +:103710008452027c401062ac1400c28f0800428cbc +:10372000090040140000000080bf033c1068628c58 +:103730008452027c106862ac1400c28f140040ac4a +:10374000e94d400b000000001400c28f0000428cc5 +:10375000000043802120600080bf033c206864acef +:10376000010043241400c28f000043ac1400c28f38 +:103770000800428cffff43241400c28f080043acb2 +:1037800080bf023c1068428c0002423005004014a9 +:10379000000000001400c28f0800428ceaff4014b1 +:1037a0000000000088bf023c4010428c0002423002 +:1037b000350040100000000088bf023c7010428cb1 +:1037c00000024230300040100000000088bf033c7f +:1037d0004010628c444a027c401062ac80bf023cc4 +:1037e0001068428c020042300b00401000000000c4 +:1037f00080bf033c1068628c4408027c106862ac95 +:1038000088bf033c4010628c444a027c401062ac8a +:10381000224e400b000000001000c0af144e400bc1 +:103820000000000080bf023c3068428c1800c2a338 +:103830001000c38f8d818227211062001800c3936e +:10384000000043a01000c28f010042241000c2af4c +:1038500080bf023c1068428c01004230f1ff4014ee +:10386000000000001400c28f1c00438c8c81822752 +:103870000100422421206000212840001000c68f52 +:103880006622400f0000000021e8c0032c00a28f38 +:10389000130040002800a38f110060002400bf8f98 +:1038a0002000be8f3400bb8f3800bd2700e8dd410b +:1038b00000609b4018000042f8ffbd270400beaf27 +:1038c00021f0a00380bf033c0060628cc47b027cbb +:1038d000006062ac80bf033c1060628c8452027c4a +:1038e000106062ac88bf033c6010628c04e7027c0d +:1038f000601062ac88bf033c3010628c04e7027c2d +:10390000301062ac88bf033c6010628c010004245c +:1039100004e7827c601062ac88bf033c6010628c5c +:10392000c4de027c601062ac88bf033c6010628c15 +:10393000c4de027c601062ac88bf033c3010628c35 +:10394000c4de027c301062ac88bf033c6010628c25 +:1039500001000424c4de827c601062ac80bf033ca2 +:103960001060628c010004240463827c106062aced +:1039700000a0023c00a0033cf4026324f00243ac2c +:1039800000a0023cf00242240c0040ac00a0023c2b +:10399000f0024224140040ac80bf033c0060628c03 +:1039a00001000424c47b827c006062ac21e8c00377 +:1039b0000400be8f0800bd270800e00300000000df +:1039c000f8ffbd270400beaf21f0a00380bf033c79 +:1039d0000068628cc47b027c006862ac80bf033ce0 +:1039e0001068628c8452027c106862ac88bf033c11 +:1039f0007010628c8452027c701062ac88bf033cf1 +:103a00004010628c8452027c401062ac88bf033c40 +:103a10007010628c010004248452827c701062acad +:103a200088bf033c7010628c444a027c701062ac08 +:103a300088bf033c4010628c444a027c401062ac58 +:103a400088bf033c7010628c444a027c701062ace8 +:103a500080bf033c1068628c010004240463827cf4 +:103a6000106862ac00a0023cf002422400a0033cbb +:103a700014036324200043ac00a0023cf002422463 +:103a80002c0040ac00a0023cf0024224340040acc8 +:103a900080bf033c0068628c01000424c47b827cec +:103aa000006862ac21e8c0030400be8f0800bd2797 +:103ab0000800e00300000000f8ffbd270400beafcf +:103ac00021f0a00321e8c0030400be8f0800bd2739 +:103ad0000800e00300000000e8ffbd271400bfafae +:103ae0001000beaf21f0a00300a0023cf807422462 +:103af000948182af00a0023cf807442421280000f2 +:103b00002c0106245b8c400f0000000000a0023c4a +:103b1000cc064424212800002c0106245b8c400f95 +:103b20000000000000a0023ca00544242128000061 +:103b30002c0106245b8c400f00000000988180afb0 +:103b400021e8c0031400bf8f1000be8f1800bd27ee +:103b50000800e00300000000e8ffbd271400bfaf2d +:103b60001000beaf21f0a0039881828f0a004010a0 +:103b700000000000010003240800431400000000be +:103b8000988180afc52a400f0000000000000000af +:103b9000e74e400b000000000000000021e8c003d9 +:103ba0001400bf8f1000be8f1800bd270800e0036f +:103bb00000000000e0ffbd271c00bfaf1800beaf33 +:103bc00021f0a0032000c4af2400c5af2000c28fa5 +:103bd00015004010000000001000c0af1000c0af82 +:103be000054f400b000000002000c28f00004290f3 +:103bf0002000c38f010063242000c3af21204000b8 +:103c0000104f400f000000001000c28f010042243e +:103c10001000c2af1000c38f2400c28f2a106200b0 +:103c2000f1ff40140000000021e8c0031c00bf8f1a +:103c30001800be8f2000bd270800e0030000000030 +:103c4000e8ffbd271400bfaf1000beaf21f0a003f6 +:103c5000211080001800c2a31800c3930d00022495 +:103c60001d00621400000000029d023c4cd9442457 +:103c70002352400f0000000000a0023cf80742243d +:103c800000004280090040100000000000a0023c3b +:103c9000cc06442400a0023cf80745248e86400f41 +:103ca00000000000644f400f0000000000a0023c34 +:103cb000f8074224948182af00a0023cf807442414 +:103cc000212800002c0106245b8c400f000000001e +:103cd0005e4f400b000000001800c3930800022450 +:103ce00005006210000000001800c3937f0002244a +:103cf00011006214000000001800c283212040005f +:103d00003852400f000000009481838f00a0023cd5 +:103d1000f807422418006210000000009481828f8e +:103d2000ffff4224948182af9481828f000040a0e3 +:103d30005e4f400b000000001800c28321204000ad +:103d40003852400f000000009481838f00a0023c95 +:103d5000240942242b1062000700401000000000dc +:103d60009481828f1800c383000043a09481828fc6 +:103d700001004224948182af21e8c0031400bf8f68 +:103d80001000be8f1800bd270800e00300000000ef +:103d9000b8febd274401bfaf4001beaf21f0a00374 +:103da0002000c22721204000212800001e000624f8 +:103db0005b8c400f000000004000c2272120400023 +:103dc000212800001e0006245b8c400f000000002c +:103dd0006000c22721204000212800001e00062488 +:103de0005b8c400f000000008000c22721204000b3 +:103df000212800001e0006245b8c400f00000000fc +:103e0000a000c22721204000212800001e00062417 +:103e10005b8c400f000000004000c2276000c327f9 +:103e20001000a3af8000c3271400a3afa000c327d6 +:103e30001800a3af00a0033cf8076424029d033cd4 +:103e400050d965242000c32721306000213840006c +:103e5000d08e400f000000002000c227212040002b +:103e6000029d023c60d9452404000624e58d400fe4 +:103e700000000000120040140000000000a0023cfe +:103e8000c83042249c8182af00a0023cc83042244a +:103e900021204000d988400f0000000000a0033c12 +:103ea000c830642421284000982b400f00000000f7 +:103eb0009c81828f308082af1d52400b0000000039 +:103ec0002000c22721204000029d023c68d94524e1 +:103ed00005000624e58d400f000000003700401467 +:103ee000000000004000c22700004280070040148c +:103ef00000000000029d023c70d944242352400f70 +:103f0000000000001d52400b000000004000c227ce +:103f100021204000029d023cacd945240200062429 +:103f2000e58d400f00000000090040140000000073 +:103f3000029d023cb0d944242352400f00000000ef +:103f40004784400f00000000e94f400b00000000d4 +:103f50004000c22721204000029d023cd0d94524c8 +:103f600003000624e58d400f000000000900401406 +:103f700000000000029d023cd4d944242352400f8b +:103f8000000000005b84400f00000000e94f400b80 +:103f900000000000029d023cf4d944242352400f4b +:103fa00000000000029d023c34da44242352400ffa +:103fb000000000001d52400b000000002000c2273e +:103fc00021204000029d023c38da452404000624ea +:103fd000e58d400f0000000080004014000000004c +:103fe0004000c2270000428007004014000000008b +:103ff000029d023c40da44242352400f000000009e +:104000001d52400b000000004000c227212040004c +:10401000029d023cacd9452402000624e58d400fe8 +:10402000000000001500401400000000252b400f88 +:104030000000000021184000010002240900621065 +:1040400000000000029d023c7cda44242352400f11 +:10405000000000000f2a400f000000007150400bcc +:1040600000000000029d023c94da44242352400fd9 +:10407000000000007150400b000000004000c2270b +:1040800021204000029d023cd0d945240300062493 +:10409000e58d400f000000001300401400000000f8 +:1040a000252b400f00000000090040100000000018 +:1040b000029d023cb0da44242352400f000000006d +:1040c00001000224988182af7150400b0000000073 +:1040d000029d023cd8da44242352400f0000000025 +:1040e0007150400b000000004000c227212040001a +:1040f000029d023c04db452406000624e58d400faa +:10410000000000002f00401400000000252b400f8d +:10411000000000000500432c2a0060100000000091 +:1041200080180200019d023c3c41422421106200a3 +:104130000000428c08004000000000005041019d3a +:104140006841019d8041019d9841019db041019dc3 +:10415000029d023c0cdb44242352400f000000006f +:104160007150400b00000000029d023c20db442403 +:104170002352400f000000007150400b000000006f +:10418000029d023c30db44242352400f000000001b +:104190007150400b00000000029d023c44db4424af +:1041a0002352400f000000007150400b000000003f +:1041b000029d023c50db44242352400f00000000cb +:1041c00000000000029d023c34da44242352400fd8 +:1041d000000000001d52400b000000002000c2271c +:1041e00021204000029d023c68db45240700062494 +:1041f000e58d400f00000000910040140000000019 +:104200004000c227000042802d0040140000000042 +:10421000d17f400f00000000c000c32721206000b4 +:10422000029d033c70db652421304000568e400f18 +:1042300000000000029d023c74db44242352400f26 +:1042400000000000c000c227212040002352400f80 +:1042500000000000029d023c34da44242352400f47 +:1042600000000000eb7f400f00000000d000c327db +:1042700021206000029d033c88db65242130400042 +:10428000568e400f00000000029d023c8cdb44244f +:104290002352400f00000000d000c2272120400020 +:1042a0002352400f00000000029d023ca8db442482 +:1042b0002352400f000000001d52400b0000000080 +:1042c0004000c22721204000029d023cacdb452477 +:1042d00007000624e58d400f000000001800401480 +:1042e00000000000d17f400f00000000e000c32765 +:1042f00021206000029d033c70db652421304000da +:10430000568e400f00000000029d023c74db4424e6 +:104310002352400f00000000e000c227212040008f +:104320002352400f00000000029d023c34da442476 +:104330002352400f000000000a51400b0000000013 +:104340004000c22721204000029d023cb4db4524ee +:1043500007000624e58d400f0000000018004014ff +:1043600000000000eb7f400f00000000f000c327ba +:1043700021206000029d033c88db65242130400041 +:10438000568e400f00000000029d023c8cdb44244e +:104390002352400f00000000f000c22721204000ff +:1043a0002352400f00000000029d023ca8db442481 +:1043b0002352400f000000000a51400b0000000093 +:1043c0004000c22721204000029d023cbcdb452466 +:1043d00003000624e58d400f000000001200401489 +:1043e00000000000f47f400f000000000001c32720 +:1043f00021206000029d033c88db652421304000c1 +:10440000568e400f00000000029d023cc0db442499 +:104410002352400f00000000029d023cd0db4424e8 +:104420002352400f00000000029d023c34da442475 +:104430002352400f000000001d52400b00000000fe +:104440002000c22721204000029d023c04db4524bd +:1044500006000624e58d400f00000000a200401475 +:1044600000000000029d023cd4db44242352400f94 +:10447000000000006f84400f00000000070040149f +:1044800000000000029d023ce8db44242352400f60 +:10449000000000003751400b000000006f84400f07 +:1044a00000000000211840000100022407006214ef +:1044b00000000000029d023c04dc44242352400f13 +:1044c000000000003751400b00000000029d023c3c +:1044d00020dc44242352400f00000000252b400f15 +:1044e000000000000100032416004310000000003b +:1044f0000200432805006010000000000b0040107f +:10450000000000006351400b000000000200032483 +:1045100012004310000000000300032415004310a4 +:10452000000000006351400b00000000029d023caf +:1045300040dc44242352400f000000006851400b2f +:1045400000000000029d023c5cdc44242352400f2a +:10455000000000006851400b00000000029d023c7a +:1045600074dc44242352400f000000006851400bcb +:1045700000000000029d023c90dc44242352400fc6 +:10458000000000006851400b00000000029d023c4a +:10459000b4dc44242352400f00000000000000005f +:1045a0001001c22721204000212800000f0006240e +:1045b0005b8c400f00000000d17f400f0000000026 +:1045c0001001c32721206000029d033cccdc652440 +:1045d00021304000568e400f00000000029d023c3a +:1045e00074db44242352400f000000001001c22756 +:1045f000212040002352400f00000000029d023c99 +:10460000d4dc44242352400f000000002001c227c4 +:1046100021204000212800000f0006245b8c400f61 +:1046200000000000eb7f400f000000002001c327c6 +:1046300021206000029d033cd8dc6524213040002d +:10464000568e400f00000000029d023c8cdb44248b +:104650002352400f000000002001c227212040000b +:104660002352400f0000000064000424a161400fa9 +:10467000000000003001c227212040002128000056 +:104680000f0006245b8c400f00000000f47f400ff9 +:10469000000000003001c32721206000029d033c80 +:1046a000e0dc652421304000568e400f0000000001 +:1046b000029d023cc0db44242352400f0000000056 +:1046c0003001c227212040002352400f000000008b +:1046d000029d023c34da44242352400f00000000c3 +:1046e0001d52400b000000002000c2272120400086 +:1046f000029d023ce8dc45240a000624e58d400fbb +:10470000000000004a004014000000004000c227e2 +:10471000000042800700401400000000029d023c9f +:10472000f4dc44242352400f000000001d52400bd3 +:10473000000000004000c22721204000029d023cf2 +:1047400034dd452405000624e58d400f00000000ff +:1047500009004014000000007530400f0000000008 +:10476000029d023c3cdd44242352400f0000000027 +:104770001d52400b000000004000c22721204000d5 +:10478000029d023c54dd452404000624e58d400fc3 +:10479000000000000900401400000000029d023cdf +:1047a0005cdd44242352400f000000008530400fa0 +:1047b000000000001d52400b000000004000c22716 +:1047c00021204000029d023c04db45240600062413 +:1047d000e58d400f0000000026004014000000009e +:1047e0004b2d400f000000000700401000000000ab +:1047f000029d023c78dd44242352400f000000005b +:104800001d52400b000000004b2d400f0000000027 +:104810001800401000000000029d023c98dd442476 +:104820002352400f000000001d52400b000000000a +:104830002000c22721204000d988400f000000003e +:104840002000c32721206000029d033cbcdd6524bd +:1048500021304000e58d400f0000000005004010b1 +:1048600000000000029d023cc4dd44242352400f9e +:104870000000000021e8c0034401bf8f4001be8f4b +:104880004801bd270800e00300000000e0ffbd274d +:104890001c00bfaf1800beaf1400b0af21f0a003e2 +:1048a0002000c4af2000d08f2000c48fd988400fd3 +:1048b000000000002120000221284000982b400f1a +:1048c0000000000021e8c0031c00bf8f1800be8f4d +:1048d0001400b08f2000bd270800e0030000000096 +:1048e000e8ffbd271400bfaf1000beaf21f0a0034a +:1048f000211080001800c2a31800c293212040009c +:10490000ba2b400f0000000021e8c0031400bf8f45 +:104910001000be8f1800bd270800e0030000000053 +:10492000f8ffbd270400beaf21f0a00321e8c003bb +:104930000400be8f0800bd270800e003000000004f +:10494000e0ffbd271c00beaf21f0a00388bf033ce1 +:104950002061628c01000424c418827c206162ac56 +:10496000c404023c00b442340000c2af7d01023cea +:10497000407842340400c2af0400c28f40100200ed +:104980000000c38f1b006200f401400010180000fb +:10499000121000000800c2af0400c28f40100200d5 +:1049a0000000c38f1b006200f401400010100000e3 +:1049b00004004010000000000800c28f01004224e3 +:1049c0000800c2af0800c28f0101422c030040144e +:1049d00000000000000102240800c2af0800c28fde +:1049e00004004010000000000800c28fffff4224b6 +:1049f0000800c2af0800c28fff004230d98182a3f5 +:104a0000c404023c00b442340c00c2af1602023ca3 +:104a1000c00e42341000c2af1000c28f401002001e +:104a20000c00c38f1b006200f4014000101800004e +:104a3000121000001400c2af1000c28f401002001c +:104a40000c00c38f1b006200f40140001010000036 +:104a500004004010000000001400c28f0100422436 +:104a60001400c2af1400c28f0101422c0300401495 +:104a700000000000000102241400c2af1400c28f25 +:104a800004004010000000001400c28fffff422409 +:104a90001400c2af1400c28fff004230d88182a33d +:104aa00021e8c0031c00be8f2000bd270800e003e2 +:104ab00000000000e8ffbd271400bfaf1000beaf2c +:104ac00021f0a0033b53400f0000000021184000dc +:104ad000010002242000621400000000e152400f97 +:104ae0000000000088bf033c2061628cc418027c77 +:104af000206162acd8818293010004242128400007 +:104b0000208e400f00000000d881829321200000f9 +:104b100021284000208e400f0000000088bf033c89 +:104b20002061628c01000424c418827c206162ac84 +:104b300001000424fa52400f00000000029d023cd4 +:104b4000e02f4424578f400f000000000100022492 +:104b5000db52400b00000000029d023cf82f442471 +:104b6000578f400f000000002110000021e8c00313 +:104b70001400bf8f1000be8f1800bd270800e0038f +:104b800000000000e8ffbd271400bfaf1000beaf5b +:104b900021f0a00388bf033c2061628cc418027c12 +:104ba000206162acd8818293060004242128400051 +:104bb000208e400f0000000088bf033c2061628c03 +:104bc00001000424c418827c206162ac010002242c +:104bd00021e8c0031400bf8f1000be8f1800bd274e +:104be0000800e00300000000e0ffbd271c00bfaf8d +:104bf0001800beaf21f0a0032000c4af88bf033c63 +:104c00002061628cc418027c206162acd9818293dd +:104c10000500042421284000208e400f00000000e1 +:104c20001000c2a3d98182932120000021284000d6 +:104c3000208e400f000000001000c2a388bf033c7c +:104c40002061628c01000424c418827c206162ac63 +:104c50002000c28f07004010000000001000c29327 +:104c6000029d033c1830642421284000688f400fc7 +:104c7000000000001000c29321e8c0031c00bf8f99 +:104c80001800be8f2000bd270800e00300000000d0 +:104c9000e0ffbd271c00bfaf1800beaf21f0a0038e +:104ca00021200000fa52400f000000001000c2a3b3 +:104cb0001000c29301004230ff0042300400401057 +:104cc00000000000010002243553400b00000000ea +:104cd0002110000021e8c0031c00bf8f1800be8f08 +:104ce0002000bd270800e00300000000e0ffbd2712 +:104cf0001c00bfaf1800beaf21f0a00388bf033c6b +:104d00002061628cc418027c206162acd9818293dc +:104d10009000042421284000208e400f0000000055 +:104d2000d98182932120000021284000208e400f4d +:104d300000000000d981829321200000212840003a +:104d4000208e400f00000000d981829321200000b6 +:104d500021284000208e400f00000000d98182935e +:104d60002120000021284000208e400f000000007c +:104d70001000c2a3d9818293212000002128400085 +:104d8000208e400f000000001100c2a388bf033c2a +:104d90002061628c01000424c418827c206162ac12 +:104da0001000c393bf00022405006214000000003d +:104db0001100c393410002240c00621000000000a7 +:104dc0001000c3931100c293029d043c3830842428 +:104dd0002128600021304000688f400f0000000053 +:104de000211000008453400b000000001000c3930a +:104df0001100c293029d043c743084242128600079 +:104e000021304000688f400f0000000001000224a4 +:104e100021e8c0031c00bf8f1800be8f2000bd27f3 +:104e20000800e00300000000e0ffbd271c00bfaf4a +:104e30001800beaf21f0a0032000c4af2400c5af0e +:104e40002800c6af2800c38f2400c28f2110620043 +:104e5000ffff43242000023c2a106200040040149b +:104e60000000000021100000e453400b000000008f +:104e700088bf033c2061628cc418027c206162ac54 +:104e8000d98182930b00042421284000208e400ffa +:104e9000000000002800c38fff00023c24106200c5 +:104ea00003140200ff00423021184000d881829391 +:104eb0002120600021284000208e400f00000000cb +:104ec0002800c28f00ff423003120200ff00423070 +:104ed00021184000d88182932120600021284000c1 +:104ee000208e400f000000002800c28fff004230db +:104ef00021184000d88182932120600021284000a1 +:104f0000208e400f00000000d881829321200000f5 +:104f100021284000208e400f000000001000c0af8c +:104f2000d953400b00000000d8818293de00042496 +:104f300021284000208e400f000000001400c2a372 +:104f40002000c28f1400c393000043a02000c28f32 +:104f5000010042242000c2af1000c28f0100422491 +:104f60001000c2af1000c38f2400c28f2a1062004d +:104f7000edff40140000000088bf033c2061628cfc +:104f800001000424c418827c206162ac0100022468 +:104f900021e8c0031c00bf8f1800be8f2000bd2772 +:104fa0000800e00300000000e8ffbd271400bfafc9 +:104fb0001000beaf21f0a0031800c4af1800c28fcc +:104fc000ff0f4230040040100000000021100000dc +:104fd0002e54400b00000000e152400f0000000082 +:104fe00088bf033c2061628cc418027c206162ace3 +:104ff000d88182932000042421284000208e400f75 +:10500000000000001800c38fff00023c2410620063 +:1050100003140200ff00423021184000d88182931f +:105020002120600021284000208e400f0000000059 +:105030001800c28f00ff423003120200ff0042300e +:1050400021184000d881829321206000212840004f +:10505000208e400f000000001800c28fff00423079 +:1050600021184000d881829321206000212840002f +:10507000208e400f0000000088bf033c2061628c3e +:1050800001000424c418827c206162ac1800c28f25 +:10509000010042241800c2af000000002453400f5a +:1050a000000000002118400001000224fbff6210f4 +:1050b000000000000100022421e8c0031400bf8f9b +:1050c0001000be8f1800bd270800e003000000009c +:1050d000e8ffbd271400bfaf1000beaf21f0a00352 +:1050e0001800c4af1c00c5af1800c28fffff4230cc +:1050f0000400401000000000211000008354400b09 +:10510000000000001800c38fffff02342118620066 +:105110002000023c2a10620004004014000000003d +:10512000211000008354400b00000000e152400faa +:105130000000000088bf033c2061628cc418027c20 +:10514000206162acd8818293d800042421284000d9 +:10515000208e400f000000001800c38fff00023cab +:105160002410620003140200ff00423021184000a6 +:10517000d88182932120600021284000208e400f9a +:10518000000000001800c28f00ff4230031202002e +:10519000ff00423021184000d88182932120600016 +:1051a00021284000208e400f000000001800c28f10 +:1051b000ff00423021184000d881829321206000f6 +:1051c00021284000208e400f0000000088bf033cd3 +:1051d0002061628c01000424c418827c206162acce +:1051e0001c00c28f080040100000000000000000fa +:1051f0002453400f00000000211840000100022449 +:10520000fbff6210000000000100022421e8c0033f +:105210001400bf8f1000be8f1800bd270800e003e8 +:1052200000000000d8ffbd272400bfaf2000beafa4 +:1052300021f0a0032800c4af2c00c5af2800c28f06 +:10524000ff0f423004004010000000002110000059 +:10525000f254400b000000002c00c38f0100022418 +:1052600004006214000000002800c48fea53400fbd +:105270000000000000a0023c501d42241000c2affc +:105280001400c0afed54400b000000001000c28fae +:10529000000042901800c2a3e152400f000000003d +:1052a0002800c38fff00023c241062000314020098 +:1052b0001900c2a32800c28f00ff4230031202006f +:1052c0001a00c2a32800c28f1b00c2a31c00c0afdb +:1052d00088bf033c2061628cc418027c206162acf0 +:1052e000d88182930200042421284000208e400fa0 +:1052f000000000001900c29321184000d881829359 +:105300002120600021284000208e400f0000000076 +:105310001a00c29321184000d88182932120600096 +:1053200021284000208e400f000000001b00c29387 +:1053300021184000d881829321206000212840005c +:10534000208e400f000000001800c393d881829384 +:105350002120600021284000208e400f0000000026 +:1053600088bf033c2061628c01000424c418827c45 +:10537000206162ac1000c28f010042241000c2af55 +:105380002800c28f010042242800c2af00000000a4 +:105390002453400f000000002118400001000224a7 +:1053a000fbff6210000000001400c28f01004224c5 +:1053b0001400c2af1400c28f00104228b3ff401483 +:1053c000000000000100022421e8c0032400bf8f78 +:1053d0002000be8f2800bd270800e0030000000069 +:1053e000e8ffbd271400bfaf1000beaf21f0a0033f +:1053f0001800c4af2110a0002000c6af1c00c2a33b +:105400001800c38f2000023c2b10620004004014df +:1054100000000000211000004755400b0000000074 +:10542000e152400f0000000088bf033c2061628c05 +:10543000c418027c206162acd881829302000424eb +:1054400021284000208e400f000000001800c38f6c +:10545000ff00023c2410620002140200ff004230f0 +:1054600021184000d881829321206000212840002b +:10547000208e400f000000001800c28f00ff423055 +:1054800002120200ff00423021184000d8818293ae +:105490002120600021284000208e400f00000000e5 +:1054a0001800c28fff00423021184000d88182933b +:1054b0002120600021284000208e400f00000000c5 +:1054c0001c00c29321184000d881829321206000e3 +:1054d00021284000208e400f0000000088bf033cc0 +:1054e0002061628c01000424c418827c206162acbb +:1054f0002000c28f080040100000000000000000e3 +:105500002453400f00000000211840000100022435 +:10551000fbff6210000000000100022421e8c0032c +:105520001400bf8f1000be8f1800bd270800e003d5 +:1055300000000000c8ffbd273400bfaf3000beaf81 +:1055400021f0a0033800c4af3c00c5af4000c6af97 +:105550001c00c0af4000c38f3c00c28f211062000e +:105560002000c2af4000c28f1000c2af3800c28f0f +:105570001400c2af2000c38f2000023c2a1062003a +:105580004c0040140000000021100000b155400bf9 +:10559000000000001000c28fff0f432400004428c9 +:1055a0000b10640003130200001302002400c2afba +:1055b00000a0023c501d4424001005242400c68f86 +:1055c0008a53400f0000000021184000010002240f +:1055d000040062100000000021100000b155400bd3 +:1055e0000000000000a0023c501d43241000c48fa6 +:1055f0002400c28f23108200211062001800c2af65 +:105600002800c0afaa55400b000000001400c28f54 +:10561000000043801800c28f000043a01800c28f12 +:10562000010042241800c2af1400c28f01004224be +:105630001400c2af1000c28f010042241000c2af9c +:105640001000c38f2000c28f0b0062140000000006 +:10565000010002242800c2af010002241c00c2afd6 +:105660002400c48f010005248954400f000000006d +:10567000ad55400b000000001000c28fff0f4230fc +:105680000900401400000000010002242800c2affd +:105690002400c48f010005248954400f000000003d +:1056a000ad55400b000000002800c28fd7ff40100e +:1056b000000000001c00c28fb6ff40100000000078 +:1056c0000100022421e8c0033400bf8f3000be8fe8 +:1056d0003800bd270800e00300000000f8ffbd27e8 +:1056e0000400beaf21f0a003211080000800c2a773 +:1056f0000800c28700ff423003120200201e027c15 +:105700000800c297001202002016027c25106200d9 +:105710002016027c21e8c0030400be8f0800bd27cc +:105720000800e00300000000f8ffbd270400beaf42 +:1057300021f0a0030800c4af0800c28f021e0200bf +:105740000800c48fff00023c2410820003120200f4 +:10575000251862000800c28f00ff423000120200cc +:10576000251862000800c28f001602002510620092 +:1057700021e8c0030400be8f0800bd270800e00335 +:1057800000000000d8ffbd272400bfaf2000beaf3f +:1057900021f0a0032800c4af2c00c5af3000c6af75 +:1057a0001000c0af1400c22721204000029d023c1f +:1057b000e0ee45242c00c68f568e400f00000000fe +:1057c0002c00c28f0f00422c1f0040100000000070 +:1057d0001000c0afff55400b000000001000c28f4a +:1057e0002800c38f2110620030000324000043a072 +:1057f0001000c28f010042241000c2af3000c28fdf +:10580000ffff43241000c28f2a104300f3ff40140f +:10581000000000001000c28f2800c38f212062000a +:105820003000c38f1000c28f231062001400c32702 +:1058300021286000213040007f88400f00000000d8 +:10584000e356400b000000002c00c28fff00422cea +:105850001f004010000000001000c0af2156400b98 +:10586000000000001000c28f2800c38f21106200ca +:1058700030000324000043a01000c28f0100422426 +:105880001000c2af3000c28ffeff43241000c28f51 +:105890002a104300f3ff4014000000001000c28fe4 +:1058a0002800c38f212062003000c38f1000c28ff8 +:1058b000231062001400c32721286000213040001b +:1058c0007f88400f00000000e356400b00000000fe +:1058d0002c00c28fff0f422c1f0040100000000060 +:1058e0001000c0af4356400b000000001000c28ff4 +:1058f0002800c38f2110620030000324000043a061 +:105900001000c28f010042241000c2af3000c28fcd +:10591000fdff43241000c28f2a104300f3ff401400 +:10592000000000001000c28f2800c38f21206200f9 +:105930003000c38f1000c28f231062001400c327f1 +:1059400021286000213040007f88400f00000000c7 +:10595000e356400b000000002c00c38fffff023411 +:105960002b1062001f004010000000001000c0afac +:105970006656400b000000001000c28f2800c38f45 +:105980002110620030000324000043a01000c28fe9 +:10599000010042241000c2af3000c28ffcff43243c +:1059a0001000c28f2a104300f3ff401400000000d3 +:1059b0001000c28f2800c38f212062003000c38fe7 +:1059c0001000c28f231062001400c327212860003a +:1059d000213040007f88400f00000000e356400b5c +:1059e000000000002c00c38f0f00023cffff423478 +:1059f0002b1062001f004010000000001000c0af1c +:105a00008a56400b000000001000c28f2800c38f90 +:105a10002110620030000324000043a01000c28f58 +:105a2000010042241000c2af3000c28ffbff4324ac +:105a30001000c28f2a104300f3ff40140000000042 +:105a40001000c28f2800c38f212062003000c38f56 +:105a50001000c28f231062001400c32721286000a9 +:105a6000213040007f88400f00000000e356400bcb +:105a7000000000002c00c38fff00023cffff4234f7 +:105a80002b1062001f004010000000001000c0af8b +:105a9000ae56400b000000001000c28f2800c38fdc +:105aa0002110620030000324000043a01000c28fc8 +:105ab000010042241000c2af3000c28ffaff43241d +:105ac0001000c28f2a104300f3ff401400000000b2 +:105ad0001000c28f2800c38f212062003000c38fc6 +:105ae0001000c28f231062001400c3272128600019 +:105af000213040007f88400f00000000e356400b3b +:105b0000000000002c00c38fff0f023cffff423457 +:105b10002b1062001d004010000000001000c0affc +:105b2000d256400b000000001000c28f2800c38f27 +:105b30002110620030000324000043a01000c28f37 +:105b4000010042241000c2af3000c28ff9ff43248d +:105b50001000c28f2a104300f3ff40140000000021 +:105b60001000c28f2800c38f212062003000c38f35 +:105b70001000c28f231062001400c3272128600088 +:105b8000213040007f88400f000000000100022407 +:105b900021e8c0032400bf8f2000be8f2800bd274e +:105ba0000800e00300000000d8ffbd272400bfafbd +:105bb0002000beaf21f0a0032800c4af2c00c5af69 +:105bc0001000c0af1400c22721204000029d023cfb +:105bd000e0ee45242c00c68f568e400f00000000da +:105be0002c00c28f0f00422c070040100000000064 +:105bf0001400c3832800c28f000043a001000224c8 +:105c0000b957400b000000002c00c28fff00422c4f +:105c100016004010000000001000c0af1457400be9 +:105c2000000000001000c28f2800c38f2110620006 +:105c30001000c38f1000c427211883000400638064 +:105c4000000043a01000c28f010042241000c2af28 +:105c50001000c28f02004228f2ff40140000000032 +:105c600002000224b957400b000000002c00c28f34 +:105c7000ff0f422c16004010000000001000c0afc3 +:105c80002d57400b000000001000c28f2800c38f6a +:105c9000211062001000c38f1000c4272118830058 +:105ca00004006380000043a01000c28f0100422462 +:105cb0001000c2af1000c28f03004228f2ff401450 +:105cc0000000000003000224b957400b0000000050 +:105cd0002c00c38fffff02342b106200160040100f +:105ce000000000001000c0af4757400b000000004c +:105cf0001000c28f2800c38f211062001000c38fd4 +:105d00001000c4272118830004006380000043a012 +:105d10001000c28f010042241000c2af1000c28fd9 +:105d200004004228f2ff4014000000000400022496 +:105d3000b957400b000000002c00c38f0f00023c3d +:105d4000ffff42342b1062001600401000000000dc +:105d50001000c0af6257400b000000001000c28f5f +:105d60002800c38f211062001000c38f1000c427c9 +:105d70002118830004006380000043a01000c28f3c +:105d8000010042241000c2af1000c28f050042285b +:105d9000f2ff40140000000005000224b957400b38 +:105da000000000002c00c38fff00023cffff4234c4 +:105db0002b10620016004010000000001000c0af61 +:105dc0007d57400b000000001000c28f2800c38fd9 +:105dd000211062001000c38f1000c4272118830017 +:105de00004006380000043a01000c28f0100422421 +:105df0001000c2af1000c28f06004228f2ff40140c +:105e00000000000006000224b957400b000000000b +:105e10002c00c38fff0f023cffff42342b106200a7 +:105e200016004010000000001000c0af9857400b53 +:105e3000000000001000c28f2800c38f21106200f4 +:105e40001000c38f1000c427211883000400638052 +:105e5000000043a01000c28f010042241000c2af16 +:105e60001000c28f07004228f2ff4014000000001b +:105e700007000224b957400b000000002c00c38f1c +:105e8000ffff022416006210000000001000c0afe7 +:105e9000b157400b000000001000c28f2800c38fd4 +:105ea000211062001000c38f1000c4272118830046 +:105eb00004006380000043a01000c28f0100422450 +:105ec0001000c2af1000c28f08004228f2ff401439 +:105ed0000000000008000224b957400b0000000039 +:105ee0002110000021e8c0032400bf8f2000be8fd6 +:105ef0002800bd270800e00300000000e0ffbd27e8 +:105f00001c00bfaf1800beaf21f0a0032000c4af3b +:105f10002110a0002800c6af2400c2a31000c0af0b +:105f20002400c2931400c32721206000029d033c7b +:105f3000e0ee652421304000568e400f0000000046 +:105f40002400c2930f00422c1f00401000000000ec +:105f50001000c0afdf57400b000000001000c28fe0 +:105f60002000c38f2110620030000324000043a0f2 +:105f70001000c28f010042241000c2af2800c28f5f +:105f8000ffff43241000c28f2a104300f3ff401488 +:105f9000000000001000c28f2000c38f212062008b +:105fa0002800c38f1000c28f231062001400c32783 +:105fb00021286000213040007f88400f0000000051 +:105fc0001258400b000000002400c393ff0002247d +:105fd0001d006210000000001000c0af0158400b0f +:105fe000000000001000c28f2000c38f211062004b +:105ff00030000324000043a01000c28f010042249f +:106000001000c2af2800c28ffeff43241000c28fd1 +:106010002a104300f3ff4014000000001000c28f5c +:106020002000c38f212062002800c38f1000c28f80 +:10603000231062001400c327212860002130400093 +:106040007f88400f000000000100022421e8c00307 +:106050001c00bf8f1800be8f2000bd270800e00382 +:1060600000000000e8ffbd271400beaf21f0a00330 +:106070001800c4af1c00c5af2000c6af0000c0af01 +:106080000400c0af0800c0af010002240c00c2af82 +:106090002000c38f100002243600621400000000ac +:1060a0001c00c28fffff42240000c2af5858400bb3 +:1060b000000000001c00c28fffff43240000c28fbd +:1060c00009006214000000000000c28f1800c38f96 +:1060d0002110620000004280d0ff42240800c2afbd +:1060e0005558400b000000000000c28f0400c2aff2 +:1060f0004458400b000000000c00c28f0011020049 +:106100000c00c2af0400c28f010042240400c2afe1 +:106110001c00c28ffeff43240400c28f2a106200bd +:10612000f5ff4010000000000000c28f1800c38f70 +:106130002110620000004280d0ff4224211840005c +:106140000c00c28f021862700800c28f2110430039 +:106150000800c2af0000c28fffff42240000c2afa0 +:106160000000c28fd3ff4104000000008e58400b96 +:10617000000000002000c38f0a0002242e006214d9 +:10618000000000000000c0af8958400b0000000074 +:106190000000c28f0500401400000000010002242e +:1061a0000c00c2af7b58400b000000000400c0afe1 +:1061b0007658400b000000000c00c28f4010020017 +:1061c00080180200211043000c00c2af0400c28fef +:1061d000010042240400c2af0400c38f0000c28f3c +:1061e0002a106200f4ff4014000000000000c28f7b +:1061f0001800c38f2110620000004280d0ff4224ab +:10620000211840000c00c28f021862700800c28f73 +:10621000211043000800c2af0000c28f01004224d9 +:106220000000c2af0000c38f1c00c28f2a106200a2 +:10623000d7ff4014000000000800c28f21e8c0030f +:106240001400be8f1800bd270800e0030000000006 +:10625000e0ffbd271c00bfaf1800beaf21f0a003b8 +:106260002000c4af2110a0002400c2a32400c293c8 +:106270001000c32721206000029d033ce0ee65244e +:1062800021304000568e400f000000002400c293d1 +:106290000f00422c07004010000000001000c383d4 +:1062a0002000c28f000043a001000224bc58400b14 +:1062b000000000002400c393ff0002240b006210c2 +:1062c000000000001000c3832000c28f000043a024 +:1062d0002000c28f010042241100c383000043a0ac +:1062e00002000224bc58400b0000000021100000f6 +:1062f00021e8c0031c00bf8f1800be8f2000bd27ff +:106300000800e00300000000e8ffbd271400beaf56 +:1063100021f0a0031800c4af1c00c5af0400c0af3b +:106320000000c0afdd58400b00000000029d023ca1 +:106330000400c38f80180300e4ee422421106200a1 +:106340000000428c0800c2af0000c28f1800c38f4b +:106350002110620000004280211840000800c28f16 +:10636000261062000400c2af0000c28f0100422468 +:106370000000c2af0000c38f1c00c28f2a10620051 +:10638000eaff4014000000000400c28f21e8c003af +:106390001400be8f1800bd270800e00300000000b5 +:1063a000f8ffbd270400beaf21f0a0030800c4af72 +:1063b00021e8c0030400be8f0800bd270800e003e9 +:1063c00000000000e8ffbd271400bfaf1000beaf03 +:1063d00021f0a0036e5a400f0000000021e8c00326 +:1063e0001400bf8f1000be8f1800bd270800e00307 +:1063f00000000000e8ffbd271400bfaf1000beafd3 +:1064000021f0a003211080001800c2a3788082939d +:106410000f00432c3d0160100000000080180200b6 +:10642000019d023c38644224211062000000428c2d +:1064300008004000000000007464019d9c64019d00 +:106440000465019d6c65019dd465019d4066019dbb +:106450007466019da866019df066019d3867019de7 +:10646000bc67019d1c68019d3468019d6068019da9 +:106470008c68019d388180af408180af488180a3c6 +:10648000448180af01000224788082a3ffff0224b0 +:10649000748082af495a400b000000003481828f23 +:1064a00000120200348182af1800c3933481828fbe +:1064b00021106200348182af7480838f1800c293f0 +:1064c0002120600021284000ea82400f00000000e7 +:1064d000748082af1800c393de00022405006214aa +:1064e0000000000002000224788082a3495a400b79 +:1064f000000000006e5a400f00000000495a400b97 +:10650000000000003481828f00120200348182afcb +:106510001800c3933481828f21106200348182afce +:106520007480838f1800c2932120600021284000ce +:10653000ea82400f00000000748082af1800c3930d +:10654000ad000224050062140000000003000224d4 +:10655000788082a3495a400b000000006e5a400f19 +:1065600000000000495a400b000000003481828f77 +:1065700000120200348182af1800c3933481828fed +:1065800021106200348182af7480838f1800c2931f +:106590002120600021284000ea82400f0000000016 +:1065a000748082af1800c393be00022405006214f9 +:1065b0000000000004000224788082a3495a400ba6 +:1065c000000000006e5a400f00000000495a400bc6 +:1065d000000000003481828f00120200348182affb +:1065e0001800c3933481828f21106200348182affe +:1065f0007480838f1800c2932120600021284000fe +:10660000ea82400f00000000748082af3481838fe3 +:10661000adde023cefbe4234050062100000000017 +:106620006e5a400f00000000495a400b0000000065 +:1066300005000224788082a3495a400b0000000024 +:106640001800c293488182a306000224788082a3a6 +:106650007480838f1800c29321206000212840009d +:10666000ea82400f00000000748082af495a400b5c +:10667000000000001800c293388182af0700022496 +:10668000788082a37480838f1800c29321206000d9 +:1066900021284000ea82400f00000000748082af91 +:1066a000495a400b000000003881828f001202001e +:1066b000388182af1800c3933881828f2110620025 +:1066c000388182af7480838f1800c29321206000cc +:1066d00021284000ea82400f00000000748082af51 +:1066e00008000224788082a3495a400b0000000071 +:1066f0003881828f00120200388182af1800c39364 +:106700003881828f21106200388182af7480838f3c +:106710001800c2932120600021284000ea82400f27 +:1067200000000000748082af09000224788082a3f8 +:10673000495a400b000000003881828f001202008d +:10674000388182af1800c3933881828f2110620094 +:10675000388182af7480838f1800c293212060003b +:1067600021284000ea82400f00000000748082afc0 +:106770003881828f9f00422c0500401400000000e9 +:106780006e5a400f00000000495a400b0000000004 +:106790003881828f05004014000000000b000224a5 +:1067a000788082a3495a400b000000000a000224ae +:1067b000788082a3495a400b000000001c82828f1f +:1067c0001800c393000043a01c82828f0100422462 +:1067d0001c8282af3c81828f010042243c8182afc7 +:1067e0007480838f1800c29321206000212840000c +:1067f000ea82400f00000000748082af3c81838fea +:106800003881828f46006214000000000b000224d1 +:10681000788082a3495a400b000000001800c29300 +:10682000448182af0c000224788082a3495a400b35 +:10683000000000004481828f00120200448182af78 +:106840001800c3934481828f21106200448182af7b +:106850000d000224788082a3495a400b00000000fa +:106860004481828f00120200448182af1800c393da +:106870004481828f21106200448182af0e00022485 +:10688000788082a3495a400b000000004481828f27 +:1068900000120200448182af1800c3934481828faa +:1068a00021106200448182af7480828f2710020021 +:1068b000748082af4481838f7480828f090062105c +:1068c00000000000488182932014027c21204000b7 +:1068d000212800007e2d400f000000006e5a400f5e +:1068e00000000000488182932014027c2120400097 +:1068f000010005247e2d400f000000006e5a400f5d +:1069000000000000495a400b000000006e5a400f82 +:106910000000000000000000495a400b0000000089 +:106920000000000021e8c0031400bf8f1000be8fdc +:106930001800bd270800e00300000000e0ffbd27ad +:106940001c00bfaf1800beaf21f0a0032000c4aff1 +:106950002400c5af1000c0af635a400b0000000018 +:106960002000c28f000042902000c38f01006324ea +:106970002000c3af21204000fd58400f0000000060 +:106980001000c28f010042241000c2af1000c38f5c +:106990002400c28f2a106200f1ff401400000000a2 +:1069a00021e8c0031c00bf8f1800be8f2000bd2748 +:1069b0000800e00300000000f8ffbd270400beafa0 +:1069c00021f0a003388180af348180af408180af57 +:1069d000488180a3448180af01000224788082a393 +:1069e0003c8180afffff0224748082af00a0023c94 +:1069f000442f42241c8282af21e8c0030400be8fd2 +:106a00000800bd270800e00300000000d8ffbd27f4 +:106a10002400bfaf2000beaf21f0a00321108000f2 +:106a20002c00c5af2800c2a300a0023cdeff032457 +:106a3000442f43a000a0023c442f4224adff032476 +:106a4000010043a000a0023c442f4224beff0324c7 +:106a5000020043a000a0023c442f4224efff032485 +:106a6000030043a000a0023c442f42242800c3930b +:106a7000040043a02c00c28f031602001000c2a322 +:106a80001000c39300a0023c442f4224050043a001 +:106a90002c00c28f031402001000c2a31000c39385 +:106aa00000a0023c442f4224060043a02c00c28fc9 +:106ab000031202001000c2a31000c39300a0023c06 +:106ac000442f4224070043a02c00c28f1000c2a311 +:106ad0001000c39300a0023c442f4224080043a0ae +:106ae000ffff02241400c2af2c00c28f0900422411 +:106af00000a0033c442f642421284000ac82400fb6 +:106b0000000000001400c2af7c80838f2c00c28f75 +:106b1000211062001800c2af1400c28f02160200da +:106b20001000c2a31000c3931800c28f000043a03e +:106b30001800c28f010042241800c2af1400c28f97 +:106b4000021402001000c2a31000c3931800c28fe9 +:106b5000000043a01800c28f010042241800c2aff9 +:106b60001400c28f021202001000c2a31000c393cf +:106b70001800c28f000043a01800c28f01004224f9 +:106b80001800c2af1400c28f1000c2a31000c3933c +:106b90001800c28f000043a01800c28f01004224d9 +:106ba0001800c2af2c00c28f0d00422400a0033c8d +:106bb000442f6424212840000e2d400f00000000c7 +:106bc00021e8c0032400bf8f2000be8f2800bd270e +:106bd0000800e00300000000f8ffbd270400beaf7e +:106be00021f0a0037c80828f21e8c0030400be8fc7 +:106bf0000800bd270800e00300000000e8ffbd27f3 +:106c00001400bfaf1000beaf21f0a003f65a400f32 +:106c10000000000001000324000043a0030004243e +:106c200001000524835a400f0000000021e8c00342 +:106c30001400bf8f1000be8f1800bd270800e003ae +:106c400000000000e8ffbd271400bfaf1000beaf7a +:106c500021f0a003211080001800c2a3f65a400fb3 +:106c60000000000001000324000043a01800c293ac +:106c70002120400001000524835a400f000000003d +:106c800021e8c0031400bf8f1000be8f1800bd277d +:106c90000800e00300000000e8ffbd271400bfafbc +:106ca0001000beaf21f0a003211080001800c2a385 +:106cb000f65a400f00000000000040a01800c293e8 +:106cc0002120400001000524835a400f00000000ed +:106cd00021e8c0031400bf8f1000be8f1800bd272d +:106ce0000800e00300000000d8ffbd272400bfaf6c +:106cf0002000beaf21f0a003211080002800c2a315 +:106d0000960002241000c2aff65a400f00000000a7 +:106d10001400c2af1400c28f2800c393000043a028 +:106d20001400c28f010042241400c2af2800c383a4 +:106d30000100022426006214000000001000c28f2f +:106d4000031602001800c2a31400c28f1800c393d8 +:106d5000000043a01400c28f010042241400c2afff +:106d60001000c28f031402001800c2a31400c28fc7 +:106d70001800c393000043a01400c28f01004224f6 +:106d80001400c2af1000c28f031202001800c2a389 +:106d90001400c28f1800c393000043a01400c28fd8 +:106da000010042241400c2af1000c28f1800c2a319 +:106db0001400c28f1800c393000043a01400c28fb8 +:106dc000010042241400c2af885b400b00000000a9 +:106dd0001400c28f000040a01400c28f01004224a2 +:106de0001400c2af1400c28f000040a01400c28f74 +:106df000010042241400c2af1400c28f000040a062 +:106e00001400c28f010042241400c2af1400c28fcc +:106e1000000040a01400c28f010042241400c2af41 +:106e20000800042405000524835a400f00000000d8 +:106e300021e8c0032400bf8f2000be8f2800bd279b +:106e40000800e00300000000e0ffbd271c00bfaf0a +:106e50001800beaf21f0a003211080002400c5afb0 +:106e60002000c2a3f65a400f000000001000c2af7d +:106e70001000c28f2000c393000043a01000c28ff7 +:106e8000010042241000c2af2400c28f031602008a +:106e90001400c2a31000c28f1400c393000043a0cb +:106ea0001000c28f010042241000c2af2400c28f24 +:106eb000031402001400c2a31000c28f1400c39375 +:106ec000000043a01000c28f010042241000c2af96 +:106ed0002400c28f031202001400c2a31000c28f4c +:106ee0001400c393000043a01000c28f010042248d +:106ef0001000c2af2400c28f1400c2a31000c28fc2 +:106f00001400c393000043a01000c28f010042246c +:106f10001000c2af0d00042405000524835a400f61 +:106f20000000000021e8c0031c00bf8f1800be8fc6 +:106f30002000bd270800e00300000000e0ffbd279f +:106f40001c00bfaf1800beaf21f0a00321108000cd +:106f50002000c2a3f65a400f000000001000c2af8c +:106f60001000c28f2000c393000043a01000c28f06 +:106f7000010042241000c2af0a00042401000524cd +:106f8000835a400f0000000021e8c0031c00bf8f9f +:106f90001800be8f2000bd270800e003000000009d +:106fa000e0ffbd271c00bfaf1800beaf21f0a0035b +:106fb000211080002000c2a3f65a400f00000000fc +:106fc0001000c2af1000c28f2000c393000043a086 +:106fd0001000c28f010042241000c2af0f00042431 +:106fe00001000524835a400f0000000021e8c0037f +:106ff0001c00bf8f1800be8f2000bd270800e003d3 +:1070000000000000e0ffbd271c00bfaf1800beafae +:1070100021f0a003211080002000c2a3f65a400fe7 +:10702000000000001000c2af1000c28f2000c39308 +:10703000000043a01000c28f010042241000c2af24 +:107040001900042401000524835a400f00000000a9 +:1070500021e8c0031c00bf8f1800be8f2000bd2791 +:107060000800e0030000000060ffbd279c00bfafe8 +:107070009800beaf21f0a003211880002110a000cd +:10708000a800c6afa000c3a3a400c2a71100c0a35c +:10709000a000c2930600032420004310000000005b +:1070a0000700032433004310000000000100032404 +:1070b000aa004314000000002800c227a800c48fc3 +:1070c000212840007000062421380000823c400f37 +:1070d000000000001100c2a31100c2838f00401401 +:1070e00000000000b880828f8f0040100000000078 +:1070f000a800c28f70004224bc8082afb880828f0b +:107100002800c327010004242128600009f840005a +:1071100000000000d75c400b000000001c00c227ec +:10712000a800c48f21284000040006242138000054 +:10713000823c400f000000001100c2a31100c28376 +:107140007c00401400000000b880828f7c0040105a +:1071500000000000b880828f1c00c32706000424b2 +:107160002128600009f8400000000000d75c400bb7 +:1071700000000000010002241000c2a32000c2276a +:10718000a800c48f212840000800062421380000f0 +:10719000823c400f000000001100c2a31100c28316 +:1071a00051004014000000002400c2971200c2a742 +:1071b0002600c2971400c2a72200c2971600c2a7d9 +:1071c0002000c2971800c2af1200c29703004014fb +:1071d00000000000010002241c8082af1200c3974f +:1071e0001400c297211862001600c29702006210b4 +:1071f000000000001000c0a31800c28f010003248b +:107200002c004310000000000100432c0900601412 +:1072100000000000020003240e00431000000000e4 +:10722000030003240f00431000000000a55c400b86 +:10723000000000001c80838f0100022420006214e3 +:10724000000000001800c28f1c8082afba5c400ba7 +:10725000000000001800c28f1c8082afba5c400b97 +:10726000000000001c80838f0200022417006210bf +:10727000000000001c80838f0400022416006210ae +:10728000000000001800c28f1c8082afba5c400b67 +:10729000000000001c80838f020002241100621095 +:1072a00000000000040002241c8082afba5c400b86 +:1072b0000000000000000000ba5c400b000000006d +:1072c00000000000ba5c400b00000000000000005d +:1072d000ba5c400b0000000000000000ba5c400bec +:1072e00000000000000000001000c29317004010d2 +:1072f00000000000b880828f1700401000000000de +:10730000b880828f070004241c80852709f840007c +:1073100000000000d75c400b0000000000000000ef +:10732000d75c400b0000000000000000d75c400b61 +:107330000000000000000000d75c400b00000000cf +:1073400000000000d75c400b0000000000000000bf +:10735000d75c400b000000000000000021e8c003e3 +:107360009c00bf8f9800be8fa000bd270800e003df +:1073700000000000d0ffbd272c00bfaf2800beaf2b +:1073800021f0a0033000c4af3400c5af2110c0000d +:107390003800c2a72000c0a33000c28f3800c397b6 +:1073a0003400c48f1000a4af1400a3af70000324f6 +:1073b0001800a3af050004248200052421304000fa +:1073c00070000724ff39400f000000002000c2a316 +:1073d0002000c28321e8c0032c00bf8f2800be8f8d +:1073e0003000bd270800e00300000000b8ffbd2703 +:1073f0004400bfaf4000beaf21f0a0034800c4afbf +:107400004c00c5af2000c0a34c00c28f0106422c27 +:1074100023004010000000004800c28f2800c2afc7 +:107420002800c28fc86e0324000043a44c00c28f02 +:107430000300422482100200ffff43302800c28f65 +:10744000020043a42800c28f040040a44c00c28f55 +:107450000300422482100200ffff43302800c28f45 +:10746000060043a44c00c28fffff42304800c38f88 +:107470001000a3af1400a2af1800a0af05000424b1 +:10748000840005242130000021380000ff39400f1e +:10749000000000002000c2a3c65d400b00000000f9 +:1074a0002400c0af2c00c0af4800c38f2400c28f9f +:1074b000211062003400c3272120600021284000f1 +:1074c00008000624b57a400f000000004c00c38f6e +:1074d0002400c28f23106200000503240105442c00 +:1074e0000a1064002c00c2af4800c38f2400c28f72 +:1074f000211062003000c2af3000c28fc86e03247a +:10750000000043a44c00c28f0300422482100200fa +:10751000ffff43303000c28f020043a42400c28f1b +:107520000300422482100200ffff43303000c28f6c +:10753000040043a42c00c28f0300422482100200e6 +:10754000ffff43303000c28f060043a44800c38fc2 +:107550002400c28f211862002c00c28fffff42302e +:107560001000a3af1400a2af1800a0af05000424c0 +:10757000840005242130000021380000ff39400f2d +:10758000000000002000c2a34800c38f2400c28f67 +:10759000211862003400c227212060002128400009 +:1075a00008000624b57a400f000000002400c38fb5 +:1075b0002c00c28f211062002400c2afc15d400bbd +:1075c000000000002400c28ff8ff42244800c38f4f +:1075d000211062003400c3272120600021284000d0 +:1075e00008000624b57a400f000000004c00c38f4d +:1075f0002400c28f23106200000503240105442cdf +:107600000a1064002c00c2af2c00c28f0300432478 +:10761000fcff0224241062002c00c2af2400c28fa1 +:10762000f8ff42244800c38f211062003000c2af2f +:107630003000c28fc86e0324000043a44c00c28fe8 +:107640000300422482100200ffff43303000c28f4b +:10765000020043a42400c28f0300422482100200cf +:10766000ffff43303000c28f040043a42c00c28fc0 +:107670000300422482100200ffff43303000c28f1b +:10768000060043a42400c28ff8ff42244800c38fa1 +:10769000211862002c00c28fffff423008004224f4 +:1076a000ffff42301000a3af1400a2af1800a0af3c +:1076b0000500042484000524213000002138000046 +:1076c000ff39400f000000002000c2a32400c28f39 +:1076d000f8ff42244800c38f211862003400c227fb +:1076e000212060002128400008000624b57a400fc0 +:1076f000000000002400c38f2c00c28f2110620004 +:107700002400c2af2400c38f4c00c28f2b10620034 +:10771000acff4014000000002000c28321e8c00339 +:107720004400bf8f4000be8f4800bd270800e00323 +:1077300000000000e0ffbd271c00bfaf1800beaf77 +:1077400021f0a0032000c4af2400c5af2800c6afbd +:107750002c00c7af010002241000c2a31100c0a377 +:10776000bc80828f0400401400000000f4ff02245b +:10777000965e400b00000000bc80838f2000c28f0b +:10778000212060002128400002000624213800004a +:10779000823c400f000000009000401400000000f8 +:1077a000bc80828f02004224bc8082afbc80838f69 +:1077b0001600c22721206000212840000200062474 +:1077c00021380000823c400f000000008600401479 +:1077d00000000000bc80828f02004224bc8082af87 +:1077e000bc80838f1200c227212060002128400026 +:1077f0000200062421380000823c400f00000000f7 +:107800007c00401400000000bc80828f02004224f3 +:10781000bc8082afbc80838f1400c227212060000f +:10782000212840000200062421380000823c400f3d +:10783000000000007200401400000000bc80828f35 +:1078400002004224bc8082af2000c28f000042941c +:1078500000120200201e027c2000c28f0000429411 +:1078600002120200ffff42302016027c2510620047 +:107870002016027cffff43302000c28f000043a48b +:107880001600c29700120200201e027c1600c2974a +:1078900002120200ffff42302016027c2510620017 +:1078a0002016027cffff43302c00c28f400043a40f +:1078b0001200c29700120200201e027c1200c29722 +:1078c00002120200ffff42302016027c25106200e7 +:1078d0002016027cffff42301200c2a71400c2979c +:1078e00000120200201e027c1400c2970212020045 +:1078f000ffff42302016027c251062002016027c19 +:10790000ffff42301400c2a7bc80848f2c00c38fbd +:107910002c00c28f4000429440100200ffff423012 +:10792000212860002130400021380000823c400fb7 +:107930000000000035004014000000002c00c28f41 +:10794000400042944010020021184000bc80828f09 +:1079500021106200bc8082afbc80838f1200c2976e +:10796000212060002400c58f213040002138000014 +:10797000823c400f0000000027004014000000007f +:107980001200c29721184000bc80828f2110620033 +:10799000bc8082afbc80838f1400c297212060001e +:1079a0002800c58f2130400021380000823c400f64 +:1079b000000000001b004014000000001400c297eb +:1079c00021184000bc80828f21106200bc8082aff1 +:1079d0001000c0a38a5e400b000000000000000001 +:1079e0008a5e400b00000000000000008a5e400b31 +:1079f00000000000000000008a5e400b0000000054 +:107a0000000000008a5e400b000000000000000043 +:107a10008a5e400b00000000000000008a5e400b00 +:107a200000000000000000001000c2930900401098 +:107a300000000000f4ff02241100c2a32120000076 +:107a4000212800002130000001000724823c400f63 +:107a5000000000001100c28321e8c0031c00bf8f9a +:107a60001800be8f2000bd270800e00300000000c2 +:107a7000e0ffbd271c00bfaf1800beaf21f0a00380 +:107a80002000c4af2110a0002400c2a701000224de +:107a90001000c2a31100c0a3bc80828f0400401458 +:107aa00000000000f4ff0224c65e400b000000004e +:107ab000bc80838f2400c297212060002000c58fe6 +:107ac0002130400021380000823c400f00000000bf +:107ad00004004014000000001000c0a3ba5e400b78 +:107ae00000000000000000001000c29309004010d8 +:107af00000000000f4ff02241100c2a321200000b6 +:107b0000212800002130000001000724823c400fa2 +:107b1000000000001100c28321e8c0031c00bf8fd9 +:107b20001800be8f2000bd270800e0030000000001 +:107b3000e8ffbd271400bfaf1000beaf21f0a003c7 +:107b4000212000002128000021300000010007242e +:107b5000823c400f0000000021e8c0031400bf8fea +:107b60001000be8f1800bd270800e00300000000d1 +:107b7000f8ffbd270400beaf21f0a003bc8080af9a +:107b800021e8c0030400be8f0800bd270800e00301 +:107b900000000000d0ffbd272c00bfaf2800beaf03 +:107ba00021f0a0033000c4af2000c0a33000c28f7a +:107bb0002400c2af2400c2271000a0af1400a0af61 +:107bc0001800a0af05000424050005242130400062 +:107bd00004000724ff39400f000000002000c2a36a +:107be0002000c28321e8c0032c00bf8f2800be8f75 +:107bf0003000bd270800e00300000000e0ffbd27c3 +:107c00001c00bfaf1800beaf21f0a0032000c4af1e +:107c10001000c0a32000c28fb88082afbc8080afac +:107c2000040002241c8082af05000424019d023c54 +:107c300068704524193d400f000000001000c2a3e9 +:107c40001000c28321e8c0031c00bf8f1800be8f44 +:107c50002000bd270800e00300000000e8ffbd276a +:107c60001400bfaf1000beaf21f0a00380bf023ce4 +:107c7000000640ac80bf033c0006628c0100042477 +:107c80000429827c000662ac80bf023c100640ac36 +:107c900080bf023c10270324200643ac88bf033c6e +:107ca000a010628c020004248420827ca01062acac +:107cb00088bf033ca010628c030004240408827c6b +:107cc000a01062ac88bf033c3010628c0421027c9f +:107cd000301062ac88bf033c6010628c0100042449 +:107ce0000421827c601062ac80bf033c0006628c81 +:107cf00001000424c47b827c000662ac00a0023c2c +:107d0000440f442421280000f00006245b8c400f1f +:107d10000000000021e8c0031400bf8f1000be8fd8 +:107d20001800bd270800e00300000000f0ffbd2799 +:107d30000c00beaf21f0a0031000c4af0000c0af24 +:107d40001000c28fc01002008018020023186200c9 +:107d500000a0023c440f4224211062001400428c17 +:107d600046004010000000001000c28fc01002004a +:107d7000801802002318620000a0023c440f422435 +:107d8000211062000400438c1000c28fc01002005a +:107d9000802002002320820000a0023c440f4224e5 +:107da000211082000000428c231062000000c2af4c +:107db0000000c38f1000c28fc0100200802002009c +:107dc0002320820000a0023c440f422421108200a4 +:107dd0000c00428c2b1062000c00401400000000cc +:107de0001000c28fc0100200801802002318620029 +:107df00000a0023c440f422421106200040040ac69 +:107e000001000224a05f400b000000000000c28fb0 +:107e10001a004104000000000000c28fe803422461 +:107e2000211840001000c28fc01002008020020004 +:107e30002320820000a0023c440f42242110820033 +:107e40000c00428c2b1062000c004014000000005b +:107e50001000c28fc01002008018020023186200b8 +:107e600000a0023c440f422421106200040040acf8 +:107e700001000224a05f400b000000002110000060 +:107e800021e8c0030c00be8f1000bd270800e003ee +:107e900000000000f0ffbd270c00beaf21f0a003e2 +:107ea0001000c4af0000c0af1000c28fc0100200ad +:107eb000801802002318620000a0023c440f4224f4 +:107ec000211062001400428c4500401000000000a8 +:107ed0001000c28fc0100200801802002318620038 +:107ee00000a0023c440f4224211062000800438c91 +:107ef0001000c28fc01002008020020023208200e8 +:107f000000a0023c440f4224211082000000428c59 +:107f1000231062000000c2af0000c38f1000c28fa8 +:107f2000c0100200802002002320820000a0023c3a +:107f3000440f4224211082001000428c2b1062005a +:107f40000c004014000000001000c28fc01002009e +:107f5000801802002318620000a0023c440f422453 +:107f600021106200080040ac01000224f95f400bc0 +:107f7000000000000000c28f190041040000000052 +:107f80000000c28fffff43241000c28fc010020008 +:107f9000802002002320820000a0023c440f4224e3 +:107fa000211082001000428c2b1062000c00401443 +:107fb000000000001000c28fc010020080180200f4 +:107fc0002318620000a0023c440f422421106200ea +:107fd000080040ac01000224f95f400b00000000e3 +:107fe0002110000021e8c0030c00be8f1000bd2747 +:107ff0000800e00300000000f0ffbd270c00beaf4a +:1080000021f0a0031000c4af0000c0af1000c28f69 +:10801000c0100200801802002318620000a0023c79 +:10802000440f4224211062001400428cd9004010f9 +:10803000000000001000c28fc01002008018020073 +:108040002318620000a0023c440f42242110620069 +:108050000800438c1000c28fc01002008020020074 +:108060002320820000a0023c440f42242110820001 +:108070000000428c231062000000c2af0000c38fda +:108080001000c28fc0100200802002002320820056 +:1080900000a0023c440f4224211082001000428cb8 +:1080a0002b10620056004014000000001000c28f28 +:1080b000c0100200801802002318620000a0023cd9 +:1080c000440f4224211062000400438c1000c28f30 +:1080d000c0100200802002002320820000a0023c89 +:1080e000440f4224211082000000428c23106200c1 +:1080f0000000c2af0000c38f1000c28fc01002008a +:10810000802002002320820000a0023c440f422471 +:10811000211082000c00428c2b10620014004014cd +:10812000000000001000c28fc01002008018020082 +:108130002318620000a0023c440f42242110620078 +:10814000080040ac1000c28fc0100200801802006e +:108150002318620000a0023c440f42242110620058 +:10816000040040ac01000224e660400b0000000067 +:108170000000c28f87004104000000000000c28f91 +:10818000e8034224211840001000c28fc0100200f2 +:10819000802002002320820000a0023c440f4224e1 +:1081a000211082000c00428c2b10620079004014d8 +:1081b000000000001000c28fc010020080180200f2 +:1081c0002318620000a0023c440f422421106200e8 +:1081d000080040ac1000c28fc010020080180200de +:1081e0002318620000a0023c440f422421106200c8 +:1081f000040040ac01000224e660400b00000000d7 +:108200000000c28f63004104000000000000c28f24 +:10821000ffff43241000c28fc01002008020020024 +:108220002320820000a0023c440f4224211082003f +:108230001000428c2b106200560040140000000019 +:108240001000c28fc01002008018020023186200c4 +:1082500000a0023c440f4224211062000400438c21 +:108260001000c28fc0100200802002002320820074 +:1082700000a0023c440f4224211082000000428ce6 +:10828000231062000000c2af0000c38f1000c28f35 +:10829000c0100200802002002320820000a0023cc7 +:1082a000440f4224211082000c00428c2b106200eb +:1082b00014004014000000001000c28fc010020023 +:1082c000801802002318620000a0023c440f4224e0 +:1082d00021106200080040ac1000c28fc0100200e4 +:1082e000801802002318620000a0023c440f4224c0 +:1082f00021106200040040ac01000224e660400b43 +:10830000000000000000c28f2200410400000000b5 +:108310000000c28fe8034224211840001000c28fe1 +:10832000c0100200802002002320820000a0023c36 +:10833000440f4224211082000c00428c2b1062005a +:1083400014004014000000001000c28fc010020092 +:10835000801802002318620000a0023c440f42244f +:1083600021106200080040ac1000c28fc010020053 +:10837000801802002318620000a0023c440f42242f +:1083800021106200040040ac01000224e660400bb2 +:10839000000000002110000021e8c0030c00be8f87 +:1083a0001000bd270800e00300000000e8ffbd2723 +:1083b0001400bfaf1000beaf21f0a0031800c4af7f +:1083c0001c00c5af1800c28fc01002008018020048 +:1083d0002318620000a0023c440f422421106200d6 +:1083e00001000324140043ac1c00c28fe803422c9c +:1083f0001e004014000000001800c28fc0100200d0 +:10840000801802002318620000a0023c440f42249e +:10841000211062001c00c48fe80303241b008300aa +:10842000f40160001020000012180000100043ac9e +:108430001800c28fc01002008018020023186200ca +:1084400000a0023c440f4224211062001c00c48f93 +:10845000e80303241b008300f401600010180000ef +:108460000c0043ac2c61400b000000001800c28fd0 +:10847000c0100200801802002318620000a0023c15 +:10848000440f422421106200100040ac1800c28f3b +:10849000c0100200801802002318620000a0023cf5 +:1084a000440f4224211062001c00c38f0c0043ac17 +:1084b0001800c48f5e61400f0000000021e8c00377 +:1084c0001400bf8f1000be8f1800bd270800e00306 +:1084d00000000000e8ffbd271400bfaf1000beafd2 +:1084e00021f0a0031800c4af1c00c5af1800c28f54 +:1084f000c0100200801802002318620000a0023c95 +:10850000440f42242110620001000324140043acf4 +:108510001800c28fc01002008018020023186200e9 +:1085200000a0023c440f4224211062001c00c38fb3 +:10853000100043ac1800c28fc01002008018020067 +:108540002318620000a0023c440f42242110620064 +:108550000c0040ac1800c48f5e61400f00000000aa +:1085600021e8c0031400bf8f1000be8f1800bd2784 +:108570000800e00300000000f8ffbd270400beafc4 +:1085800021f0a0030800c4af0800c28fc010020091 +:10859000801802002318620000a0023c440f42240d +:1085a00021106200000040ac0800c28fc010020021 +:1085b000801802002318620000a0023c440f4224ed +:1085c00021106200040040ac0800c28fc0100200fd +:1085d000801802002318620000a0023c440f4224cd +:1085e00021106200080040ac21e8c0030400be8fe7 +:1085f0000800bd270800e00300000000f8ffbd27c9 +:108600000400beaf21f0a0030800c4af0800c28f71 +:10861000c0100200801802002318620000a0023c73 +:10862000440f4224211062001400428c21e8c00350 +:108630000400be8f0800bd270800e0030000000012 +:10864000f8ffbd270400beaf21f0a0030800c4afaf +:108650000800c28fc01002008018020023186200b8 +:1086600000a0023c440f422421106200140040ace0 +:1086700021e8c0030400be8f0800bd270800e00306 +:1086800000000000e8ffbd271400bfaf1000beaf20 +:1086900021f0a0031800c4af02000424eb60400fd7 +:1086a0001800c58fac61400b0000000040000000c6 +:1086b00002000424fe5f400f00000000fbff40109a +:1086c000000000009061400f0200042421e8c00374 +:1086d0001400bf8f1000be8f0800e0031800bd27f4 +:1086e00000e85d4100701a4000601b40e0ffbd27bc +:1086f0001c00baaf1800bbaf44781b7c00087b3766 +:1087000000609b401400beaf1000a4af0c00a3afec +:108710000800a2af21f0a00300a0023c440f4224b5 +:108720000400c2af0000c0afe761400b00000000d2 +:108730000400c28f1400428c1200401000000000a0 +:108740000400c28f0400428ce80343380100632c0c +:10875000ff006330010044240400c28f040044acd5 +:1087600008006010000000000400c28f040040ac4c +:108770000400c28f0800428c010043240400c28f11 +:10878000080043ac0400c28f180042240400c2afaa +:108790000000c28f010042240000c2af0000c28f5f +:1087a0000a00422ce2ff40140000000088bf033c96 +:1087b0003010628c0421027c301062ac21e8c003ce +:1087c0001400be8f1000a48f0c00a38f0800a28f8e +:1087d00000606041c00000001c00ba8f1800bb8f11 +:1087e00000709a402000bd2700e8dd4100609b40fa +:0487f000180000422b +:020000040000fa +:020000041d01dc +:1087f400ac0000a00400000000000000300000a055 +:10880400040000000100000000010000b00000a00e +:108814002000000000000000340000a00800000058 +:1088240001000000ffff040525010000d00000a0a6 +:108834000800000000000000d80000a008000000ac +:10884400000000003c0000a0040000000100000043 +:1088540004000000e00000a014000000000000007c +:10886400400000a00400000001000000130000000c +:10887400f40000a00400000000000000f80000a0c4 +:108884000100000000000000fa0000a00600000043 +:1088940000000000400200a0b00000000000000042 +:1088a400000100a00400000000000000040100a07a +:1088b4000400000000000000f00200a040000000de +:1088c40000000000080100a01800000000000000e3 +:1088d400440000a0020000000100000001090000a3 +:1088e400300300a06e02000000000000703000a001 +:1088f400bc0400000100000057494e4333343030bb +:108904005f30303a3030000000000000000000000a +:1089140000000000000000000001000a313233347e +:1089240035464646464600000000000000000000b0 +:10893400000000000000000100c0a80101000000c8 +:1089440057494e43333430305f30303a30300000d2 +:108954004865726520697320746865206c69737456 +:10896400206f662074686520617661696c61626c51 +:108974006520636f6d6d616e64733a0a0d0a0d684c +:10898400656c70203a2053686f777320746869733c +:108994002077696e646f770a0d0a706f77657220ad +:1089a4005b73746174655d20536574206368616ce6 +:1089b400657427732031325620496e76657274656a +:1089c40072206665656420706f77657220737461c8 +:1089d40074652e20205468697320636f6d6d616e19 +:1089e4006420636f6e74726f6c7320746865206d9d +:1089f40061696e20706f7765722072656c61790aa7 +:108a0400202020202d20417661696c61626c6520f4 +:108a14005b73746174655d20617267756d656e74f6 +:108a2400206172653a206f6e0a20202020202020c9 +:108a34002020202020202020202020202020202032 +:108a44002020202020202020202020202020206fd3 +:108a540066660a0a77696669205b636f6d6d616e8d +:108a6400645d20636f6e74726f6c204368616c6523 +:108a7400744475696e6f27732057694669206d6f5a +:108a840064756c65207374617465250a2020202048 +:108a94002d20417661696c61626c65205b636f6d4a +:108aa4006d616e645d20617267756d656e742061c1 +:108ab40072653a206f6e20287475726e73204f4e63 +:108ac400206d6f64756c65290a20202020202020e9 +:108ad4002020202020202020202020202020202092 +:108ae4002020202020202020202020202020202082 +:108af400206f666620287475726e73204f46462078 +:108b04006d6f64756c65290a2020202020202020a8 +:108b14002020202020202020202020202020202051 +:108b24002020202020202020202020202020202041 +:108b3400737461747573202872657475726e732012 +:108b440063757272656e7420737461747573290a27 +:108b54000a62617474657279205b73656e736f72f7 +:108b64005d2072657475726e732063757272656ec2 +:108b74007420626174746572792073656e736f72a8 +:108b8400732072656164696e67730a202020202d4a +:108b940020417661696c61626c65205b73656e73fc +:108ba4006f725d20617267756d656e7420617265a8 +:108bb4003a20766f6c746167650a2020202020209b +:108bc40020202020202020202020202020202020a1 +:108bd4002020202020202020202020202020202091 +:108be4002063757272656e740a2020202020202074 +:108bf4002020202020202020202020202020202071 +:108c04002020202020202020202020202020202060 +:108c1400736f6320287374617465206f66206368c2 +:108c240061726765290a20202020202020456d706c +:108c34007479205b73656e736f725d206172677502 +:108c44006d656e74207072696e747320616c6c2033 +:108c540076616c7565730a0a737461747573203a6e +:108c6400206765742067656e6572616c2073797323 +:108c740074656d207374617475730a0a626f6f741e +:108c84006c6f61646572205b636f6d6d616e645db2 +:108c9400203a20626f6f746c6f61646572206d6f2f +:108ca400646520636f6e74726f6c0a202020202d1f +:108cb40020417661696c61626c65205b636f6d6de8 +:108cc400616e645d20617267756d656e742061729a +:108cd400653a2073746172742028656e61626c65f4 +:108ce40020626f6f746c6f6164657220616e6420c2 +:108cf4006f70656e7320706f7274290a20202020b3 +:108d0400202020202020202020202020202020205f +:108d1400202020202020202020202020202020204f +:108d24002020202073746f70202864697361626c42 +:108d3400657320626f6f746c6f616465722069661d +:108d4400206e6f742062757379290a2020202020f8 +:108d5400202020202020202020202020202020200f +:108d640020202020202020202020202020202020ff +:108d7400202020737461746520287072696e747386 +:108d84002061637475616c207374617465206f660f +:108d94002074686520626f6f746c6f6164657229fa +:108da4000a0a48617665206120676f6f64206461f8 +:108db40079210a00480000a00c0000000100000016 +:108dc400f8f00545d4840000c83000a0a00500a038 +:108dd4008403000000000000540000a00400000010 +:108de40001000000903f029d240900a0200600001d +:108df40000000000200100a00c00000000000000a2 +:108e0400383e00a0580000000100000057494e43be +:108e1400333430305f30303a30300000000000002e +:108e24000000000000000000000000000001000a33 +:108e340031323334354646464646000000000000d1 +:108e440000000000000000000000000100c0a801b4 +:108e54000100000057494e43333430305f30303a1c +:108e640030300000580000a008000000010000009d +:108e7400f8f00545d4840000440f00a0f000000081 +:108e840000000000cc3d00a06c00000001000000c8 +:108e940057494e43333430305f30303a303000007d +:108ea40000000000000000000000000000000000be +:108eb4000001000a31323334354646464646000046 +:108ec400000000000000000000000000000000019d +:108ed40000c0a8010100000057494e43333430302c +:108ee4005f30303a303000006f70656e77656174c2 +:108ef4006865726d61702e6f726700002c3500a07a +:108f04000004000000000000600000a01000000049 +:108f140001000000f8f00545d484ffffffffffffc8 +:108f2400ffffff042c0100a0180000000000000057 +:108f3400341000a0040d000000000000700000a028 +:108f4400040000000100000000050400903e00a0a1 +:108f5400580000000100000057494e4333343030bc +:108f64005f30303a303000000000000000000000a4 +:108f740000000000000000000001000a3132333418 +:108f8400354646464646000000000000000000004a +:108f9400000000000000000100c0a8010100000062 +:108fa40057494e43333430305f30303a303000006c +:108fb400740000a00800000001000000f8f005455e +:108fc400d4840000440100a004000000000000005c +:108fd400480100a00800000000000000381d00a0a7 +:108fe4001600000000000000501d00a0001000004a +:108ff40000000000e83e00a058000000010000004e +:1090040057494e43333430305f30303a303000000b +:10901400000000000000000000000000000000004c +:109024000001000a313233343546464646460000d4 +:10903400000000000000000000000000000000012b +:1090440000c0a8010100000057494e4333343030ba +:109054005f30303a303000007c0000a0080000008f +:1090640001000000f8f00545d4840000502d00a054 +:10907400f401000000000000500100a00400000002 +:1090840000000000403f00a0580000000100000064 +:1090940057494e43333430305f30303a303000007b +:1090a40000000000000000000000000000000000bc +:1090b4000001000a31323334354646464646000044 +:1090c400000000000000000000000000000000019b +:1090d40000c0a8010100000057494e43333430302a +:1090e4005f30303a30300000840000a008000000f7 +:1090f40001000000f8f00545d4840000442f00a0ce +:109104002c01000000000000983f00a0580000005f +:109114000100000057494e43333430305f30303a59 +:1091240030300000000000000000000000000000db +:10913400000000000001000a31323334354646464f +:10914400464600000000000000000000000000008f +:109154000000000100c0a8010100000057494e436f +:10916400333430305f30303a303000008c0000a0af +:109174001800000001000000f8f00545d484000048 +:10918400ffffffff010000004d2f00a009000000b9 +:10919400540100a018000000000000002c3900a0b9 +:1091a40000040000000000006c0100a001000000a9 +:1091b400000000002c3d00a0a00000000100000001 +:1091c400f03f00a000000000f03f00a009000000f4 +:1091d40020000000104000a000000000104000a08b +:1091e4000e0201000000000000000000000000006a +:1091f4000000000006020200000000000000000061 +:10920400000000000000000000000000000000005a +:10921400000000000000000000000000000000004a +:10922400000000000000000000000000000000003a +:10923400000000000000000000000000000000002a +:10924400000000000000000000000000000000001a +:10925400000000000000000000000000000000000a +:10926400f03f00a04000000000000000a40000a0a7 +:1092740004000000010000002c3d00a06d0100a0ce +:1092840001000000000000004c4000a0100000009d +:1092940000000000700100a01000000000000000a9 +:1092a4005c4000a00400000000000000800100a059 +:1092b4000400000000000000604000a00400000062 +:1092c40000000000304000a01c000000000000006e +:1092d400840100a00800000000000000a80000a015 +:1092e400040000000100000002000000000000a0d3 +:1092f40020000000010000000c000000000000003d +:109304000100017c1f0c1d000c0000001400000073 +:1093140088e6019d4c040000200000a0100000001d +:10932400010000000c00000024000000b0bb033a60 +:109334005c040000000000002222222222222222b9 +:1093440022222222222222222222222222222222f9 +:020000040000fa +:020000041d01dc +:109354004a462e636f6d0000426f6f746c6f6164d8 +:10936400657220486561727462656174205265712a +:109374007565737400000000424f4f544c4f4144d4 +:1093840045525f45524153455f424f4f544c4f4104 +:109394004445525f464c4153485f524551554553ed +:1093a40054000000424f4f544c4f414445525f49d2 +:1093b4004e49545f55504c4f41445f5245515545b9 +:1093c40053540000424f4f544c4f414445525f4761 +:1093d40045545f53544154455f5245515545535488 +:1093e40000000000424f4f544c4f414445525f55da +:1093f400504c4f41445f46494e49534845445f529f +:109404004551554553540000424f4f544c4f41442d +:1094140045525f455845435554455f555047524161 +:1094240047455f524551554553540000424f4f54f0 +:109434004c4f414445525f41424f52545f4f504557 +:10944400524154494f4e5f524551554553540000c3 +:10945400424f4f544c4f414445525f434845434b60 +:109464005f464c4153485f4649524d575f494e54fd +:109474004547524954595f5245515545535400008c +:10948400426f6f746c6f6164657250726f746f6356 +:109494006f6c206465746563746564206120435255 +:1094a40043206572726f722e2020436d643a20252a +:1094b400642c2052784352433a307825782c204546 +:1094c400787065637465643a5b307825785d0a006a +:1094d400426f6f746c6f6164657220496e7465725b +:1094e4006661636520676f696e6720696e746f20bb +:1094f40061637469766520737461746500000000ab +:10950400426f6f746c6f6164657220496e7465722a +:109514006661636520676f696e6720696e746f208a +:10952400457261736520466c61736820737461745d +:1095340065000000426f6f746c6f6164657220494e +:109544006e7465726661636520676f696e67206912 +:109554006e746f204669726d77617265205258206f +:10956400737461746500000041626f7274696e67a0 +:109574002075706c6f61642c20676f696e67206959 +:109584006e746f205354414e444259206d6f64658c +:1095940000000000426f6f746c6f61646572207725 +:1095a400696c6c206e6f77207570677261646520da +:1095b400616e64207265626f6f7421210000000087 +:1095c400426f6f746c6f616465722075706772614d +:1095d400646520726571756573742064656e696570 +:1095e400643a204669726d77617265206e6f7420eb +:1095f40075706c6f6164656400000000466c617393 +:10960400682065726173652066696e697368656454 +:109614002e2020426f6f746c6f6164657220496ef6 +:109624007465726661636520676f696e6720696e31 +:10963400746f204163746976652073746174650086 +:10964400466c617368206572617365206572726f20 +:10965400722e2020426f6f746c6f616465722049b2 +:109664006e7465726661636520676f696e672069f1 +:109674006e746f20416374697665207374617465d8 +:1096840000000000466c6173682065726173652098 +:1096940061626f72742e2020426f6f746c6f61640c +:1096a400657220496e7465726661636520676f69cf +:1096b4006e6720696e746f204163746976652073e8 +:1096c400746174650000000041626f7274696e67b2 +:1096d40020466c6173682065726173652c20676f26 +:1096e400696e6720696e746f205354414e44425929 +:1096f400206d6f6465000000426f6f746c6f61646d +:109704006572204368756e6b2025642073756363ee +:1097140065737366756c79207772697474656e20ed +:10972400746f20666c6173680a000000426f6f7486 +:109734006c6f6164657220466c617368207772692e +:109744007465206572726f722e2041626f72746943 +:109754006e6720616e6420676f696e6720696e743e +:109764006f205354414e4442592073746174650010 +:10977400426f6f746c6f6164657220496e746572b8 +:10978400666163652041424f5254494e472055500b +:109794004c4f41442e2052656365697665642069a7 +:1097a4006e76616c6964206368756e6b20696e64a3 +:1097b40065782e202052783a205b25645d202d2088 +:1097c40045787065637465643a205b25645d0a00be +:1097d400426f6f746c6f6164657220496e74657258 +:1097e400666163652e205278206e6577206461740b +:1097f40061206368756e6b2e202057726974696ee0 +:109804006720746f20666c6173682e2020496e6433 +:1098140065783a2025640a00426f6f746c6f616446 +:10982400657220496e7465726661636520696e763f +:10983400616c6964206368756e6b204352432e200b +:1098440052657175657374696e6720726573656eb0 +:1098540064206368756e6b20696e646578205b258f +:10986400645d0a00426f6f746c6f616465722049b5 +:109874006e74657266616365206669726d77617284 +:10988400652075706c6f61642066696e69736865c4 +:10989400642e20436865636b20666c61736820697d +:1098a4006e746567726974792e0000004669726d82 +:1098b4007761726520696e74656772697479206373 +:1098c4006865636b206661696c65642e2020476f50 +:1098d400696e67206261636b20746f205354414e3c +:1098e4004442592073746174652e0000426f6f7492 +:1098f4006c6f616465722061626f7274696e672057 +:109904006669726d7761726520646f776e6c6f61e2 +:10991400642e2020476f696e67206261636b207438 +:109924006f205354414e444259207374617465004e +:10993400426f6f746c6f6164657220496e746572f6 +:10994400666163652045726173696e672073656340 +:10995400746f722025307825780a0000426f6f7486 +:109964006c6f6164657220496e74657266616365cb +:109974003a204c61737420736563746f722030787d +:109984002578206572617365642061667465722050 +:10999400256420706f6c6c730a000000426f6f7452 +:1099a4006c6f6164657220496e746572666163658b +:1099b40020736563746f7220307825782065726136 +:1099c40073656420616674657220256420706f6c11 +:1099d4006c730a00426f6f746c6f61646572204926 +:1099e4006e7465726661636520466c617368206598 +:1099f40072617365206572726f722e20204d6178da +:109a040020706f6c6c20636f756e74207265616377 +:109a1400686564203a2025642121210a00000000a1 +:109a2400426f6f746c6f6164657220666c617368f9 +:109a3400206572726f722e202041626f7274696e9b +:109a44006720616e6420676f696e67206261636b73 +:109a540020746f205354414e44425900426f6f7436 +:109a64006c6f6164657220666c61736820777269db +:109a740074652074696d656f7574206572726f7298 +:109a84002e202041626f7274696e6720616e6420bb +:109a9400676f696e67206261636b20746f20535433 +:109aa400414e444259000000436865636b696e6728 +:109ab40020466c61736820626f6f746c6f616465bb +:109ac40072206461746120696e7465677269747967 +:109ad4002e2e2e200000000046696c65204865612a +:109ae4006465723a20436f64653a5b307825785d2b +:109af400202d20466c6167733a5b307825785d20b1 +:109b04002d204e62205265636f7264733a5b256444 +:109b14005d202d204669726d776172652053697ae4 +:109b2400653a5b25645d202d2056657273696f6efe +:109b34003a5b307825785d202d2043524333323a06 +:109b44005b307825785d0a00496e76616c69642023 +:109b540066696c652068656164657220636f64651d +:109b64002c2061626f7274696e6700004e6f207200 +:109b740065636f72647320696e2066696c65202862 +:109b84004e625265636f726473203d2030292c202d +:109b940061626f7274696e67000000004572726fd3 +:109ba4007220696e207265636f7264202325642eaf +:109bb4002020496e76616c69642068656164657211 +:109bc40020636f6465203a205b307825785d0a0055 +:109bd4004572726f7220696e207265636f726420c1 +:109be4002325642e2020496e76616c696420726599 +:109bf400636f72642073697a6520285265636f729b +:109c04006453697a65203d203029200a0000000051 +:109c1400416c6c207265636f726473206368656362 +:109c24006b6564204f4b212020436f6d7075746900 +:109c34006e67204352432e2e2e00000043524333be +:109c440032206d6174636865732e2020436f6d70dc +:109c5400757465643a5b307825785d202d204578ed +:109c64007065637465643a5b307825785d0a00003a +:109c7400466c61736820636865636b207375636306 +:109c84006573732e20204669726d77617265206951 +:109c9400732076616c6964004352433332206d69ea +:109ca400736d617463682e2020436f6d70757465e5 +:109cb400643a5b307825785d202d204578706563a3 +:109cc4007465643a5b307825785d0a00466c61738c +:109cd4006820636865636b206661696c65642e0047 +:020000040000fa +:020000041d01dc +:109ce400e8ffbd271400bfaf1000beaf21f0a003f2 +:109cf400b468400f0000000021e8c0031400bf8fc7 +:109d04001000be8f1800bd270800e003000000000b +:109d1400e0ffbd271c00bfaf1800beaf1400b0affa +:109d240021f0a003211080002000c2a3248082938c +:109d34000e00432c4801601000000000801802004f +:109d4400029d023c5c9d4224211062000000428c72 +:109d54000800400000000000949d019db89d019df5 +:109d6400209e019d6c9e019db89e019dfc9e019dbf +:109d7400709f019dbc9f019d08a0019d64a0019d51 +:109d8400c4a0019d24a1019daca1019d0ca2019d33 +:109d9400e88080aff08080aff48080a3f58080a35a +:109da400f68080a301000224248082a39d68400bd6 +:109db400000000002000c3938a00022412006214f1 +:109dc40000000000f080828f00a0033c3003632475 +:109dd400211843002000c493000064a00100422421 +:109de400f08082af02000224248082a3f680839351 +:109df4002000c29326106200ff004230f68082a346 +:109e04009d68400b00000000e88080afb468400ffc +:109e1400000000009d68400b000000002000c29379 +:109e2400f88082a3f080828f00a0033c3003632477 +:109e3400211843002000c493000064a001004224c0 +:109e4400f08082af03000224248082a3f6808393ef +:109e54002000c29326106200ff004230f68082a3e5 +:109e64009d68400b00000000f080828f00a0033c3e +:109e740030036324211843002000c493000064a02d +:109e840001004224f08082af04000224248082a3d3 +:109e94002000c293f78082a3f68083932000c293ac +:109ea40026106200ff004230f68082a39d68400bba +:109eb40000000000f080828f00a0033c3003632484 +:109ec400211843002000c493000064a00100422430 +:109ed400f08082af05000224248082a3f68083935d +:109ee4002000c29326106200ff004230f68082a355 +:109ef4009d68400b000000002000c3930100022471 +:109f040009006210000000002000c393ff00022437 +:109f14000500621000000000b468400f000000005b +:109f24009d68400b00000000f080828f00a0033c7d +:109f340030036324211843002000c493000064a06c +:109f440001004224f08082af06000224248082a310 +:109f5400f68083932000c29326106200ff004230f3 +:109f6400f68082a39d68400b000000002000c2938d +:109f7400f98082a3f080828f00a0033c3003632425 +:109f8400211843002000c493000064a0010042246f +:109f9400f08082af07000224248082a3f68083939a +:109fa4002000c29326106200ff004230f68082a394 +:109fb4009d68400b000000002000c293f58082a33e +:109fc400f080828f00a0033c3003632421184300f7 +:109fd4002000c493000064a001004224f08082affa +:109fe40008000224248082a3f68083932000c29375 +:109ff40026106200ff004230f68082a39d68400b69 +:10a0040000000000e88080af2000c293e88082afa7 +:10a01400e880828f00120200e88082aff080828f95 +:10a0240000a0033c30036324211843002000c493a0 +:10a03400000064a001004224f08082af09000224e1 +:10a04400248082a3f68083932000c29326106200aa +:10a05400ff004230f68082a39d68400b00000000a0 +:10a064002000c393e880828f25106200e88082afcd +:10a07400e880828f00120200e88082aff080828f35 +:10a0840000a0033c30036324211843002000c49340 +:10a09400000064a001004224f08082af0a00022480 +:10a0a400248082a3f68083932000c293261062004a +:10a0b400ff004230f68082a39d68400b0000000040 +:10a0c4002000c393e880828f25106200e88082af6d +:10a0d400e880828f00120200e88082aff080828fd5 +:10a0e40000a0033c30036324211843002000c493e0 +:10a0f400000064a001004224f08082af0b0002241f +:10a10400248082a3f68083932000c29326106200e9 +:10a11400ff004230f68082a39d68400b00000000df +:10a124002000c393e880828f25106200e88082af0c +:10a13400f080828f00a0033c300363242118430085 +:10a144002000c493000064a001004224f08082af88 +:10a15400e880828f2d01422c03004014000000008f +:10a16400b468400f00000000e880828f05004014ae +:10a17400000000000d000224248082a36468400bc8 +:10a18400000000000c000224248082a3f680839344 +:10a194002000c29326106200ff004230f68082a3a2 +:10a1a4009d68400b00000000f68083932000c2935a +:10a1b40026106200ff004230f68082a3f080828f76 +:10a1c40000a0033c30036324211843002000c493ff +:10a1d400000064a001004224f08082afec80828ff2 +:10a1e40001004224ec8082afec80838fe880828f70 +:10a1f4001e006214000000000d000224248082a3cb +:10a204009d68400b00000000f68082932000c393f9 +:10a214000500621000000000b468400f0000000058 +:10a224009d68400b00000000f5808293218040006f +:10a234008c69400f0000000021200002212840000a +:10a244003f6f400f00000000b468400f00000000a2 +:10a254009d68400b00000000b468400f000000003f +:10a26400000000009d68400b00000000000000009a +:10a2740021e8c0031c00bf8f1800be8f1400b08fec +:10a284002000bd270800e00300000000e8ffbd2710 +:10a294001400bfaf1000beaf21f0a0032110800056 +:10a2a4001800c2a31800c293212040004567400f44 +:10a2b4000000000021e8c0031400bf8f1000be8f0f +:10a2c4001800bd270800e00300000000f8ffbd27c8 +:10a2d4000400beaf21f0a003e88080aff08080af1f +:10a2e400f48080a3f58080a3f68080a3010002247b +:10a2f400248082a3ec8080aff98080a3f88080a3bf +:10a3040021e8c0030400be8f0800bd270800e00355 +:10a3140000000000f0ffbd270c00beaf21f0a00339 +:10a32400f580829321184000020002240300621485 +:10a33400000000000000c0a30000000021e8c003ea +:10a344000c00be8f1000bd270800e00300000000d1 +:10a35400f0ffbd270c00beaf21f0a0032118a00020 +:10a364002110c0001000c4a31400c3a31800c2a38a +:10a374001000c393010002240500621400000000d1 +:10a38400a3ff02240000c2a3e768400b0000000002 +:10a3940090ff02240000c2a31400c2930100c2a3d0 +:10a3a40021e8c0030c00be8f1000bd270800e003a5 +:10a3b40000000000f0ffbd270c00beaf21f0a00399 +:10a3c4001000c4af2110a0001400c2a30000c0a359 +:10a3d4000100c0a30269400b000000000100c29309 +:10a3e4001000c38f21106200000043900000c2934c +:10a3f400261062000000c2a30100c293010042249f +:10a404000100c2a30100c3931400c2932b10620085 +:10a41400f2ff4014000000000000c29321e8c003d2 +:10a424000c00be8f1000bd270800e00300000000f0 +:10a43400f8ffbd270400beaf21f0a003248083935e +:10a444000100022404006214000000002110000036 +:10a454001869400b000000000100022421e8c00339 +:10a464000400be8f0800bd270800e00300000000c0 +:10a47400d8ffbd272400bfaf2000beaf1c00b0af83 +:10a4840021f0a003214080002120c0002118e00019 +:10a494004000c28f2800c8a32c00c5a33000c4a369 +:10a4a4003400c3a31000c2a33c00c28f2d01422c70 +:10a4b40007004014000000004400c28f000040acbc +:10a4c40000a0023c680442248569400b000000009f +:10a4d40000a0023c8aff0324680443a000a0023cbd +:10a4e4006804422401000324010043a000a0023cac +:10a4f400680442243000c393020043a000a0023c3d +:10a50400680442242800c393030043a000a0023c33 +:10a51400680442242c00c393040043a000a0023c1e +:10a52400680442241000c393050043a000a0023c29 +:10a53400680442243400c393060043a03c00c28f45 +:10a5440002160200ff00433000a0023c68044224cb +:10a55400070043a03c00c28f02140200ff004330f6 +:10a5640000a0023c68044224080043a03c00c28fbf +:10a5740002120200ff00433000a0023c680442249f +:10a58400090043a03c00c28fff00433000a0023cfe +:10a59400680442240a0043a000a0023c730442243d +:10a5a400212040003800c58f3c00c68f7f88400fb3 +:10a5b400000000003c00c28f0b0050243c00c28ffe +:10a5c400ff0042300b004224ff00423000a0033c55 +:10a5d4006804642421284000ee68400f0000000055 +:10a5e4002118400000a0023c680442242110020209 +:10a5f400000043a03c00c28f0c00422421184000fc +:10a604004400c28f000043ac00a0023c6804422412 +:10a6140021e8c0032400bf8f2000be8f1c00b08f30 +:10a624002800bd270800e00300000000f8ffbd2754 +:10a634000400beaf21f0a00300a0023c3b0342246f +:10a6440021e8c0030400be8f0800bd270800e00312 +:04a654000000000002 +:020000040000fa +:020000041d01dc +:10a65800b8ffbd273c00b7af3400b5af029d173c2b +:10a6680000a0153c3800b6af2000b0af4400bfaf23 +:10a678004000beaf3000b4af2c00b3af2800b2af7b +:10a688002400b1af7829f7262180a0005000a6af9a +:10a698006040a4ae21b000001800a0af00001192e5 +:10a6a800c80020124400bf8f2110f102010042802f +:10a6b80088004230bd004014010010262500022405 +:10a6c800a50022160400032400001382218800003c +:10a6d8001400a3af21f0000004001424ff0073321b +:10a6e8007900622e1c004014010012262110f3028a +:10a6f8000100429004004230e601401000000000d2 +:10a70800858c400f2120000200005382029d033ceb +:10a7180078296324208c027c211063020100429076 +:10a7280004004230edff4010218040020100102655 +:10a73800000013822110f30201004290040042300d +:10a74800fbff405401001026ff0073327900622e8f +:10a75800e6ff401001001226029d043c8010130001 +:10a768007ca78424211082000000428c080040004d +:10a77800000000000cad019df4a6019df4a6019d0a +:10a78800f4a6019df4a6019df4a6019df4a6019de1 +:10a79800f4a6019df4a6019df4a6019df4a6019dd1 +:10a7a800f4a6019df4a6019df4a6019df4a6019dc1 +:10a7b800f4a6019df4a6019df4a6019df4a6019db1 +:10a7c800f4a6019df4a6019df4a6019df4a6019da1 +:10a7d800f4a6019df4a6019df4a6019df4a6019d91 +:10a7e800f4a6019df4a6019df4a6019df4a6019d81 +:10a7f800f4a6019df4a6019df4a6019df4a6019d71 +:10a80800f4a6019df4a6019df4a6019df4a6019d60 +:10a81800f4a6019df4a6019df4a6019df8ac019d46 +:10a82800f4a6019df4a6019df4a6019df4a6019d40 +:10a83800f4a6019df4a6019df4a6019df4a6019d30 +:10a84800f4a6019df4a6019df4a6019df4a6019d20 +:10a85800f4a6019df4a6019df4a6019df4a6019d10 +:10a86800f4a6019df4a6019df4a6019df4a6019d00 +:10a87800f4a6019df4a6019df4a6019df4a6019df0 +:10a88800f4a6019df4a6019df4a6019df4a6019de0 +:10a89800f4a6019df4a6019df4a6019df4a6019dd0 +:10a8a800f4a6019ddcac019df4a6019df4a6019dd2 +:10a8b800f4a6019df4a6019df4a6019df4a6019db0 +:10a8c800f4a6019df4a6019df4a6019df4a6019da0 +:10a8d800f4a6019dccac019df4a6019df4a6019db2 +:10a8e800f4a6019df4a6019df4a6019df4a6019d80 +:10a8f800f4a6019df4a6019df4a6019df4a6019d70 +:10a9080084ac019d78ac019df4a6019df4a6019d3f +:10a91800f4a6019d64ac019d78ac019df4a6019d4f +:10a92800f4a6019ddcac019df4a6019df4a6019d51 +:10a93800c4ab019df4a6019df4a6019df4a6019d5a +:10a9480010ab019df4a6019d78ac019df4a6019d74 +:10a95800f4a6019dfca9019d1c8a400f6040a48ead +:10a968004fff225200001192ffff032444014314b9 +:10a9780000a0033c1800a38f0b1063004400bf8f96 +:10a988004000be8f3c00b78f3800b68f3400b58fbb +:10a998003000b48f2c00b38f2800b28f2400b18f01 +:10a9a8002000b08f0800e0034800bd27a28e400faa +:10a9b80000000000000011923cff20162110f10257 +:10a9c8004400bf8f1800a28f4000be8f3c00b78f95 +:10a9d8003800b68f3400b58f3000b48f2c00b38f99 +:10a9e8002800b28f2400b18f2000b08f0800e00348 +:10a9f8004800bd27218040021000132421b0000028 +:10aa0800a28e400f000000001c8a400f6040a48ef8 +:10aa1800219040002d0002247100421200a0033c46 +:10aa280021204002212860022130c002af8c400f53 +:10aa38001c00a0afff000324760043106040a58ee1 +:10aa480030000224d30042120000000021a00000c0 +:10aa580002a0937221204002212860022130c00206 +:10aa6800af8c400fffff3126208c117c0b00201289 +:10aa780021a054001c8a400f6040a48e2120400071 +:10aa8800212860022130c002af8c400f2190400085 +:10aa9800ff000324efff435402a0937221204002d9 +:10aaa80021286002af8c400f2130c002ff00032430 +:10aab800e20043106040a58e1c00a48f23101400f0 +:10aac800f6fec0170ba044001800a38f1400a48f33 +:10aad80001006224ff0042301800a2af04000224e3 +:10aae800d00082101400a48f02000224d700821024 +:10aaf8005000a48f0000828c040084245000a4af6e +:10ab0800a969400b000054aca28e400f0000000061 +:10ab18009a00c0135000a38f1c8a400f6040a48e77 +:10ab2800ffff032494ff43101800a38f1400401460 +:10ab380001004324e86a400b21804002c9006210ea +:10ab4800000000000500c017ffff31261000a48f89 +:10ab5800000082a0010084241000a4af208c117c86 +:10ab68000d002012218040021c8a400f6040a48ef4 +:10ab7800010043240200642c070080142180400255 +:10ab88002118e3020000638088006330ebff605007 +:10ab98000000438221804002c1fec057000011928c +:10aba8001800a38f1000a48f01006224ff00423018 +:10abb8001800a2afa969400b000080a0a28e400f28 +:10abc800218040021c8a400f6040a48e21904000e2 +:10abd8002d00022492ff42160800132400a0033c13 +:10abe8006040648c010002241c8a400f1c00a2af44 +:10abf800219040002120400221286002af8c400fa4 +:10ac08002130c002ff0003248eff431430000224c9 +:10ac18006040a58e038e400f212040021800a38fac +:10ac28006900601000a0023c211060004400bf8f42 +:10ac38004000be8f3c00b78f3800b68f3400b58f08 +:10ac48003000b48f2c00b38f2800b28f2400b18f4e +:10ac58002000b08f0800e0034800bd27020002244e +:10ac68000000538221804002b969400b1400a2af52 +:10ac780021804002826a400b0a0013243500c01369 +:10ac88001800a38fffff10241c8a400f6040a48e79 +:10ac9800780050101800a38f0500c017ffff312659 +:10aca8001000a48f000082a0010084241000a4af2b +:10acb800208c117cf4ff201e00000000a969400bc5 +:10acc800218040022180400210001324826a400b38 +:10acd800010016241400a48f070094100800022411 +:10ace8000000538221804002b969400b1400a2afd2 +:10acf8000100de27ff00de3300005382b969400bf4 +:10ad0800218040021800a38fc8ff60142110600042 +:10ad18006040a38e4400bf8f0c006394ffff0224a1 +:10ad2800100063300a1003004000be8f3c00b78f4c +:10ad38003800b68f3400b58f3000b48f2c00b38f35 +:10ad48002800b28f2400b18f2000b08f0800e003e4 +:10ad58004800bd275000a48f01006224ff00423044 +:10ad68000000848c1800a2af5000a28f1000a4af7e +:10ad780004004224236b400b5000a2af5000a48f64 +:10ad88000000638c040084241000a3afc86a400b41 +:10ad98005000a4af1c8a400f6040a48e78000324a2 +:10ada8001a004310580003241a0043146040a58e6b +:10adb8001800c012000000001c8a400f6040a48eda +:10adc800956a400b219040006040438c4400bf8f3f +:10add8000c006394ffff0224100063300a10030084 +:10ade8004000be8f3c00b78f3800b68f3400b58f57 +:10adf8003000b48f2c00b38f2800b28f2400b18f9d +:10ae08002000b08f0800e0034800bd27eaffc01209 +:10ae18006040a58e038e400f21204000966a400bab +:10ae280021a000005000a38f0000628c040063245e +:10ae38005000a3afa969400b000054ac038e400f2b +:10ae480021204002b16a400b1c00a48f5000a38f40 +:10ae58000000628c040063245000a3afa969400b72 +:10ae6800000054a40dfec01701005026eb6a400be9 +:10ae78001800a38fffff0224616a400b0b106300c8 +:10ae88006040658c038e400f212040000d6b400b05 +:10ae98001800a28f1c8a400f6040a48e87ff6212a0 +:10aea800ffff0324f6ff431400a0033c1800a48fff +:08aeb8000d6b400b0b10840030 +:020000040000fa +:020000041d01dc +:10aec000e0ffbd271c00bfaf1800beaf21f0a003fc +:10aed0002000c4af2400c5af1000c0a31400c0af51 +:10aee0001400c2270200033cac0764342128400050 +:10aef000c878400f000000001000c2a31000c283f9 +:10af000010004014000000002000c28f0500401017 +:10af1000000000001400c28fffff43302000c28fea +:10af2000000043a42400c28f06004010000000006f +:10af30001400c28f02140200ffff43302400c28fae +:10af4000000043a41000c28321e8c0031c00bf8f8f +:10af50001800be8f2000bd270800e003000000009d +:10af6000d8ffbd272400bfaf2000beaf21f0a00353 +:10af70002800c4af1200c0a71400c0af1000c0a3c7 +:10af80001800c0af1c00c0af2800c28f21204000b5 +:10af9000212800001c000624f27a400f0000000067 +:10afa0001200c2272120400021280000b06b400f72 +:10afb000000000001200c29782130200ffff42301f +:10afc000ff004230030043300200022440006214bc +:10afd000000000001400c2279c1404242128400013 +:10afe000c878400f000000001000c2a31000c28308 +:10aff00039004014000000001400c28f30004010df +:10b00000000000001400c38f0300023c25186200fa +:10b010001800c227212060002128400008000624d3 +:10b02000fc78400f000000001000c2a31000c28393 +:10b0300029004014000000001c00c28f1400c2afa1 +:10b040001400c28fffff42301400c2af1400c28f41 +:10b0500017004010000000001400c38f0300023ce2 +:10b06000251862002800c28f21206000212840009e +:10b070001c000624fc78400f000000001000c2a352 +:10b080001000c28314004014000000002800c28f8a +:10b09000000043941200c2970f00621000000000ed +:10b0a000f4ff02241000c2a3366c400b0000000025 +:10b0b000f4ff02241000c2a3366c400b0000000015 +:10b0c000f4ff02241000c2a3366c400b0000000005 +:10b0d000f4ff02241000c2a31000c28321e8c003c1 +:10b0e0002400bf8f2000be8f2800bd270800e0038a +:10b0f00000000000d8ffbd272400bfaf2000beaf76 +:10b1000021f0a0032800c4af1200c0a71400c0aff4 +:10b110001000c0a31800c0af1c00c0af2800c28f31 +:10b1200021204000212800001c000624f27a400f54 +:10b13000000000001200c22721200000212840004a +:10b14000b06b400f000000001200c2978213020093 +:10b15000ffff4230ff004230030043300200022470 +:10b1600040006214000000001400c2279c14042454 +:10b1700021284000c878400f000000001000c2a342 +:10b180001000c28339004014000000001400c28f78 +:10b1900030004010000000001400c38f0300023c88 +:10b1a000251862001800c2272120600021284000d5 +:10b1b00008000624fc78400f000000001000c2a325 +:10b1c0001000c28329004014000000001c00c28f40 +:10b1d0001400c2af1400c28f021402001400c2afe8 +:10b1e0001400c28f17004010000000001400c38f2d +:10b1f0000300023c251862002800c28f2120600055 +:10b20000212840001c000624fc78400f00000000ac +:10b210001000c2a31000c2831400401400000000fc +:10b220002800c28f000043941200c2970f006210e2 +:10b2300000000000f4ff02241000c2a39b6c400b2e +:10b2400000000000f4ff02241000c2a39b6c400b1e +:10b2500000000000f4ff02241000c2a39b6c400b0e +:10b2600000000000f4ff02241000c2a31000c283fb +:10b2700021e8c0032400bf8f2000be8f2800bd2717 +:10b280000800e00300000000e0ffbd271c00bfaf86 +:10b290001800beaf21f0a0032000c4af1000c0a36f +:10b2a000212000002000c58f8d78400f0000000095 +:10b2b0001000c2a31000c2830a0040140000000066 +:10b2c000854a400f000000000200023c00034434a5 +:10b2d00021280000d878400f00000000ba6c400b15 +:10b2e00000000000000000001000c28321e8c0033d +:10b2f0001c00bf8f1800be8f2000bd270800e00390 +:10b3000000000000e0ffbd271c00bfaf1800beaf6b +:10b3100021f0a0032000c4af1000c0a32120000032 +:10b320002000c58f8d78400f000000001000c2a3e0 +:10b330001000c28316004014000000007135400f59 +:10b34000000000001000c2a30a0004249780400ff0 +:10b35000000000001000c28308004014000000003c +:10b36000854a400f00000000a633400f0000000097 +:10b370001000c283e66c400b0000000000000000db +:10b38000a078400f00000000e56c400b00000000ba +:10b39000000000001000c28321e8c0031c00bf8f22 +:10b3a0001800be8f2000bd270800e0030000000049 +:10b3b000e0ffbd271c00bfaf1800beaf21f0a00307 +:10b3c0002000c4af1000c0a3010002241100c2a3da +:10b3d0002000c28f08004010000000002000c28f33 +:10b3e00000004390020002240300621400000000e9 +:10b3f000020002241100c2a32d34400f00000000ff +:10b400001000c2a31000c2831e0040140000000000 +:10b410001100c293212040000536400f00000000bb +:10b420001000c2a31000c2831900401400000000e5 +:10b430001100c293212040006836400f0000000038 +:10b440001000c2a31000c2831400401400000000ca +:10b450001100c393020002241a00621000000000d1 +:10b46000eb33400f000000001000c2a31000c283a5 +:10b470000d004014000000001000c283336d400b2b +:10b4800000000000000000002b6d400b00000000d9 +:10b49000000000002b6d400b0000000000000000c9 +:10b4a0002b6d400b0000000000000000a078400f52 +:10b4b00000000000cb4a400f00000000326d400b3e +:10b4c00000000000000000001000c28321e8c0035b +:10b4d0001c00bf8f1800be8f2000bd270800e003ae +:10b4e00000000000e0ffbd271c00bfaf1800beaf8a +:10b4f00021f0a0032000c4af2400c5af1000c0a3fa +:10b500002400c48fc16c400f000000001000c2a3d3 +:10b510001000c28305004014000000002000c48f0a +:10b52000ec6c400f000000001000c2a31000c283aa +:10b5300021e8c0031c00bf8f1800be8f2000bd276c +:10b540000800e00300000000e0ffbd271c00bfafc3 +:10b550001800beaf21f0a0032000c4afb036400fea +:10b56000000000001000c2a31000c2830b004014b2 +:10b5700000000000a078400f000000001000c2a3ef +:10b580001000c2830800401400000000cb4a400fa6 +:10b59000000000006b6d400b000000000000000088 +:10b5a0006b6d400b00000000000000001000c28323 +:10b5b00021e8c0031c00bf8f1800be8f2000bd27ec +:10b5c0000800e00300000000e0ffbd271c00bfaf43 +:10b5d0001800beaf21f0a0032d34400f0000000082 +:10b5e0001000c2a31000c28321e8c0031c00bf8f5b +:10b5f0001800be8f2000bd270800e00300000000f7 +:10b60000e0ffbd271c00beaf21f0a00388bf033cb4 +:10b610000061628c4429027c006162ac88bf033cfb +:10b620000061628c8431027c006162ac88bf033ca3 +:10b630002061628c010004248431827c206162ac30 +:10b6400088bf033c2061628c4429027c206162ac8b +:10b6500088bf033c4061628c4408027c406162ac5c +:10b6600088bf033c6061628c010004244408827c32 +:10b67000606162ac88bf033c8061628c010004247d +:10b68000c439827c806162ac88bf033c4060628cbc +:10b69000446b027c406062ac88bf033c8061628c7a +:10b6a0000442027c806162ac88bf033c8061628c92 +:10b6b0008431027c806162ac88bf033c0061628c93 +:10b6c000c418027c006162ac88bf033c2061628cbc +:10b6d00001000424c418827c206162ac88bf033c52 +:10b6e0000061628c0400027c006162ac88bf033c94 +:10b6f0002061628c010004240400827c206162ac21 +:10b7000088bf033cc060628c010004240400827c7a +:10b71000c06062ac88bf033c0061628c8410027c14 +:10b72000006162ac88bf033c2061628c8410027ca3 +:10b73000206162ac88bf033c0061628c0421027c02 +:10b74000006162ac88bf033c2061628c0421027cf2 +:10b75000206162ac88bf033c6010628cc418027c1c +:10b76000601062ac88bf033c3010628cc418027c4d +:10b77000301062ac88bf033c0010628c0400027c75 +:10b78000001062ac88bf033c9010628c030004245c +:10b7900084e6827c901062ac88bf033c9010628c7f +:10b7a00004ce027c901062ac88bf033c6010628cb7 +:10b7b00001000424c418827c601062ac80bf023c8b +:10b7c000005a40ac80bf033c005a628c0100042444 +:10b7d0004429827c005a62ac80bf033c005a628cd0 +:10b7e000010004240442827c005a62ac80bf033c06 +:10b7f000005a628c444a027c005a62ac80bf033c0f +:10b80000005a628c8431027c005a62acc404023c4f +:10b8100000b442340000c2af0f00023c4042423448 +:10b820000400c2af0400c28f401002000000c38faa +:10b830001b006200f401400010180000121000000c +:10b840000800c2af0400c28f401002000000c38f86 +:10b850001b006200f40140001010000004004010c2 +:10b86000000000000800c28f010042240800c2af9f +:10b870000800c28f0101422c0300401400000000a8 +:10b88000000102240800c2af0800c28f040040106b +:10b89000000000000800c28fffff42240800c2af72 +:10b8a0000800c28fff0042302118400080bf023cd8 +:10b8b000305a43ac80bf033c005a628c0100042420 +:10b8c000c47b827c005a62ac88bf033c0061628cfe +:10b8d000c439027c006162ac88bf033c8061628c29 +:10b8e000444a027c806162ac88bf033c2061628c68 +:10b8f000c439027c206162ac88bf033ca061628cc9 +:10b90000444a027ca06162ac88bf033cc060628c88 +:10b910008431027cc06062ac88bf033ce060628c12 +:10b920008431027ce06062ac88bf033c4060628c82 +:10b9300001000424c47b827c406062ac88bf033c6d +:10b940004060628c010004244408827c406062ac48 +:10b9500081bf023cffff0334609043ac81bf033cd6 +:10b960006090628c4408027c609062ac88bf033cab +:10b970004060628c010004244408827c406062ac18 +:10b9800081bf023c009040ac81bf023c109040acb3 +:10b9900081bf023c209040ac81bf023c409040ac53 +:10b9a00081bf033c4090628c01000424049c827c93 +:10b9b000409062ac81bf023cf0ff0324209043a082 +:10b9c00081bf033c2090628c010004240462827ccd +:10b9d000209062ac81bf033c0090628c0100042483 +:10b9e000c47b827c009062ac81bf033c0090628c7f +:10b9f000010004244408827c009062ac88bf033cb0 +:10ba0000c060628c0421027cc06062ac88bf033cd1 +:10ba1000e060628c010004240421827ce06062ac5e +:10ba200088bf033cc060628cc418027cc06062acfa +:10ba300088bf033cc060628c010004248410827cb7 +:10ba4000c06062ac88bf033cc060628c4408027c6a +:10ba5000c06062ac80bf023c005840ac80bf033c79 +:10ba60000058628c010004244429827c005862ac96 +:10ba700080bf033c0058628c010004240442827c95 +:10ba8000005862ac80bf033c0058628c444a027c80 +:10ba9000005862ac80bf033c0058628c8431027c49 +:10baa000005862acc404023c00b442340c00c2af83 +:10bab0000f00023c404242341000c2af1000c28f5f +:10bac000401002000c00c38f1b006200f401400014 +:10bad00010180000121000001400c2af1000c28f36 +:10bae000401002000c00c38f1b006200f4014000f4 +:10baf0001010000004004010000000001400c28f6d +:10bb0000010042241400c2af1400c28f0101422c74 +:10bb10000300401400000000000102241400c2af22 +:10bb20001400c28f04004010000000001400c28ff7 +:10bb3000ffff42241400c2af1400c28fff00423046 +:10bb40002118400080bf023c305843ac80bf033c0a +:10bb50000058628c01000424c47b827c005862acd3 +:10bb600088bf033c4060628c010004248410827c06 +:10bb7000406062ac88bf033c4060628c01000424da +:10bb80000400827c406062ac88bf033cc060628c71 +:10bb9000c45a027cc06062ac88bf033ce060628c27 +:10bba000c45a027ce06062ac88bf033cc060628c17 +:10bbb000010004240442827cc06062ac88bf033c64 +:10bbc0008060628c8473027c806062ac88bf033cbe +:10bbd000a060628c010004248473827ca06062ac4b +:10bbe00088bf033c8060628c446b027c806062ace6 +:10bbf00088bf033ca060628c01000424446b827cfb +:10bc0000a06062ac88bf033cc060628c4429027ca7 +:10bc1000c06062ac88bf033ce060628c4429027c57 +:10bc2000e06062ac88bf033c4060628c446b027c85 +:10bc3000406062ac88bf033c6060628c446b027cf5 +:10bc4000606062ac88bf033c4060628c0463027c2d +:10bc5000406062ac88bf033c6060628c0463027c1d +:10bc6000606062ac88bf033c4060628cc418027c98 +:10bc7000406062ac88bf033c6060628cc418027c88 +:10bc8000606062ac88bf033c4060628c444a027cc6 +:10bc9000406062ac88bf033c6060628c444a027cb6 +:10bca000606062ac88bf033c4060628c8452027c5e +:10bcb000406062ac88bf033c6060628c8452027c4e +:10bcc000606062ac88bf033c4060628cc45a027cf6 +:10bcd000406062ac88bf033c6060628cc45a027ce6 +:10bce000606062ac0100022421e8c0031c00be8f2a +:10bcf0002000bd270800e00300000000b8ffbd27ba +:10bd00004400bfaf4000beaf21f0a0034800c4af65 +:10bd10004c00c5af88bf033ca060628c01000424c6 +:10bd20008473827ca06062ac3984400f0000000004 +:10bd30004800c28f1300422c4b014010000000004d +:10bd40004800c28f80180200029d023c60bd422460 +:10bd5000211062000000428c08004000000000003a +:10bd600068c2019d68c2019dacbd019d68c2019d74 +:10bd700098bf019d68c2019dc4bf019d68c2019d1d +:10bd800068c2019d68c2019d68c2019d68c2019d93 +:10bd900068c2019d68c2019d44c0019d68c2019da9 +:10bda000f4c0019d68c2019da4c1019dd17f400fd7 +:10bdb000000000002400c2affd89400f0000000019 +:10bdc0002800c2af2400c2270000428c1400c2af7a +:10bdd0002800c2270000428c1800c2afeb7f400f42 +:10bde000000000001c00c2aff47f400f0000000004 +:10bdf0002000c2af1000c0a36f84400f00000000fd +:10be00002118400001000224040062140000000018 +:10be10001000c293010042341000c2a30d80400ff5 +:10be200000000000211840000100022404006214f8 +:10be3000000000001000c293020042341000c2a3b0 +:10be40001000c2932c00c2a3252b400f000000005d +:10be50002014027c2d00c2a31400c28f2014027c87 +:10be60002e00c2a31400c28f021202001400c2af3f +:10be70001400c28f2014027c2f00c2a31400c28fb2 +:10be8000021202001400c2af1400c28f2014027c00 +:10be90003000c2a31400c28f021202001400c2af0d +:10bea0001400c28f2014027c3100c2a31c00c28f78 +:10beb0002014027c3200c2a31c00c28f03120200b5 +:10bec0001c00c2af1c00c28f2014027c3300c2a32e +:10bed0002000c28f2014027c3400c2a31c00c28f39 +:10bee000031202001c00c2af1c00c28f2014027c8f +:10bef0003500c2a31800c28f2014027c3600c2a3f2 +:10bf00001800c28f021202001800c2af1800c28fc0 +:10bf10002014027c3700c2a31800c28f0212020054 +:10bf20001800c2af1800c28f2014027c3800c2a3d0 +:10bf30001800c28f021202001800c2af1800c28f90 +:10bf40002014027c3900c2a32c00c2270300042461 +:10bf5000212840000e000624a070400f00000000c1 +:10bf600088bf023c2061428c4001427cff0042308d +:10bf700027100200ff00423001004230ff00443031 +:10bf800088bf033c2061628c4429827c206162acc2 +:10bf90009a70400b000000006f84400f000000000a +:10bfa0003a00c2a33a00c227050004242128400019 +:10bfb00001000624a070400f000000009a70400ba2 +:10bfc00000000000020002243b00c2a34c00c28f0c +:10bfd0000000429006004014000000005b84400f07 +:10bfe000000000003b00c0a30970400b00000000ef +:10bff0004c00c28f0000439001000224070062142d +:10c00000000000004784400f0000000001000224ef +:10c010003b00c2a30970400b000000000200022494 +:10c020003b00c2a33b00c227070004242128400094 +:10c0300001000624a070400f000000009a70400b21 +:10c0400000000000040002243c00c2a34c00c28f88 +:10c05000000042900600401400000000c52a400f76 +:10c06000000000003c00c0a33570400b0000000041 +:10c070004c00c28f000043900100022413006214a0 +:10c0800000000000252b400f000000002118400098 +:10c090000100022409006210000000000f2a400f76 +:10c0a00000000000252b400f000000002014027c3f +:10c0b0003c00c2a33570400b0000000001000224c8 +:10c0c0003c00c2a33570400b0000000004000224b5 +:10c0d0003c00c2a33c00c2270f00042421284000da +:10c0e00001000624a070400f000000009a70400b71 +:10c0f000000000004c00c28f00004390ba000224f0 +:10c100001f006214000000004c00c28f0100422496 +:10c1100000004390ad0002241900621400000000ea +:10c120004c00c28f0200422400004390be00022453 +:10c1300013006214000000004c00c28f0300422470 +:10c1400000004390ef0002240d0062140000000084 +:10c15000010002243d00c2a33d00c22711000424b7 +:10c160002128400001000624a070400f00000000bc +:10c17000488e400f000000009a70400b0000000045 +:10c180003d00c0a33d00c227110004242128400027 +:10c1900001000624a070400f000000009a70400bc0 +:10c1a000000000004c00c28f00004390ba0002243f +:10c1b00025006214000000004c00c28f01004224e0 +:10c1c00000004390ad0002241f0062140000000034 +:10c1d0004c00c28f0200422400004390ca00022497 +:10c1e00019006214000000004c00c28f03004224ba +:10c1f00000004390fe0002241300621400000000bf +:10c20000010002243e00c2a33e00c2271300042402 +:10c210002128400001000624a070400f000000000b +:10c2200064000424a161400f00000000c52a400ff3 +:10c230000000000064000424a161400f0000000021 +:10c24000a98d400f000000003e00c0a33e00c227a1 +:10c25000110004242128400001000624a070400f92 +:10c26000000000000000000021e8c0034400bf8f70 +:10c270004000be8f4800bd270800e003000000001a +:10c28000d0ffbd272c00bfaf2800beaf21f0a00318 +:10c290003000c4af3400c5af3800c6af3000c28f25 +:10c2a000ff0042302400c3273400c48f1000a4af25 +:10c2b0003800c48f1400a4af1800a0af1c00a3afb7 +:10c2c00021200000010005240e0006242138400032 +:10c2d0001d69400f000000002000c2af508082277f +:10c2e000212040000300052421300000ab4c400f0a +:10c2f000000000002000c38f2400c28f21206000b6 +:10c300002128400021300000ab4c400f000000000d +:10c3100021e8c0032c00bf8f2800be8f3000bd274e +:10c320000800e00300000000e0ffbd271c00bfafd5 +:10c330001800beaf21f0a003030002241000c2a326 +:10c340005080822721204000030005242130000076 +:10c35000ab4c400f0000000021e8c0031c00bf8f61 +:10c360001800be8f2000bd270800e0030000000079 +:10c37000e0ffbd271c00bfaf1800beaf21f0a00337 +:10c38000211880002110a0002000c3a32400c2a710 +:10c390001000c0afef70400b0000000000a0023c96 +:10c3a000441d43241000c28f21106200000040a0f1 +:10c3b0001000c28f010042241000c2af1000c28fd3 +:10c3c0000a00422cf5ff40140000000000a0023ccf +:10c3d00080ff0324441d43a000a0023c441d4224ce +:10c3e0002000c393010043a02400c2970212020060 +:10c3f000ffff4230ff00433000a0023c441d4224b6 +:10c40000020043a02400c297ff00433000a0023c7a +:10c41000441d4224030043a000a0023c441d4424c8 +:10c42000040005248c72400f0000000021e8c003c6 +:10c430001c00bf8f1800be8f2000bd270800e0033e +:10c4400000000000e0ffbd271c00bfaf1800beaf1a +:10c4500021f0a003211080002400c5af2000c2a35a +:10c46000010002241400c2af1000c0af2571400bc0 +:10c470000000000000a0023c441d43241000c28fb5 +:10c4800021106200000040a01000c28f0100422471 +:10c490001000c2af1000c28f0a00422cf5ff4014fa +:10c4a0000000000000a0023c80ff0324441d43a0c4 +:10c4b00000a0023c441d42242000c393010043a07d +:10c4c00000a0023c441d422481ff0324020043a03b +:10c4d00000a0023c441d4424020005248c72400f3d +:10c4e0000000000000a0023c441d422402004290d3 +:10c4f0002120400000a0023c381d452402000624f3 +:10c500000873400f000000001400c2af1400c38f76 +:10c510000100022405006210000000002400c28f08 +:10c52000000040a45871400b0000000000a0023c35 +:10c53000381d429000120200201e027c00a0023c26 +:10c54000381d4224010042902016027c2510620012 +:10c550002016027cffff43302400c28f000043a45a +:10c5600021e8c0031c00bf8f1800be8f2000bd272c +:10c570000800e00300000000e0ffbd271c00bfaf83 +:10c580001800beaf21f0a0030a000224288182af68 +:10c59000020002242c8182af05000424001005242f +:10c5a000dc70400f000000001f5c02241000c2a7d6 +:10c5b0001000c2972120000021284000dc70400fad +:10c5c0000000000021e8c0031c00bf8f1800be8fd0 +:10c5d0002000bd270800e00300000000e0ffbd27a9 +:10c5e0001c00bfaf1800beaf21f0a0030a00022458 +:10c5f000288182af020002242c8182af050004242e +:10c6000000100524dc70400f000000001f5c0224b5 +:10c610001000c2a71000c29721200000212840006e +:10c62000dc70400f0000000021e8c0031c00bf8f39 +:10c630001800be8f2000bd270800e00300000000a6 +:10c64000e0ffbd271c00bfaf1800beaf21f0a00364 +:10c6500019000224288182af010002242c8182afbc +:10c660000500042400280524dc70400f00000000b1 +:10c670001f5c02241000c2a71000c29721200000f6 +:10c6800021284000dc70400f0000000021e8c003ba +:10c690001c00bf8f1800be8f2000bd270800e003dc +:10c6a00000000000e0ffbd271c00bfaf1800beafb8 +:10c6b00021f0a00328000224288182af0100022477 +:10c6c0002c8182af0500042400400524dc70400f5b +:10c6d000000000001f0c02241000c2a71000c29727 +:10c6e0002120000021284000dc70400f00000000e5 +:10c6f00021e8c0031c00bf8f1800be8f2000bd279b +:10c700000800e00300000000e0ffbd271c00bfaff1 +:10c710001800beaf21f0a00364000224288182af7c +:10c72000010002242c8182af0500042400a00534fe +:10c73000dc70400f000000001f0402241000c2a79c +:10c740001000c2972120000021284000dc70400f1b +:10c750000000000021e8c0031c00bf8f1800be8f3e +:10c760002000bd270800e00300000000e0ffbd2717 +:10c770001c00bfaf1800beaf21f0a00301000224cf +:10c780001000c2af2120000000800534dc70400f93 +:10c79000000000001000c2af1400c22721200000da +:10c7a000212840001171400f000000001400c397c1 +:10c7b000ff39022404006210000000002110000074 +:10c7c000f571400b000000005e71400f000000009a +:10c7d0001000c28f21e8c0031c00bf8f1800be8f5d +:10c7e0002000bd270800e00300000000e0ffbd2797 +:10c7f0001c00bfaf1800beaf21f0a003010004244d +:10c800001000c227212840001171400f00000000d5 +:10c810001000c2972016027c21e8c0031c00bf8fc5 +:10c820001800be8f2000bd270800e00300000000b4 +:10c83000e0ffbd271c00bfaf1800beaf21f0a00372 +:10c84000020004241000c227212840001171400f6b +:10c85000000000001000c297c2100200ffff42302b +:10c8600080100200ffff42302016027c21e8c00346 +:10c870001c00bf8f1800be8f2000bd270800e003fa +:10c8800000000000e0ffbd271c00bfaf1800beafd6 +:10c8900021f0a003030004241000c2272128400037 +:10c8a0001171400f000000001000c2972016027c9a +:10c8b00021e8c0031c00bf8f1800be8f2000bd27d9 +:10c8c0000800e00300000000e0ffbd271c00bfaf30 +:10c8d0001800beaf21f0a003030004241000c227fb +:10c8e000212840001171400f000000001000c29785 +:10c8f000211840002c81828f1b006200f40140004f +:10c9000010180000121000002016027c21e8c0035d +:10c910001c00bf8f1800be8f2000bd270800e00359 +:10c9200000000000e0ffbd271c00bfaf1800beaf35 +:10c9300021f0a003040004241000c2272128400095 +:10c940001171400f000000001000c2972016027cf9 +:10c9500021e8c0031c00bf8f1800be8f2000bd2738 +:10c960000800e00300000000e0ffbd271c00bfaf8f +:10c970001800beaf21f0a003040004241000c22759 +:10c98000212840001171400f000000001000c297e4 +:10c99000211840002881828f1b006200f4014000b2 +:10c9a00010180000121000002016027c21e8c003bd +:10c9b0001c00bf8f1800be8f2000bd270800e003b9 +:10c9c00000000000f0ffbd270c00beaf21f0a00367 +:10c9d0008e0102240000c2af80bf023c005040ac78 +:10c9e00080bf033c0050628c01000424444a827cd6 +:10c9f000005062ac0000c38f80bf023c405043ac8b +:10ca000080bf033c0050628c01000424c47b827c04 +:10ca1000005062acd08180afd48180af21e8c003e8 +:10ca20000c00be8f1000bd270800e00300000000ce +:10ca3000f0ffbd270c00beaf21f0a0031000c4af73 +:10ca40002110a0001400c2a3010002240000c2af04 +:10ca500080bf033c0050628c010004240400827cef +:10ca6000005062ac0000000080bf023c0050428ccd +:10ca700001004230fcff40140000000080bf023c77 +:10ca80001050428c000442300500401000000000ad +:10ca9000d08180af21100000f872400b0000000030 +:10caa0000400c0afd072400b000000000400c28f31 +:10cab0001000c38f21106200000042902118400036 +:10cac00080bf023c505043acd48180afc872400b51 +:10cad0000000000080bf023c1050428c0004423035 +:10cae0000b00401400000000d481828f0c00033c36 +:10caf000013563342a18430001006338ff006330b6 +:10cb000001004224d48182af0500601000000000c3 +:10cb1000d08180af0000c0afcd72400b000000009c +:10cb200080bf023c1050428c00404230e9ff40146c +:10cb3000000000000400c28f010042240400c2afc4 +:10cb40001400c3930400c28f2a104300d7ff40147f +:10cb50000000000080bf033c0050628c01000424f0 +:10cb60008410827c005062acd48180aff072400ba4 +:10cb70000000000080bf023c1050428c0004423094 +:10cb80000b00401400000000d481828f0c00033c95 +:10cb9000013563342a18430001006338ff00633015 +:10cba00001004224d48182af050060100000000023 +:10cbb000d08180af0000c0aff572400b00000000d4 +:10cbc00080bf023c0050428c04004230e9ff401418 +:10cbd0000000000001000224d08182af0000c28f5b +:10cbe00021e8c0030c00be8f1000bd270800e00341 +:10cbf00000000000f8ffbd270400beaf21f0a00335 +:10cc0000211080000800c2a32110000021e8c00309 +:10cc10000400be8f0800bd270800e00300000000ec +:10cc2000f0ffbd270c00beaf21f0a003211880004b +:10cc30001400c5af2110c0001000c3a31800c2a388 +:10cc4000010002240400c2af80bf033c0050628c8c +:10cc5000010004240400827c005062acd48180afc7 +:10cc60002373400b0000000080bf023c1050428c38 +:10cc7000000442300500401000000000d08180af69 +:10cc800021100000c073400b0000000080bf023c78 +:10cc90000050428c01004230f3ff401400000000bd +:10cca0001000c39380bf023c505043acd48180af8e +:10ccb0004173400b0000000080bf023c1050428cca +:10ccc000000442300b00401400000000d481828f29 +:10ccd0000c00033c013563342a184300010063381b +:10cce000ff00633001004224d48182af0500601050 +:10ccf00000000000d08180af21100000c073400b05 +:10cd00000000000080bf023c1050428c00404230c6 +:10cd1000e9ff4014000000000000c0af9873400b12 +:10cd20000000000080bf033c0050628c010004241e +:10cd3000c418827c005062acd48180af6473400b15 +:10cd40000000000080bf023c1050428c00044230c2 +:10cd50000b00401400000000d481828f0c00033cc3 +:10cd6000013563342a18430001006338ff00633043 +:10cd700001004224d48182af050060100000000051 +:10cd8000d08180af21100000c073400b0000000074 +:10cd900080bf023c0050428c08004230e9ff401442 +:10cda000000000000000c28f1400c38f2110620039 +:10cdb00080bf033c6050638cff006330000043a0e1 +:10cdc00080bf033c0050628c010004244429827c13 +:10cdd000005062ac80bf033c0050628c0100042410 +:10cde0000421827c005062acd48180af9073400bf0 +:10cdf0000000000080bf023c1050428c0004423012 +:10ce00000b00401400000000d481828f0c00033c12 +:10ce1000013563342a18430001006338ff00633092 +:10ce200001004224d48182af0500601000000000a0 +:10ce3000d08180af21100000c073400b00000000c3 +:10ce400080bf023c0050428c10004230e9ff401489 +:10ce5000000000000000c28f010042240000c2afa9 +:10ce60001800c3930000c28f2a104300adff401486 +:10ce70000000000080bf033c0050628c01000424cd +:10ce80008410827c005062acd48180afb873400bb8 +:10ce90000000000080bf023c1050428c0004423071 +:10cea0000b00401400000000d481828f0c00033c72 +:10ceb000013563342a18430001006338ff006330f2 +:10cec00001004224d48182af050060100000000000 +:10ced000d08180af21100000c073400b0000000023 +:10cee00080bf023c0050428c04004230e9ff4014f5 +:10cef0000000000001000224d08182af0400c28f34 +:10cf000021e8c0030c00be8f1000bd270800e0031d +:10cf100000000000f8ffbd270400beaf21f0a00311 +:10cf2000d081828f21e8c0030400be8f0800bd2796 +:10cf30000800e0030000000098ffbd276400bfafb9 +:10cf40006000beaf21f0a003010002241000c2afb8 +:10cf5000c404023c00b442341400c2af05000224f1 +:10cf60001800c2af6190400f000000001c00c2af6b +:10cf700088bf023c40000324042043ac1800c28f49 +:10cf800001004230ff0042301d0040100000000050 +:10cf90001400c28f2000c2af2400c0aff173400b59 +:10cfa000000000002400c28f010042242400c2af10 +:10cfb0002000c38f36fe023c803c423421106200c8 +:10cfc0002000c2af2000c38fc901023c81c342349c +:10cfd0002b106200f3ff4010000000006190400f32 +:10cfe000000000002800c2af88bf023c2400c38fad +:10cff000004043ac2800c48feb8f400f00000000be +:10d000001800c28f0200423068004010000000008b +:10d010001400c28f2c00c2af2c00c28f3000c2aff0 +:10d020002c00c38fc404023c01b442342b106200b4 +:10d0300008004014000000000800023c3400c2afa9 +:10d040003000c28f421002003000c2af1674400b95 +:10d05000000000003400c0af3400c28f3800c2afff +:10d060006190400f000000003c00c2af88bf023c4e +:10d070000030428c0003427cff0042304000c2afcf +:10d080004000c28f090040140000000088bf023c2d +:10d0900000100324083043ac88bf023c0030428caf +:10d0a00000084230fcff4014000000004000c28f26 +:10d0b0004400c2af81bf023c30f240ac81bf023cb1 +:10d0c00099aa033c5566633430f243ac81bf023cfd +:10d0d0006655033caa99633430f243ac81bf023ced +:10d0e00000f0428c5800c2af5800c28fc4a4027c2a +:10d0f0005800c2af5800c38f3800c28f251062009d +:10d100005800c2af5800c38f81bf023c00f043ac4f +:10d1100081bf023c00f0428c5800c2af81bf023c8c +:10d120003333033c3333633430f243ac4400c28fb7 +:10d130004800c2af4800c28f13004010000000003a +:10d1400088bf023c0030428c0003427cff0042302a +:10d150004c00c2af4c00c28f100040140000000011 +:10d1600088bf023c00100324083043ac88bf023c57 +:10d170000030428c00084230fcff401400000000e8 +:10d180006874400b0000000088bf023c00100324bc +:10d19000043043ac6874400b000000000000000045 +:10d1a0003c00c48feb8f400f000000001800c28fbe +:10d1b000040042300c0040100000000088bf023c18 +:10d1c0000040428c5000c2af5000c28f3000423449 +:10d1d0005000c2af88bf023c5000c38f004043ac38 +:10d1e0000590400f000000001400c28f5400c2af31 +:10d1f00081bf023c00f0428cc00c427cff004230f8 +:10d200005400c38f061043005400c2af1c00c48feb +:10d21000eb8f400f0000000021200000928f400f94 +:10d220000000000081bf033c00f0628c4408027cd7 +:10d2300000f062ac81bf023cffff0334609043ac5e +:10d24000806d400f000000005f90400f0000000064 +:10d25000175f400f000000008d8b400f00000000a2 +:10d26000e183400f00000000587f400f00000000e5 +:10d270003c8e400f00000000d589400f00000000e8 +:10d280009120400f000000003967400f00000000af +:10d290005052400f000000007984400f0000000051 +:10d2a000029d023c203e4424578f400f00000000a6 +:10d2b000ad52400f00000000e689400f0000000062 +:10d2c0005b2d400f00000000b64e400f0000000034 +:10d2d0000f2a400f000000002120000090010524cb +:10d2e000eb60400f00000000029d023c3c3e4424e5 +:10d2f00001000524688f400f00000000a28b400f42 +:10d3000000000000b88b400f000000000100022464 +:10d310001000c2afee74400b00000000b88b400f4d +:10d32000000000002e2b400f00000000d64e400fe2 +:10d33000000000007d25400f00000000f883400f32 +:10d3400000000000747f400f000000008e84400f3a +:10d3500000000000068a400f00000000702d400f02 +:10d360000000000021200000fe5f400f00000000d0 +:10d37000110040100000000088bf023c2061428c78 +:10d380008001427cff00423027100200ff00423043 +:10d3900001004230ff00443088bf033c2061628cb2 +:10d3a0008431827c206162ac212000009001052440 +:10d3b000eb60400f000000001000c38f010002244a +:10d3c000d6ff6210000000001000c28f21e8c003e9 +:10d3d0006400bf8f6000be8f6800bd270800e003b7 +:10d3e00000000000e8ffbd271400bfaf1000beaf73 +:10d3f00021f0a003806d400f0000000021e8c00371 +:10d400001400bf8f1000be8f1800bd270800e00376 +:10d4100000000000e8ffbd271400bfaf1000beaf42 +:10d4200021f0a003211080001800c2a31800c283bd +:10d4300021204000b584400f0000000021e8c00317 +:10d440001400bf8f1000be8f1800bd270800e00336 +:10d4500000000000d0ffbd272c00bfaf2800beafea +:10d4600021f0a003211880002110a0003800c6afd1 +:10d470003000c3a33400c2a71000c0a33000c39380 +:10d480006b0002241c006214000000001400c2277c +:10d49000212040002128000010000624f27a400fcd +:10d4a000000000001400c2273800c48f212840006b +:10d4b0001000062421380000823c400f00000000cc +:10d4c0001000c2a31000c2832a0040140000000014 +:10d4d000b480828f2700401000000000b480828f4b +:10d4e0001400c3272120600009f84000000000005c +:10d4f0005d75400b000000003000c3936c000224f7 +:10d500001c006214000000002400c22721204000fb +:10d510002128000004000624f27a400f00000000d9 +:10d520002400c2273800c48f2128400004000624ac +:10d5300021380000823c400f000000001000c2a310 +:10d540001000c2830b00401400000000b080828fe6 +:10d550000800401000000000b080828f2400c393b8 +:10d56000212060002500c3932128600009f84000b5 +:10d570000000000021e8c0032c00bf8f2800be8ff0 +:10d580003000bd270800e00300000000e0ffbd27d9 +:10d590001c00bfaf1800beaf21f0a0032000c4af35 +:10d5a0002400c5af1000c0a32000c28f03004010ac +:10d5b000000000002000c28fb08082af2400c28f24 +:10d5c00003004010000000002400c28fb48082af2e +:10d5d00004000424029d023c54d44524193d400f0c +:10d5e000000000001000c28321e8c0031c00bf8fb0 +:10d5f0001800be8f2000bd270800e00300000000d7 +:10d60000d0ffbd272c00bfaf2800beaf21f0a00384 +:10d610003000c4af2000c0a33000c48f107b400f87 +:10d6200000000000010042242200c2a72200c2978d +:10d630001000a0af1400a0af1800a0af0400042495 +:10d64000670005243000c68f21384000ff39400fa5 +:10d65000000000002000c2a32000c28321e8c00314 +:10d660002c00bf8f2800be8f3000bd270800e003cc +:10d6700000000000d0ffbd272c00bfaf2800beafc8 +:10d6800021f0a0032000c0a31000a0af1400a0afa1 +:10d690001800a0af04000424650005242130000018 +:10d6a00021380000ff39400f000000002000c2a315 +:10d6b0002000c28321e8c0032c00bf8f2800be8f4a +:10d6c0003000bd270800e00300000000d0ffbd27a8 +:10d6d0002c00bfaf2800beaf21f0a0033000c4afc4 +:10d6e0002000c0a31000a0af1400a0af1800a0af8e +:10d6f00004000424650005242130000021380000c6 +:10d70000ff39400f000000002000c2a32000c283a8 +:10d7100021e8c0032c00bf8f2800be8f3000bd273a +:10d720000800e00300000000d0ffbd272c00bfafc1 +:10d730002800beaf21f0a0033000c4af2000c0a37a +:10d740003000c48f107b400f000000000100422415 +:10d750002200c2a72200c2971000a0af1400a0af01 +:10d760001800a0af04000424670005243000c68f11 +:10d7700021384000ff39400f000000002000c2a304 +:10d780002000c28321e8c0032c00bf8f2800be8f79 +:10d790003000bd270800e00300000000b8ffbd27ef +:10d7a0004400bfaf4000beaf21f0a0032000c0a3e3 +:10d7b0002400c227212040006516400f0000000011 +:10d7c0002000c2a32000c283170040140000000004 +:10d7d0002400c29782130200ffff4230ff00423054 +:10d7e00003004330020002240d0062140000000018 +:10d7f0001000a0af1400a0af1800a0af04000424d4 +:10d80000690005242130000021380000ff39400f55 +:10d81000000000002000c2a30a76400b00000000b8 +:10d82000f4ff02242000c2a32000c28321e8c00329 +:10d830004400bf8f4000be8f4800bd270800e003b2 +:10d8400000000000d0ffbd272c00bfaf2800beaff6 +:10d8500021f0a0032000c0a31000a0af1400a0afcf +:10d860001800a0af040004246a0005242130000041 +:10d8700021380000ff39400f000000002000c2a343 +:10d880002000c28321e8c0032c00bf8f2800be8f78 +:10d890003000bd270800e00300000000b8ffbd27ee +:10d8a0004400bfaf4000beaf21f0a0032000c0a3e2 +:10d8b0002400c227212040006516400f0000000010 +:10d8c0002000c2a32000c283170040140000000003 +:10d8d0002400c29782130200ffff4230ff00423053 +:10d8e00003004330020002240d0062140000000017 +:10d8f0001000a0af1400a0af1800a0af04000424d3 +:10d90000680005242130000021380000ff39400f55 +:10d91000000000002000c2a34a76400b0000000077 +:10d92000f4ff02242000c2a32000c28321e8c00328 +:10d930004400bf8f4000be8f4800bd270800e003b1 +:04d9400000000000e3 +:020000040000fa +:020000041d01dc +:10d944004a462e636f6d00000a0d000025732025e2 +:10d9540073202573202573202573000068656c707f +:10d9640000000000706f7765720000000a5b73743a +:10d974006174655d20706172616d657465722069a2 +:10d984007320696e76616c69642e20205479706509 +:10d99400202768656c702720666f72206d6f726532 +:10d9a40020696e666f0a00006f6e00005475726e17 +:10d9b400696e67206368616c6574277320696e768d +:10d9c4006572746572204f4e0a0000006f6666002f +:10d9d4005475726e696e67206368616c6574277331 +:10d9e40020696e766572746572204f46460a00009f +:10d9f4000a5b73746174655d20706172616d657436 +:10da0400657220697320696e76616c69642e2020ca +:10da140054797065202768656c702720666f7220c2 +:10da240076616c69642076616c7565730a00000028 +:10da34000a00000077696669000000000a5b7661ed +:10da44006c75655d20706172616d657465722069c5 +:10da54007320696e76616c69642e20205479706538 +:10da6400202768656c702720666f72206d6f726561 +:10da740020696e666f0a00005475726e696e6720c5 +:10da840057694669206d6f64756c65204f4e0a00b6 +:10da94005769466920616c726561647920636f6eb1 +:10daa4006e65637465642e2e2e0a00005475726ec2 +:10dab400696e672057694669206d6f64756c6520cf +:10dac4004f46462e2e2e20476f6f64627965210ad9 +:10dad4000000000057694669206d6f64756c65200d +:10dae400616c7265616479204f46462e2e2e207437 +:10daf4006861742773207765697264210a000000e5 +:10db0400737461747573000057694669206d6f649e +:10db1400756c65204f46460a000000005769466947 +:10db240020436f6e6e65637465640a0057694669c5 +:10db340020446973636f6e6e65637465640a0000e4 +:10db440057694669204552524f520a00576946693f +:10db540020737461746520556e6b6e6f776e210a45 +:10db6400000000006261747465727900256600002b +:10db74004261747465727920566f6c746167653a9a +:10db840020000000256400004261747465727920ed +:10db94006368617267652063757272656e743a209a +:10dba400000000006d410a00766f6c7461676500c7 +:10dbb40063757272656e7400736f6300426174748e +:10dbc40065727920534f433a20000000250a000073 +:10dbd40047656e6572616c207374617475733a0a7b +:10dbe40000000000496e76657274657220706f776c +:10dbf40065722072656c61793a204f46460a0000ce +:10dc0400496e76657274657220706f7765722072e2 +:10dc1400656c61793a204f4e0a000000496e7665c2 +:10dc24007274657220706f7765722072656c6179a9 +:10dc34003a20554e4b4e4f574e0a000057694669dd +:10dc44003a204d6f64756c65206973207475726e2b +:10dc54006564204f46460a00576946693a20436f77 +:10dc64006e6e656374656420746f2041500a000011 +:10dc7400576946693a20446973636f6e6e656374cd +:10dc840065642066726f6d2041500a0057694669c9 +:10dc94003a204d6f64756c6520696e697469616cb6 +:10dca400697a6174696f6e206572726f720a00001e +:10dcb400576946693a20556e6b6e6f776e207374a0 +:10dcc4006174650a00000000252e32660000000021 +:10dcd400560a000025646d410a00000025642525cc +:10dce4000a000000626f6f746c6f616465720000fb +:10dcf4000a5b636f6d6d616e645d20706172616d4e +:10dd04006574657220697320696e76616c69642e2e +:10dd1400202054797065202768656c702720666f11 +:10dd240072206d6f726520696e666f0a00000000d4 +:10dd3400737461727400000041637469766174697c +:10dd44006e6720626f6f746c6f616465720a0000a5 +:10dd540073746f70000000004465616374697661d8 +:10dd640074696e6720626f6f746c6f616465720aa8 +:10dd7400000000000a426f6f746c6f61646572206a +:10dd8400636c69656e7420636f6e6e65637465643d +:10dd94000a0000000a426f6f746c6f616465722040 +:10dda400636c69656e74206e6f7420636f6e6e654c +:10ddb400637465640a0000006465627567000000ae +:10ddc400556e6b6e6f776e20636f6d6d616e640a56 +:04ddd4000a00000041 +:020000040000fa +:020000041d01dc +:10ddd8002148c000214080003b00e0142118a00029 +:10dde8002b10a600480040102010c27008004010f8 +:10ddf800023c090023200200062088000418450080 +:10de0800044846002518830004404800023c0900e5 +:10de18001b006700f401e000ffff2b31022c080013 +:10de2800125000001020000002504b710034040012 +:10de38002530c5002b60ca001b006700f401e00014 +:10de4800090080512330ca002130c9002b18c900ad +:10de5800050060542330ca002b20ca002118c900cd +:10de68000b3064002330ca001b00c700f401e00037 +:10de7800ffff0831122000001018000002208b70ec +:10de8800001c0300254068002b1804011b00c70074 +:10de9800f401e00009006050234004012140090119 +:10dea8002b18090105006054234004012b180401b4 +:10deb800214809010b4023012340040106104800b2 +:10dec8000800e003211800002b10a70047004014a9 +:10ded8002050ea704800401520000c242b10e50063 +:10dee80005004014231086002b108600cd004054f6 +:10def80021108000231086002328a7002b208200f1 +:10df08000800e0032318a4000600c01420102271a2 +:10df1800010002241b004600f401c0001248000062 +:10df28002010227182004054200008242328a900d0 +:10df3800021c0900ffff27311b00a300f401600049 +:10df4800025c0800122000001050000002208770b8 +:10df580000340a002530cb002b50c4001b00a3005e +:10df6800f4016000090040512330c4002130c90089 +:10df78002b28c9000500a0542330c4002b50c4002e +:10df88002128c9000b30aa002330c4001b00c3009d +:10df9800f4016000ffff0831122000001028000083 +:10dfa80002388770002c05002540a8002b200701a7 +:10dfb8001b00c300f40160000900805023400701e2 +:10dfc800214009012b18090105006054234007016d +:10dfd8002b180701214809010b40230123400701a1 +:10dfe800061048000800e0032118000021108000f6 +:10dff8000800e0032118a00023608a0104384701c3 +:10e00800065886012558670106688501023c0b0001 +:10e018001b00a701f401e000ffff6f310610840127 +:10e02800042845012528450002140500043046014e +:10e03800127000001018000002c0cf71004c0300dd +:10e04800254822012b1038011b00a701f401e0002c +:10e058000a0040100420440121482b012b102b01f9 +:10e0680006004014ffffce252b1038010400405055 +:10e0780023483801ffffce2521482b0123483801ca +:10e088001b002701f401e000ffffa5301268000023 +:10e09800101800000278af71001403002510450025 +:10e0a8002b184f001b002701f401e0000b00601043 +:10e0b80000440e0021104b002b184b000700601481 +:10e0c800ffffad252b184f00050060102540a80163 +:10e0d800ffffad2521104b0000440e002540a8018c +:10e0e8001900060123784f00104800001240000074 +:10e0f8002b28e90121182001213820013d00a01416 +:10e10800121000004300e9512b1882002318e30184 +:10e11800233088002b2086002318640004608301c4 +:10e128000610460125104c000800e00306184301bc +:10e13800234002010448490006300501021c090079 +:10e148001b00c300f4016000ffff273106580401db +:10e158000428450025586501022c0b0004404400a2 +:10e1680012500000106000000250477100640c005b +:10e178002520ac002b288a001b00c300f401600096 +:10e188000600a05023208a00212089002b2889001e +:10e198001d00a0102b308a0023208a001b0083005a +:10e1a800f4016000ffff6b311230000010500000d6 +:10e1b8000230c770002c0a002528ab002b50a6009f +:10e1c8001b008300f40160005bff40512328a60078 +:10e1d8002128a9002b20a90057ff80542328a60036 +:10e1e8002b50a6002120a9000b288a00d077400bcd +:10e1f8002328a600234046002318eb002b104800d4 +:10e208004578400b23186200212889006878400b64 +:10e218000b20a600f8ff6054234046004678400bc8 +:10e22800211800000800e00300000000e0ffbd27ff +:10e238001c00bfaf1800beaf21f0a0032000c4af80 +:10e248002400c5af1000c0a32000c48f2400c58fd0 +:10e25800297d400f000000001000c2a31000c283f7 +:10e2680021e8c0031c00bf8f1800be8f2000bd2707 +:10e278000800e00300000000e0ffbd271c00bfaf5e +:10e288001800beaf21f0a0031000c0a3897d400f85 +:10e29800000000001000c2a31000c28321e8c003e0 +:10e2a8001c00bf8f1800be8f2000bd270800e003a8 +:10e2b80000000000f0ffbd270c00beaf21f0a00356 +:10e2c8001000c4af0000c0a30000c28321e8c0034f +:10e2d8000c00be8f1000bd270800e00300000000fe +:10e2e800e8ffbd271400bfaf1000beaf21f0a003a8 +:10e2f8001800c4af1800c48fd54a400f00000000b2 +:10e3080021e8c0031400bf8f1000be8f1800bd277e +:10e318000800e00300000000e8ffbd271400bfafbd +:10e328001000beaf21f0a0031800c4af1c00c5af99 +:10e338001800c48f1c00c58fc349400f000000009f +:10e3480021e8c0031400bf8f1000be8f1800bd273e +:10e358000800e00300000000e8ffbd271400bfaf7d +:10e368001000beaf21f0a0031800c4af1c00c5af59 +:10e378001800c48f1c00c58f4b49400f00000000d7 +:10e3880021e8c0031400bf8f1000be8f1800bd27fe +:10e398000800e00300000000e8ffbd271400bfaf3d +:10e3a8001000beaf21f0a0031800c4af1c00c5af19 +:10e3b8002110c0002000c2a72000c2971800c48ff7 +:10e3c8001c00c58f21304000164a400f0000000095 +:10e3d80021e8c0031400bf8f1000be8f1800bd27ae +:10e3e8000800e00300000000e0ffbd271c00bfafed +:10e3f8001800beaf21f0a0032000c4af2400c5afb1 +:10e408002800c6af10808297f8ff42241600c2a7e2 +:10e418001000c0af1400c0a31600c3972800c28f15 +:10e428002b10620012004014000000002400c38f6b +:10e438001000c28f211862002800c28fffff4230ef +:10e448002000c48f2128600021304000e878400f68 +:10e4580000000000ff0043301400c2932110620046 +:10e46800ff0042301400c2a33e79400b00000000b8 +:10e478002400c38f1000c28f211862001600c297b3 +:10e488002000c48f2128600021304000e878400f28 +:10e4980000000000ff0043301400c2932110620006 +:10e4a800ff0042301400c2a31400c2830f004014be +:10e4b800000000001600c2972800c38f23106200d6 +:10e4c8002800c2af1600c2971000c38f2110620047 +:10e4d8001000c2af1600c2972000c38f211062003f +:10e4e8002000c2af0879400b0000000000000000c7 +:10e4f8001400c28321e8c0031c00bf8f1800be8f20 +:10e508002000bd270800e00300000000e8ffbd2749 +:10e518001400bfaf1000beaf21f0a0031800c4afb5 +:10e528001c00c5af2110c0002000c2a72000c29760 +:10e538001800c48f1c00c58f213040008149400f4e +:10e548000000000021e8c0031400bf8f1000be8f38 +:10e558001800bd270800e00300000000e0ffbd2709 +:10e568001c00bfaf1800beaf21f0a0032000c4af4d +:10e578002400c5af2800c6af10808297f8ff422458 +:10e588001600c2a71000c0af1400c0a31600c3979e +:10e598002800c28f2b1062001200401400000000f7 +:10e5a8002400c38f1000c28f211862002800c28f78 +:10e5b800ffff42302000c48f212860002130400036 +:10e5c8004579400f00000000ff0043301400c2935b +:10e5d80021106200ff0042301400c2a39b79400b57 +:10e5e800000000002400c38f1000c28f21186200b1 +:10e5f8001600c2972000c48f2128600021304000f7 +:10e608004579400f00000000ff0043301400c2931a +:10e6180021106200ff0042301400c2a31400c2831c +:10e628000f004014000000001600c2972800c38f96 +:10e63800231062002800c2af1600c2971000c38fd3 +:10e64800211062001000c2af1600c2972000c38fcd +:10e65800211062002000c2af6579400b0000000065 +:10e66800000000001400c28321e8c0031c00bf8f13 +:10e678001800be8f2000bd270800e003000000003e +:10e688002110c000214080003e00e0142118a000a5 +:10e698002b30a6004600c010000000002020447067 +:10e6a80008008010022c0200232804000628a80075 +:10e6b80004188300041082002518a3000440880071 +:10e6c800022c02001b006500f401a000ffff493086 +:10e6d800026408001250000010580000022049711e +:10e6e800003c0b002538ec002b30e4001b006500d3 +:10e6f800f401a0000b00c0102318e4002138e20048 +:10e708002b18e20006006014ffff4a252b18e400ce +:10e71800040060102318e400ffff4a252138e200b6 +:10e728002318e4001b006500f401a000ffff083176 +:10e73800122000001038000002488970003c0700d1 +:10e748002540e8002b3009011b006500f401a000fa +:10e758000600c010214002012b10020103004014e2 +:10e76800ffff84242b48090123208900004c0a005c +:10e778002548890021280000211020010800e00315 +:10e788002118a0002b10a7004200405421280000a7 +:10e798002018e3704300601420000a242b28e500a9 +:10e7a800c500a0142b208600e079400b0100892cbd +:10e7b8000600401420184370010003241b00620067 +:10e7c800f401400012100000201843707a006054d1 +:10e7d800200008242348a200023c0200ffff4b301f +:10e7e800010005241b002701f401e000026c080069 +:10e7f800125000001060000002204b71001c0c0039 +:10e8080025186d002b3064001b002701f401e0007f +:10e818000900c05023186400211862002b306200e0 +:10e828000400c014ffff4a252b306400a500c05423 +:10e83800ffff4a25231864001b006700f401e0006d +:10e84800ffff0831122000001048000002588b70aa +:10e85800004c0900254028012b300b011b006700e4 +:10e86800f401e0000600c010214002012b10020153 +:10e8780003004014ffff84242b580b0123208b0036 +:10e88800004c0a0025488900211020010800e003f7 +:10e898002118a00021480000211020010800e003f1 +:10e8a8002118a000235043010610460104386700d0 +:10e8b8002538470006484501021407001b002201bd +:10e8c800f4014000ffffec300650440104286500c5 +:10e8d8002528450102540500125800001070000058 +:10e8e80002686c7100440e0025400a012b500d018e +:10e8f8001b002201f40140000a00401104306600a8 +:10e90800214007012b48070106002015ffff6b2552 +:10e918002b480d010400205123400d01ffff6b25fa +:10e928002140070123400d011b000201f4014000b2 +:10e93800ffffa530124800001068000002602c712b +:10e94800006c0d002528a5012b50ac001b0002010e +:10e95800f40140000b004051005c0b002128a70087 +:10e968002b10a70006004014ffff29252b10ac0030 +:10e9780004004050005c0b00ffff29252128a70058 +:10e98800005c0b0025482b01190026012328ac0048 +:10e99800103800002b40a70044000015123000007a +:10e9a8003f00a75004206400212800002110200106 +:10e9b8000800e0032118a0002340030104106200ae +:10e9c80006300501023c02001b00c700f401e0000c +:10e9d800ffff4b300428650006480401044064002a +:10e9e80025482501026c0900125000001060000043 +:10e9f80002204b7100640c002518ac012b28640020 +:10ea08001b00c700f401e0000b00a05023186400ad +:10ea1800211862002b2862000600a014ffff4a2577 +:10ea28002b2864000400a05023186400ffff4a2527 +:10ea380021186200231864001b006700f401e0003d +:10ea4800ffff2931122000001060000002308b7097 +:10ea580000640c00254889012b2826011b0067004b +:10ea6800f401e0000b00a050002c0a00214822010c +:10ea78002b18220106006014ffff84242b1826019e +:10ea880004006050002c0a00ffff84242148220162 +:10ea9800002c0a0023482601fb79400b2528850015 +:10eaa8002b308600c1ffc05021280000ffff292518 +:10eab8006d7a400b2128000021280000e079400be6 +:10eac800010009240f7a400b21186200f8ffbd27c6 +:10ead8000400beaf21f0a0030800c4af0c00c5af0e +:10eae8001000c6af1000c28f1300401000000000d5 +:10eaf8000c00c28f000043900800c28f000043a0a2 +:10eb08000800c28f010042240800c2af0c00c28f67 +:10eb1800010042240c00c2af1000c28fffff422444 +:10eb28001000c2af1000c28ff1ff401400000000b7 +:10eb3800d17a400b000000000000000021e8c0036b +:10eb48000400be8f0800bd270800e0030000000095 +:10eb5800f0ffbd270c00beaf21f0a0031000c4af2a +:10eb68001400c5af0000c0a3e67a400b0000000007 +:10eb78001000c28f000043900000c293261062006c +:10eb88000000c2a31000c28f010042241000c2afcf +:10eb98001400c28fffff42241400c2af1400c28fba +:10eba800f3ff4014000000000000c29321e8c003f6 +:10ebb8000c00be8f1000bd270800e0030000000015 +:10ebc800f8ffbd270400beaf21f0a0030800c4afc2 +:10ebd8002110a0001000c6af0c00c2a31000c28f05 +:10ebe8000f004010000000000800c28f0c00c39303 +:10ebf800000043a00800c28f010042240800c2aff1 +:10ec08001000c28fffff42241000c2af1000c28f55 +:10ec1800f5ff4014000000000b7b400b00000000d3 +:10ec28000000000021e8c0030400be8f0800bd27d3 +:10ec38000800e00300000000f0ffbd270c00beaf95 +:10ec480021f0a0031000c4af0000c0a71d7b400b3b +:10ec5800000000000000c297010042240000c2a783 +:10ec68001000c28f010042241000c2af1000c28ff2 +:10ec780000004290f7ff4014000000000000c29717 +:10ec880021e8c0030c00be8f1000bd270800e00378 +:10ec980000000000f8ffbd270400beaf21f0a0036c +:10eca8000800c4af0c00c5af2110c0001000c2a7f7 +:10ecb800537b400b000000000800c28f0000439007 +:10ecc8000c00c28f000042900e006210000000008d +:10ecd8000800c28f000043900c00c28f00004290d1 +:10ece8002b1062000400401000000000ff00022406 +:10ecf800417b400b0000000001000224577b400bc1 +:10ed0800000000000800c28f000042900400401478 +:10ed18000000000021100000577b400b000000009d +:10ed28000800c28f010042240800c2af0c00c28f45 +:10ed3800010042240c00c2af1000c297ffff42241a +:10ed48001000c2a71000c297dbff401400000000ab +:10ed58002110000021e8c0030400be8f0800bd2771 +:10ed68000800e00300000000e0ffbd271c00bfaf63 +:10ed78001800beaf21f0a0032000c4af2400c5af27 +:10ed88002400c28f000042901000c2a32400c28f4a +:10ed9800010042242400c2af1000c29304004014b2 +:10eda800000000002000c28f8c7b400b0000000098 +:10edb8002400c48f107b400f000000001200c2a77f +:10edc8002000c28f000042901400c2a32000c28f0e +:10edd800010042242000c2af1400c2930400401472 +:10ede80000000000211000008c7b400b0000000098 +:10edf8001400c3931000c293f1ff621400000000d6 +:10ee08001200c2972000c48f2400c58f2130400013 +:10ee1800277b400f00000000e9ff401400000000bd +:10ee28002000c28fffff422421e8c0031c00bf8fcf +:10ee38001800be8f2000bd270800e0030000000076 +:10ee4800f0ffbd270c00beaf21f0a0031000c4af37 +:10ee58001400c5af1800c6af0400c0a30000c0afbf +:10ee6800ad7b400b000000001000c38f0000c28f74 +:10ee780021106200000043901400c48f0000c28f6c +:10ee8800211082000000429005006210000000007e +:10ee9800010002240400c2a3b27b400b0000000062 +:10eea8000000c28f010042240000c2af0000c38fdf +:10eeb8001800c28f2b106200ebff40140000000006 +:10eec8000400c28321e8c0030c00be8f1000bd27d8 +:08eed8000800e0030000000047 +:020000040000fa +:020000041d01dc +:10eee0002558000000000000c70000004900000095 +:10eef0008e0000009200000055000000db000000c2 +:10ef00001c000000e300000024000000aa00000034 +:10ef10006d00000071000000b60000003800000025 +:10ef2000ff00000001000000c600000048000000d3 +:10ef30008f0000009300000054000000da00000081 +:10ef40001d000000e200000025000000ab000000f2 +:10ef50006c00000070000000b700000039000000e5 +:10ef6000fe00000002000000c50000004b00000091 +:10ef70008c0000009000000057000000d900000045 +:10ef80001e000000e100000026000000a8000000b4 +:10ef90006f00000073000000b40000003a000000a1 +:10efa000fd00000003000000c40000004a00000053 +:10efb0008d0000009100000056000000d800000005 +:10efc0001f000000e000000027000000a900000072 +:10efd0006e00000072000000b50000003b00000061 +:10efe000fc00000004000000c30000004d00000011 +:10eff0008a0000009600000051000000df000000c1 +:10f0000018000000e700000020000000ae00000033 +:10f010006900000075000000b20000003c00000024 +:10f02000fb00000005000000c20000004c000000d2 +:10f030008b0000009700000050000000de00000080 +:10f0400019000000e600000021000000af000000f1 +:10f050006800000074000000b30000003d000000e4 +:10f06000fa00000006000000c10000004f00000090 +:10f07000880000009400000053000000dd00000044 +:10f080001a000000e500000022000000ac000000b3 +:10f090006b00000077000000b00000003e000000a0 +:10f0a000f900000007000000c00000004e00000052 +:10f0b000890000009500000052000000dc00000004 +:10f0c0001b000000e400000023000000ad00000071 +:10f0d0006a00000076000000b10000003f00000060 +:10f0e000f800000008000000cf0000004100000010 +:10f0f000860000009a0000005d000000d3000000c0 +:10f1000014000000eb0000002c000000a200000032 +:10f110006500000079000000be0000003000000023 +:10f12000f700000009000000ce00000040000000d1 +:10f13000870000009b0000005c000000d20000007f +:10f1400015000000ea0000002d000000a3000000f0 +:10f150006400000078000000bf00000031000000e3 +:10f16000f60000000a000000cd000000430000008f +:10f1700084000000980000005f000000d100000043 +:10f1800016000000e90000002e000000a0000000b2 +:10f19000670000007b000000bc000000320000009f +:10f1a000f50000000b000000cc0000004200000051 +:10f1b00085000000990000005e000000d000000003 +:10f1c00017000000e80000002f000000a100000070 +:10f1d000660000007a000000bd000000330000005f +:10f1e000f40000000c000000cb000000450000000f +:10f1f000820000009e00000059000000d7000000bf +:10f2000010000000ef00000028000000a600000031 +:10f21000610000007d000000ba0000003400000022 +:10f22000f30000000d000000ca00000044000000d0 +:10f23000830000009f00000058000000d60000007e +:10f2400011000000ee00000029000000a7000000ef +:10f25000600000007c000000bb00000035000000e2 +:10f26000f20000000e000000c9000000470000008e +:10f27000800000009c0000005b000000d500000042 +:10f2800012000000ed0000002a000000a4000000b1 +:10f29000630000007f000000b8000000360000009e +:10f2a000f10000000f000000c80000004600000050 +:10f2b000810000009d0000005a000000d400000002 +:10f2c00013000000ec0000002b000000a50000006f +:10f2d000620000007e000000b9000000370000005e +:04f2e000f00000003a +:020000040000fa +:020000041d01dc +:10f2e400e0ffbd271c00bfaf1800beaf21f0a00394 +:10f2f4002000c4af2400c5af2110c0002800c2a75d +:10f304001400c0a31000c0a31100c0a32000c28f2a +:10f3140007004014000000001400c2272000c2af00 +:10f32400010002241000c2a3d97c400b000000009d +:10f334002400c28f07004014000000001400c227fc +:10f344002400c2af010002241100c2a3d97c400be7 +:10f3540000000000faff0224237d400b000000009f +:10f364001100c2932000401400000000f37c400b05 +:10f374000000000088bf033c2061628c0400027c12 +:10f38400206162ac7081829321200000212840001a +:10f39400208e400f000000001200c2a388bf033c6f +:10f3a4002061628c010004240400827c206162ac30 +:10f3b4002400c28f1200c393000043a02400c28f14 +:10f3c400010042242400c2af2800c2972b1002007f +:10f3d400ff0042302800c397ffff63242800c3a71f +:10f3e400e4ff4014000000001000c2932000401409 +:10f3f40000000000157d400b0000000088bf033ca6 +:10f404002061628c0400027c206162ac2000c28f07 +:10f4140000004290211840002000c28f01004224c5 +:10f424002000c2af70818293212060002128400017 +:10f43400208e400f000000001300c2a388bf033ccd +:10f444002061628c010004240400827c206162ac8f +:10f454002800c2972b100200ff0042302800c397f7 +:10f46400ffff63242800c3a7e4ff4014000000004a +:10f4740088bf033c2061628c010004240400827c68 +:10f48400206162ac2110000021e8c0031c00bf8f82 +:10f494001800be8f2000bd270800e0030000000014 +:10f4a400d8ffbd272400bfaf2000beaf21f0a003ca +:10f4b4002800c4af2c00c5af1000c0a3c404023c94 +:10f4c40000b442341400c2afe400023cc0e1423450 +:10f4d4001800c2af1800c28f401002001400c38f7e +:10f4e4001b006200f401400010180000121000001c +:10f4f4001c00c2af1800c28f401002001400c38f5a +:10f504001b006200f40140001010000004004010d1 +:10f51400000000001c00c28f010042241c00c2af86 +:10f524001c00c28f0101422c0300401400000000a3 +:10f53400000102241c00c2af1c00c28f0400401052 +:10f54400000000001c00c28fffff42241c00c2af59 +:10f554001c00c28fff004230708182a37580400f6f +:10f5640000000000010004249780400f0000000008 +:10f574001000c28321e8c0032400bf8f2000be8f87 +:10f584002800bd270800e00300000000e0ffbd27bd +:10f594001c00bfaf1800beaf21f0a00321108000f3 +:10f5a4002400c5af2000c2a31000c0a32000c39351 +:10f5b4000300022410006214000000002400c28f23 +:10f5c4001400c2af1400c28f0000448c1400c28f18 +:10f5d4000400438c1400c28f080042942128600068 +:10f5e40021304000b97c400f000000001000c2a38d +:10f5f400827d400b00000000ffff02241000c2a324 +:10f60400000000001000c28321e8c0031c00bf8f6b +:10f614001800be8f2000bd270800e0030000000092 +:10f62400f0ffbd270c00beaf21f0a0030000c0a373 +:10f634000000c28321e8c0030c00be8f1000bd2768 +:10f644000800e00300000000f8ffbd270400beaf7f +:10f6540021f0a0030800c4af2110000021e8c0037a +:10f664000400be8f0800bd270800e003000000006e +:10f67400e8ffbd271400bfaf1000beaf21f0a00308 +:10f6840088bf033ce060628c0421027ce06062acd1 +:10f6940080bf023cff000324205843ac000000005c +:10f6a40080bf023c1058428c01004230fcff4010e5 +:10f6b4000000000080bf023cff000324205843ac3c +:10f6c4000000000080bf023c1058428c0100423010 +:10f6d400fcff40100000000080bf023cff00032438 +:10f6e400205843ac0000000080bf023c1058428cfc +:10f6f40001004230fcff40100000000080bf023ccb +:10f70400ff000324205843ac0000000080bf023ceb +:10f714001058428c01004230fcff401000000000f1 +:10f7240080bf023c205840ac0000000080bf023c77 +:10f734001058428c01004230fcff401000000000d1 +:10f7440080bf023c2058428c2016027c188282a77b +:10f7540018828287001202002016027c188282a777 +:10f7640080bf023cff000324205843ac000000008b +:10f7740080bf023c1058428c01004230fcff401014 +:10f784000000000080bf023c2058428cffff433041 +:10f7940018828287ffff423021106200ffff42304f +:10f7a4002016027c188282a788bf033ce060628c2a +:10f7b400010004240421827ce06062ac1882838707 +:10f7c400fcff0224241062002016027c188282a707 +:10f7d4001882838700540224040062100000000091 +:10f7e400211000002b7e400b000000006400042464 +:10f7f400a161400f0000000088bf033ce060628c00 +:10f804000421027ce06062ac80bf023cff00032460 +:10f81400205843ac0000000080bf023c1058428cca +:10f8240001004230fcff40100000000080bf023c99 +:10f83400ff000324205843ac0000000080bf023cba +:10f844001058428c01004230fcff401000000000c0 +:10f8540080bf023c205840ac0000000080bf023c46 +:10f864001058428c01004230fcff401000000000a0 +:10f8740080bf023c205840ac0000000080bf023c26 +:10f884001058428c01004230fcff40100000000080 +:10f8940088bf033ce060628c010004240421827c64 +:10f8a400e06062ac0100022421e8c0031400bf8fb1 +:10f8b4001000be8f1800bd270800e0030000000000 +:10f8c400e0ffbd271c00bfaf1800beaf21f0a003ae +:10f8d4001000c0a788bf033ce060628c0421027c56 +:10f8e400e06062ac80bf023c205840ac00000000e5 +:10f8f40080bf023c1058428c01004230fcff401093 +:10f904000000000080bf023c2058428c1000c2a7b7 +:10f914001000c287001202001000c2a780bf023c80 +:10f92400ff000324205843ac0000000080bf023cc9 +:10f934001058428c01004230fcff401000000000cf +:10f9440080bf023c2058428cffff43301000c29716 +:10f9540021106200ffff42301000c2a788bf033ca1 +:10f96400e060628c010004240421827ce06062accb +:10f974001000c287c31002001000c2a71000c28783 +:10f98400212040008a8e400f000000002118400012 +:10f99400029d023c21206000d041458c1f86400f0f +:10f9a400000000001400c2af1400c28f21e8c0039d +:10f9b4001c00bf8f1800be8f2000bd270800e00385 +:10f9c40000000000f8ffbd270400beaf21f0a00333 +:10f9d4001882828721e8c0030400be8f0800bd2777 +:10f9e4000800e00300000000f8ffbd270400beafdc +:10f9f40021f0a003211080000800c2a30800c293d4 +:10fa04000500422c0400401400000000ffff022403 +:10fa1400aa7e400b000000000800c29304004014ba +:10fa24000000000003000224aa7e400b0000000036 +:10fa34000800c393010002240400621400000000c3 +:10fa440004000224aa7e400b000000000800c393b7 +:10fa54000200022404006214000000000f000224cb +:10fa6400aa7e400b000000000800c3930300022498 +:10fa7400040062140000000010000224aa7e400b5f +:10fa8400000000000800c393040002240400621470 +:10fa94000000000012000224aa7e400b00000000b7 +:10faa400feff022421e8c0030400be8f0800bd2726 +:10fab4000800e00300000000e0ffbd271c00bfaf0a +:10fac4001800beaf21f0a0032118a0002110c0002f +:10fad4002c00c7af2000c4a32400c3a32800c2a3e2 +:10fae4009838400f000000001000c2a31000c28329 +:10faf40036004014000000002400c293212040007e +:10fb04007b7e400f000000001100c2a31100c283dd +:10fb140028004004000000002000c2930b004014a1 +:10fb2400000000001100c293211840002800c29375 +:10fb34002120600021284000f736400f000000001b +:10fb44001000c2a3ef7e400b000000002000c3930e +:10fb5400010002240b006214000000001100c29393 +:10fb6400211840002800c293212060002128400071 +:10fb74002c37400f000000001000c2a3ef7e400ba2 +:10fb8400000000002000c393020002240a00621453 +:10fb9400000000001100c293212040002c00c58ffa +:10fba4006137400f000000001000c2a3ef7e400b3d +:10fbb4000000000000000000e138400f00000000d9 +:10fbc4001000c2a3f57e400b0000000000000000fe +:10fbd4001000c28321e8c0031c00bf8f1800be8f31 +:10fbe4002000bd270800e00300000000f8ffbd2747 +:10fbf4000400beaf21f0a0030800c4af2110000030 +:10fc040021e8c0030400be8f0800bd270800e003fc +:10fc140000000000e8ffbd271400bfaf1000beaf16 +:10fc240021f0a003211880002110a0001800c3a314 +:10fc34001c00c2a31800c3931c00c293212000001f +:10fc4400212860002130400021380000af7e400fa1 +:10fc54000000000021e8c0031400bf8f1000be8f15 +:10fc64001800bd270800e00300000000e8ffbd27de +:10fc74001400bfaf1000beaf21f0a0032118800014 +:10fc84002110a0001800c3a31c00c2a31800c39332 +:10fc94001c00c2930100042421286000213040008c +:10fca40021380000af7e400f0000000021e8c003af +:10fcb4001400bf8f1000be8f1800bd270800e0039a +:10fcc40000000000e8ffbd271400bfaf1000beaf66 +:10fcd40021f0a003211080001c00c5af1800c2a3ae +:10fce4001800c2930200042421284000213000009f +:10fcf4001c00c78faf7e400f0000000021e8c00346 +:10fd04001400bf8f1000be8f1800bd270800e00349 +:10fd140000000000e8ffbd271400bfaf1000beaf15 +:10fd240021f0a0031800c4af2110a0001c00c2a33e +:10fd34001c00c2931800c48f212840008437400f50 +:10fd44000000000021e8c0031400bf8f1000be8f24 +:10fd54001800bd270800e00300000000e8ffbd27ed +:10fd64001400bfaf1000beaf21f0a00321100000ab +:10fd7400c88182afb88180afc48180af0100022402 +:10fd8400cc8182af0300042464000524eb60400f9f +:10fd94000000000021100000bc8182afc08180af50 +:10fda400db71400f0000000002004014000000005e +:10fdb400cc8180af21e8c0031400bf8f1000be8f38 +:10fdc4001800bd270800e00300000000d8ffbd278d +:10fdd4002400bfaf2000beaf21f0a0030300042421 +:10fde400fe5f400f000000004f00401000000000c4 +:10fdf40081bf033c0090628c4408027c009062ac9a +:10fe04000000000081bf023c0090428c010042309f +:10fe1400fcff40100000000081bf023c7090428c47 +:10fe24001000c2af81bf033c0090628c0100042427 +:10fe34004408827c009062ac1000c48f8a8e400f0c +:10fe44000000000021184000029d023c21206000b7 +:10fe5400c83e458c0b85400f000000001400c2af63 +:10fe6400029d023c1400c48fcc3e458c1f86400f7b +:10fe7400000000001400c2af1400c28f1800c2af0b +:10fe8400029d023c1400c48fd03e458c1f86400f57 +:10fe9400000000001400c2afc081828f8813422882 +:10fea4000600401400000000c08180af1400c28f1f +:10feb400bc8182afb97f400b00000000c081828ffb +:10fec40001004224c08182afbc81828f2120400086 +:10fed4001400c58f7281400f00000000bc8182af06 +:10fee4001400c28fc88182af030004246400052477 +:10fef400eb60400f00000000cc81838f01000224de +:10ff040009006214000000005a72400f0000000053 +:10ff1400b88182afc573400f000000000200401496 +:10ff240000000000cc8180af21e8c0032400bf8f13 +:10ff34002000be8f2800bd270800e0030000000059 +:10ff4400e0ffbd271c00bfaf1800beaf1400b0af68 +:10ff540021f0a003bc81908fc081828f21204000ba +:10ff64008a8e400f0000000021200002212840005a +:10ff74000b85400f00000000c88182af21100000f3 +:10ff8400bc8182afc08180afc881828f21e8c00369 +:10ff94001c00bf8f1800be8f1400b08f2000bd2737 +:10ffa4000800e00300000000f8ffbd270400beaf16 +:10ffb40021f0a003b881828f21e8c0030400be8f22 +:10ffc4000800bd270800e00300000000f8ffbd277b +:10ffd4000400beaf21f0a003c481828f21e8c003d6 +:10ffe4000400be8f0800bd270800e00300000000e5 +:10fff400e8ffbd271400bfaf1000beaf21f0a0037f +:020000041d02db +:10000400c881828f029d033cb03e642421284000b5 +:10001400688f400f0000000021e8c0031400bf8f68 +:100024001000be8f1800bd270800e0030000000088 +:10003400f8ffbd270400beaf21f0a003cc81828f5e +:1000440021e8c0030400be8f0800bd270800e003b8 +:100054000000000000e85d4100701a4000601b4091 +:1000640090ffbd276c00baaf6800bbaf44781b7c1f +:10007400000c7b3700609b405c00bfaf5800beaff4 +:100084005400b9af5000b8af4c00afaf4800aeafaa +:100094004400adaf4000acaf3c00abaf3800aaaffa +:1000a4003400a9af3000a8af2c00a7af2800a6af3a +:1000b4002400a5af2000a4af1c00a3af1800a2af7a +:1000c4001400a1af121000006400a2af10180000c9 +:1000d4006000a3af21f0a0038c80828f0400401045 +:1000e400000000008c80828f09f8400000000000ae +:1000f40088bf033c3010628cc418027c301062aca0 +:1001040021e8c0036400a28f130040006000a38fa5 +:10011400110060005c00bf8f5800be8f5400b98f7f +:100124005000b88f4c00af8f4800ae8f4400ad8fa5 +:100134004000ac8f3c00ab8f3800aa8f3400a98fed +:100144003000a88f2c00a78f2800a68f2400a58f2d +:100154002000a48f1c00a38f1800a28f1400a18f6d +:1001640000606041c00000006c00ba8f6800bb8f63 +:1001740000709a407000bd2700e8dd4100609b409c +:1001840018000042f8ffbd270400beaf21f0a00311 +:100194008c8080af2110000021e8c0030400be8fd2 +:1001a4000800bd270800e00300000000f8ffbd2799 +:1001b4000400beaf21f0a0032110000021e8c00319 +:1001c4000400be8f0800bd270800e0030000000003 +:1001d400e8ffbd271400bfaf1000beaf21f0a0039d +:1001e40088bf033c2061628c8410027c206162ac75 +:1001f40088bf033c2061628c0421027c206162acd4 +:1002040064000424a161400f0000000088bf033c87 +:100214002061628c010004248410827c206162ac21 +:1002240096000424a161400f0000000088bf033c35 +:100234002061628c010004240421827c206162ac70 +:1002440021e8c0031400bf8f1000be8f1800bd2723 +:100254000800e00300000000e8ffbd271400bfaf62 +:100264001000beaf21f0a0031800c4af1800c48f63 +:10027400a161400f0000000021e8c0031400bf8ffb +:100284001000be8f1800bd270800e0030000000026 +:10029400f8ffbd270400beaf21f0a0030800c4afdf +:1002a4000800c28f8c8082af21e8c0030400be8f97 +:1002b4000800bd270800e00300000000f8ffbd2788 +:1002c4000400beaf21f0a003211080000800c2a3e7 +:1002d4000800c293070040140000000088bf033cdc +:1002e4006010628cc418027c601062acc380400b46 +:1002f4000000000088bf033c6010628c01000424ed +:10030400c418827c601062ac21e8c0030400be8f74 +:0c0314000800bd270800e0030000000006 +:020000040000fa +:020000041d02db +:10032000d8ffbd271400b0af2400bfaf2000b3af8b +:100330001c00b2af1800b1af4400800421808000df +:100340006e0082280e0040100b00822879004010b9 +:10035000029d023cc03942248080040021800202b8 +:100360000000028e2400bf8f2000b38f1c00b28fcc +:100370001800b18f1400b08f0800e0032800bd27db +:10038000eb51023c1f85423418008200c3970400e1 +:10039000102800006666133c4319050023187200fc +:1003a0008010030000190300211043008018020090 +:1003b00021104300231082002014027c67667326fc +:1003c00018005300c317020010180000029d113cd2 +:1003d00083180300231062002014027c09004224c9 +:1003e000c039312680100200211051004c00248eab +:1003f0001f86400f0000458c18001302212040008a +:10040000109800008398130023907202401012008d +:10041000c090120021905200238012022084107c90 +:1004200080801000218811021f86400f0000258e59 +:100430002400bf8f2000b38f1c00b28f1800b18f33 +:100440001400b08f0800e0032800bd2723800400bb +:100450002084107c6e00022a1d004010eb51023ceb +:100460000b00022a51004054029d023c6666023c89 +:100470006766422418000202c31f1000101000001b +:10048000831002002310430040200200c018020025 +:1004900021188300238003022024027c0900842485 +:1004a0002014107c029d033cf43963248020040056 +:1004b0008010020021208300211043000000848c62 +:1004c0001f86400f0000458cda80400b2400bf8f50 +:1004d0001f85423418000202c39710001028000044 +:1004e0006666133c43190500231872008010030050 +:1004f000001903002110430080180200211043005e +:10050000231002022014027c676673261800530031 +:10051000c317020010180000029d113c831803004d +:10052000231062002014027c09004224f980400b51 +:10053000f43931266666023c676642241800820060 +:10054000c31f04001010000083100200231043009a +:1005500040200200c01802002118830023800302fb +:100560002014027c090042242084107c029d033c5c +:10057000c0396324801002008080100021800302b3 +:10058000211043000000058e1f86400f0000448ca0 +:100590002400bf8f2000b38f1c00b28f1800b18fd2 +:1005a0001400b08f0800e0032800bd27f43942246e +:1005b0008080100021800202d980400b0000028e52 +:020000040000fa +:020000041d02db +:1005c0000080013c2628a100c24d0400ff00293113 +:1005d000c25d0500ff006b310080073c0042040053 +:1005e000254007010052050025504701ffff2d253a +:1005f000fe00a12d6100201000000000ffff6d250e +:10060000fe00a12d770020100000000023602b01c8 +:100610000d00800500000000200081290300201447 +:10062000000000001500001002000a2425300a0016 +:1006300006508a0104688a011000a611000000001b +:100640000e00001002004a3525480b0023600c0004 +:100650002000812903002014000000000700001082 +:10066000020008242530080006408801046888013b +:100670000200a61100000000020008352460870077 +:10068000266885011000a0050000000021400a0135 +:100690002b680a011700a0110000000001000d31b5 +:1006a0000200a011000000000200083542400800ce +:1006b00001002925ff0001240e0021150000000083 +:1006c0000c000010000008242b680a010400a0118f +:1006d00023400a0123400800030000102660870120 +:1006e0005000001100000000203006712348260150 +:1006f0000440c8000e0020190000000080000825fa +:1007000080000d2d21482d01026a08000100ad3145 +:1007100023400d014040080042420800c06d09001e +:1007200025400d0125100c010800e0030000000029 +:10073000010006242330c9002000c12c39002010fc +:10074000000000000080013c2540010120000d2434 +:100750002368a6010448a801020020110640c80031 +:10076000010008350000092480000d25e3ffa105e4 +:1007700000000000e1ff0010010009240e00201518 +:1007800000000000214008010500001100000000e9 +:1007900020600c7123482c0198ff00100440880150 +:1007a000ff0001240f006111000000000080013ce7 +:1007b0001800a11400000000216808011b00a0150a +:1007c00000000000ff00012414006115000000007b +:1007d000266885001500a005000000000d0000102f +:1007e00000000000080060150000000021504a01d0 +:1007f0000a0040110000000020604c7123586c0179 +:1008000082ff001004508a0121684a010700a015e8 +:1008100000000000c4ff001025100500c2ff0010fa +:1008200025100400c0ff001000000224beff0010cd +:08083000c0ff023c00000000c3 +:020000040000fa +:020000041d02db +:10083800c0ffbd272c00b5af00a0153c4c40a28ed0 +:100848003c00bfaf3800beaf3400b7af3000b6af22 +:100858002800b4af2400b3af2000b2af1c00b1af82 +:100868007f0040101800b0af00a0023c1400a2aff7 +:100878000f009324c2981300c098130087006326c2 +:100888001400a48fc219030004007e26bfff762639 +:10089800c019030077ff17347001828c40f01e00e6 +:1008a8001000a3af213000003f00d62e00a0143c5a +:1008b8002bb87702040043900100633012006054a3 +:1008c8000000508c0000438c0400649001008430c8 +:1008d80007008014212053000000638c04006490fa +:1008e80001008430fcff8010000043ac212053003d +:1008f8002b2864000400a0540000508c3b006106c3 +:100908001400a58f0000508cfeff032424800302ee +:100918002b105000e7ff4054211000022d00c0505a +:10092800010006241f00c0162190c0030200e01633 +:100938001000b28f08007226fa8e400f2120400264 +:10094800ffff03241c004310218840007401838e9c +:100958000800642421004410000062ac0400649084 +:1009680001008434040064a0f8ff5226219052004c +:10097800040044924c40a32601008434040044a29d +:1009880004004490000052acfe008430740192ae22 +:10099800040044a0000043ae213000002f82400b29 +:1009a80021100002fa8e400f21204002ffff03248d +:1009b800e6ff43142188400008007226fa8e400f93 +:1009c80021204002e2ff51147401838e8e82400b75 +:1009d800211000002f82400b2110000204006490b7 +:1009e800fe0084305c82400b040064a02b18830056 +:1009f8000a0060107001a4ac0000858c00a0033cc4 +:100a08000400868c780165ac0000458c780163246d +:100a1800040066ac000085ac040080a0040043908c +:100a2800000044ac01006334040043a008004224e1 +:100a38003c00bf8f3800be8f3400b78f3000b68fb0 +:100a48002c00b58f2800b48f2400b38f2000b28ffc +:100a58001c00b18f1800b08f0800e0034000bd27cc +:100a68004c40a22600a0073c00a0033c544063244d +:100a7800040046900c0045901400a7af00a0073c66 +:100a88004c40a3ae7401e3ac1400a38f0100c6343c +:100a98000100a534080042ac700162ac040046a015 +:080aa8001e82400b0c0045a06a +:020000040000fa +:020000041d02db +:100ab000d0ffbd272c00bfaf2800beaf21f0a003a0 +:100ac0003000c4af3400c5af4c818293010042387e +:100ad000ff00423003004010000000001083400f70 +:100ae00000000000ffff02241000c2af3000c28fe0 +:100af0001400c2af1400c28f21004010000000009b +:100b00001800c0afdb82400b000000001400c28f51 +:100b1000000042901c00c2af1000c38f1c00c28fa7 +:100b2000261062002000c2af1000c28f021a02001d +:100b30002000c28fff00443000a0023c802004004f +:100b40002c394224211082000000428c26106200c1 +:100b50001000c2af1400c28f010042241400c2afc3 +:100b60001800c28f010042241800c2af1800c38fc2 +:100b70003400c28f2b106200e4ff4014000000001c +:100b80001000c28f271002001000c2af1000c28fe9 +:100b900021e8c0032c00bf8f2800be8f3000bd2786 +:100ba0000800e00300000000e0ffbd271c00bfaf0d +:100bb0001800beaf21f0a0032000c4af2110a00098 +:100bc0002400c2a32400c2931000c2af4c818293c0 +:100bd00001004238ff0042300300401000000000d6 +:100be0001083400f000000002000c38f1000c28f50 +:100bf000261062001400c2af2000c28f021a020049 +:100c00001400c28fff00443000a0023c802004008a +:100c10002c394224211082000000428c26106200f0 +:100c20002000c2af2000c28f21e8c0031c00bf8f8c +:100c30001800be8f2000bd270800e0030000000060 +:100c4000e8ffbd271400beaf21f0a0030000c0af35 +:100c50003c83400b000000000000c28f0800c2afc0 +:100c60000400c0af2e83400b000000000800c28fbc +:100c700001004230ff004230090040100000000037 +:100c80000800c28f42180200b8ed023c20834234b3 +:100c9000261062000800c2af2b83400b000000004a +:100ca0000800c28f421002000800c2af0400c28fc9 +:100cb000010042240400c2af0400c28f0800422c8d +:100cc000eaff40140000000000a0023c0000c38fb7 +:100cd000801803002c394224211062000800c38fc1 +:100ce000000043ac0000c28f010042240000c2afec +:100cf0000000c28f0001422cd7ff4014000000000a +:100d0000010002244c8182a321e8c0031400be8f9d +:0c0d10001800bd270800e00300000000f0 +:020000040000fa +:020000041d02db +:100d1c004a462e636f6d0000486f73742049502053 +:100d2c0069732025642e25642e25642e25640d0af6 +:100d3c0000000000486f7374204e616d652069736c +:100d4c002025730d0a000000426f6f746c6f616494 +:100d5c006572207365727665722073746172746546 +:100d6c006400000042696e64204661696c65640031 +:100d7c00736f636b6574202564206c697374656e86 +:100d8c00204661696c65642e204572726f723a2040 +:100d9c0025640a004269656e76656e75652061751d +:100dac00206368616c6574210a4c65206368616c12 +:100dbc006574207061726c6520656e20616e676c65 +:100dcc0061697320636f6d6d65204d722e205065c7 +:100ddc0070696e0a496620796f75206e65656420ae +:100dec0068656c702e2e2e20747970652068656c89 +:100dfc00700a0a005465726d696e616c20636c69cf +:100e0c00656e7420636f6e6e6563746564000000bc +:100e1c005379736c6f672057656c636f6d650a004f +:100e2c004e6574776f726b20636c69656e742063aa +:100e3c006f6e6e656374656400000000426f6f74c2 +:100e4c006c6f6164657220636c69656e7420636f8e +:100e5c006e6e656374656400536f636b65742025f7 +:100e6c0064203a20416363657074204661696c6547 +:100e7c00640a00005465726d696e616c20636c6964 +:100e8c00656e7420646973636f6e6e6563746564fc +:100e9c00000000004e6574776f726b20636c69659f +:100eac006e7420646973636f6e6e65637465640041 +:100ebc00426f6f746c6f6164657220636c69656ef0 +:100ecc007420646973636f6e6e656374656400008f +:100edc0057692d466920636f6e6e65637465640d8a +:100eec000000000057692d466920646973636f6eba +:100efc006e65637465640d0057692d466920495011 +:100f0c002069732025752e25752e25752e25750dba +:100f1c000a000000776966695f63623a204d324dc2 +:100f2c005f574946495f524553505f50524f56499f +:100f3c0053494f4e5f494e464f2e0d0077696669f7 +:100f4c005f63623a2050726f766973696f6e2066c8 +:100f5c0061696c65642e0d00496d707256456d614a +:100f6c0072640000313233343566666666660000a2 +:080f7c006572726f7200000043 +:020000040000fa +:020000041d02db +:100f8400e8ffbd271400bfaf1000beaf21f0a003df +:100f940088bf033c2061628cc439027c206162ac4e +:100fa40088bf033ca061628c444a027ca06162acad +:100fb40002000224b48182af010004249061400f36 +:100fc4000000000021e8c0031400bf8f1000be8f92 +:100fd4001800bd270800e00300000000e8ffbd275b +:100fe4001400bfaf1000beaf21f0a00388bf023cc5 +:100ff4005060428c008042300c004014000000001d +:10100400b481828f0500401400000000029d023c60 +:10101400003f4424578f400f0000000001000224c9 +:10102400b48182af1584400b00000000b481838f2b +:10103400010002240500621400000000029d023c2d +:10104400143f4424578f400f00000000b48180af48 +:10105400010004247f61400f0000000021184000bb +:1010640001000224110062140000000001000424a5 +:10107400fe5f400f000000000c0040100000000064 +:1010840088bf033c2061628cc439027c206162ac5d +:1010940088bf033ca061628c444a027ca06162acbc +:1010a400010004249061400f0000000004000424a7 +:1010b400fe5f400f0000000003004010000000002d +:1010c4005b84400f0000000021e8c0031400bf8fc0 +:1010d4001000be8f1800bd270800e00300000000c8 +:1010e400e8ffbd271400bfaf1000beaf21f0a0037e +:1010f40004000424c0a805343561400f000000003a +:1011040021e8c0031400bf8f1000be8f1800bd2754 +:101114000800e00300000000e8ffbd271400bfaf93 +:101124001000beaf21f0a00388bf033c2061628c95 +:1011340001000424c439827c206162ac01000424cf +:10114400c8000524eb60400f0000000001000224e9 +:1011540021e8c0031400bf8f1000be8f1800bd2704 +:101164000800e00300000000e8ffbd271400bfaf43 +:101174001000beaf21f0a00388bf033ca061628cc5 +:1011840001000424444a827ca06162ac010004246e +:10119400c8000524eb60400f000000000100022499 +:1011a40021e8c0031400bf8f1000be8f1800bd27b4 +:1011b4000800e00300000000f8ffbd270400beaff4 +:1011c40021f0a003b481828f2014027c21e8c003a3 +:1011d4000400be8f0800bd270800e00300000000e3 +:1011e400e8ffbd271400bfaf1000beaf21f0a0037d +:1011f400dc8180af00a0023c502d44242128000053 +:10120400f40106245b8c400f000000000700042456 +:10121400c8000524eb60400f0000000021e8c00373 +:101224001400bf8f1000be8f1800bd270800e00314 +:1012340000000000e8ffbd271400bfaf1000beafe0 +:1012440021f0a003b52c400f00000000040040145e +:1012540000000000dc8180afaf84400b0000000080 +:10126400dc81828f14004010000000000700042479 +:10127400fe5f400f0000000021184000010002241e +:101284000d0062140000000000a0023c502d432415 +:10129400dc81828f2120600021284000782c400fbf +:1012a40000000000dc8180af07000424c80005248e +:1012b400eb60400f0000000021e8c0031400bf8f62 +:1012c4001000be8f1800bd270800e00300000000d6 +:1012d400e8ffbd271400bfaf1000beaf21f0a0038c +:1012e400211080001800c2a3b52c400f000000009c +:1012f4000500401400000000dc8180af21100000d4 +:10130400d884400b00000000dc81838f00a0023ce5 +:10131400502d4224211062001800c393000043a002 +:10132400dc81828f01004224dc8182afdc81838fe7 +:10133400f4010224080062140000000000a0023c32 +:10134400502d422421204000f4010524782c400f24 +:1013540000000000dc8180af0100022421e8c0030a +:101364001400bf8f1000be8f1800bd270800e003d3 +:1013740000000000e0ffbd271c00bfaf1800beaf97 +:101384001400b0af21f0a0032000c4afb52c400f6f +:10139400000000000500401400000000dc8180af64 +:1013a40021100000f584400b000000002000d08fc5 +:1013b4002000c48fd988400f0000000021200002c3 +:1013c40021284000782c400f000000000100022476 +:1013d40021e8c0031c00bf8f1800be8f1400b08f1b +:1013e4002000bd270800e00300000000f8ffbd272f +:1013f4000400beaf21f0a003dc81828f04004014fe +:1014040000000000010002240685400b00000000db +:101414002110000021e8c0030400be8f0800bd278e +:081424000800e00300000000d5 +:020000040000fa +:020000041d02db +:10142c0000800b3cc2450400ff000831c25505008a +:10143c00ff004a31003a04002538eb00004a050051 +:10144c0025482b012670850024586e01ffff0e25c0 +:10145c00fe00c12d3f00201000000000ffff4e25b4 +:10146c00fe00c12d53002010000000002b08e900e5 +:10147c00030020140000000042380700010008257a +:10148c0082630900f40180011b00ec0012200000b3 +:10149c0010300000ff3f2d311900a401122800006c +:1014ac00803306002b70c5000400c0112330c5002a +:1014bc00ffff84242130c9002b70c900f401800186 +:1014cc001b00cc0012380000103000001900a701de +:1014dc0012280000803306002b70c5000400c011d8 +:1014ec002330c500ffffe7242130c9002b70c90051 +:1014fc00807304002138ee000200c0100039070090 +:10150c000100e7347e000e242370ca0121400e0135 +:10151c00ffff0e25fe00c12d34002010000000003e +:10152c008000e7248000ee2c21400e01027207009f +:10153c000100ce312338ee0040380700423a070054 +:10154c00c07508002538ee002510eb000800e003fc +:10155c000000000008000015000000002138e70022 +:10156c000500e010000000002060ec7023400c012e +:10157c00baff001004388701040048150000000071 +:10158c00217029012f00c01100000000ff00012470 +:10159c0008004111000000001200001100000000c2 +:1015ac002170e7002700c015000000002200001089 +:1015bc00000000000800401500000000214829012f +:1015cc001d0020110000000020602c7123504c01e4 +:1015dc00a6ff001004488901217029011900c015cb +:1015ec0000000000d9ff001025100b001200001d98 +:1015fc000000000001000c24236088012000812dd4 +:10160c00f8ff20100000000020000e242370cc01f5 +:10161c000440c70102000011063887010200e734bc +:10162c00000008248000ee24bdffc105000000006e +:10163c00bbff001001000824807f013cc3ff001099 +:10164c0025106101c1ff0010c0ff023c000000002a +:020000040000fa +:020000041d02db +:10165c002510850084004010211000000100022498 +:10166c0046008210c2470500ffff0224650082106d +:10167c000a00022467008210f6ff02245a0082102e +:10168c00ffff0224090000114019050041008010e1 +:10169c000080023c23200400232805002b100400aa +:1016ac002310a2002128400040190500c216040096 +:1016bc0025106200c21e050025104300390040149d +:1016cc00801905008216040025106200821e050098 +:1016dc002510430012004054990002241a000224e1 +:1016ec00c23f040040180500403004002518e300f8 +:1016fc002120c0002128600080310300821e0400dc +:10170c002518c3008236050025186600f4ff60100a +:10171c00ffff42247f0042244600401801000324ae +:10172c00070083300a006010ff004328c000837c50 +:10173c000300842421208300c21e040004006010d6 +:10174c00ff0043284220040001004224ff004328ec +:10175c0034006010c2200400c005837c020060507d +:10176c002110000000b0847c0042080025104800c5 +:10177c00c01502000800e00325104400bbffa05474 +:10178c00ffff0224001208007f0042340800e0032f +:10179c00c0150200c0ffa214232004002120000069 +:1017ac000080053c1a000224c037050042180400d2 +:1017bc002518c30001008730423005002520e300c6 +:1017cc002128c000c21e0400403106002518c300a9 +:1017dc00c236050025186600f3ff60140100422490 +:1017ec00c985400b7f004224a6ffa21400120800fa +:1017fc0082004234c01502002000033c0800e003c4 +:10180c00251043009bffa4540a000224e585400bdd +:10181c000012080099ffa054f6ff0224ff85400b2c +:10182c000012080000120800ff0042340800e00318 +:10183c00c0150200231062001b00432808006050f2 +:10184c002120000023180200041864000610440034 +:10185c002b20030025208200cb85400b01000224a5 +:10186c00dd85400b211000000800e00300000000a3 +:020000040000fa +:020000041d02db +:10187c00c23d0400ff00e730c24d0500ff002931d6 +:10188c0000800a3c003204002530ca0000420500ea +:10189c0025400a012660850024504c01ffffec24f2 +:1018ac00fe00812d2100201000000000ffff2c25e0 +:1018bc00fe00812d36002010000000001900c80029 +:1018cc001258000002006011103000000100c634f4 +:1018dc000300c0040000000040300600ffffe724b6 +:1018ec0082ff2c252138ec00ffffec24fe00812d1b +:1018fc003a002010000000008000c6248000cc2c90 +:10190c002138ec000262060001008c312330cc003f +:10191c004030060042320600c06507002530cc007e +:10192c002510ca000800e003000000000d00e014c0 +:10193c00000000002130c6000500c01000000000af +:10194c002058cb702338eb00d8ff00100430660110 +:10195c00ff0001241f0021110000000015000010e1 +:10196c00000000002160c6001a0080150000000075 +:10197c0004002015000000002160080115008011f2 +:10198c0000000000ff0001240f00211500000000e2 +:10199c000a0020150000000021400801050000117c +:1019ac000000000020580b7123482b01c3ff0010ce +:1019bc0004406801dbff001025100a0021600801bb +:1019cc000400801500000000807f013cd5ff001052 +:1019dc0025104101d3ff0010c0ff023cfaffe01cb0 +:1019ec000000000001000b24235867012000612d2a +:1019fc00f0ff20100000000020000c2423608b015d +:101a0c00043886010200e010063066010200c6347c +:101a1c00000007248000cc24b7ff810500000000e3 +:0c1a2c00b5ff00100100072400000000be +:020000040000fa +:020000041d02db +:101a380025408500030008310300001121108000b3 +:101a4800380000100000aa900000aa8c0101093c8f +:101a580001012935c07909002340490124400f01bb +:101a68000700001124600a01050088110000000029 +:101a78000000a5240000aa902a0000100000842479 +:101a88000400ab8c00008aac2340690124400f019c +:101a98000700001124600b010500881100000000f8 +:101aa8000400a5240000aa901e000010040084244d +:101ab8000800aa8c04008bac2340490124400f0184 +:101ac8000700001124600a010500881100000000c9 +:101ad8000800a5240000aa90120000100800842421 +:101ae8000c00ab8c08008aac2340690124400f012c +:101af8000700001124600b01050088110000000098 +:101b08000c00a5240000aa90060000100c008424f4 +:101b18001000aa8c0c008bac10008424ceff00109f +:101b28001000a5240300401500008aa00800e00367 +:101b3800000000000100ab900300601501008ba0bd +:101b48000800e003000000000200aa90030040150e +:101b580002008aa00800e003000000000300ab9028 +:101b68000300601503008ba00800e00300000000dc +:101b78000400aa900300401504008aa00800e003ae +:101b8800000000000500ab900300601505008ba065 +:101b98000800e003000000000600aa9003004015ba +:101ba80006008aa00800e003000000000700ab90d0 +:101bb8000300601507008ba00800e0030000000088 +:101bc8000800aa9008008424d6ff00100800a52465 +:020000040000fa +:020000041d02db +:101bd800d8ffbd271400b0af2400bfaf2000b3afbb +:101be8001c00b2af1800b1af4000a01021808000e7 +:101bf80054008010f8ff822404004380f8ff938c7f +:101c0800010064302900801400a0043c0e82400fbb +:101c18002120a00037004010218840003d005010ce +:101c280023987002f8ff528c23904202c39012004e +:101c3800c39813002b3072020a98460221204000f4 +:101c4800212800027f88400fc03013002b1030027b +:101c58001e004010c0901200219032022b10120278 +:101c68001a00401000a0023c23805002c3801000dc +:101c7800780144247801438cc08010000400828cd1 +:101c880021803002040002ae000003ae21102002c1 +:101c98002400bf8f2000b38f1c00b28f1800b18fb3 +:101ca8001400b08f0800e0032800bd277001868c5f +:101cb8002b3046000100c054700182acfeff0424a2 +:101cc800241864000587400b040043a02400bf8f3c +:101cd800211020022000b38f1c00b28f1800b18f92 +:101ce8001400b08f0800e0032800bd270b00801403 +:101cf80000a0023c2400bf8f211000002000b38ff9 +:101d08001c00b28f1800b18f1400b08f0800e003d8 +:101d18002800bd272687400b211000027001438c44 +:101d2800f8ff90242b18030201006054700150ac96 +:101d38000400039221100000fe0063302687400b48 +:101d4800040003a22400bf8f2000b38f1c00b28fb1 +:101d58001800b18f1400b08f2120a0000e82400b14 +:041d68002800bd276b +:020000040000fa +:020000041d02db +:101d6c00d8ffbd271000b0af00a0103c3040028e51 +:101d7c002400bfaf2000b4af1c00b3af1800b2af4b +:101d8c00090040101400b1af2400bf8f2000b48fa5 +:101d9c001c00b38f1800b28f1400b18f1000b08fdd +:101dac000800e0032800bd2700a0133c8401638ecb +:101dbc004200605000a0033c00a0143c8801828ebd +:101dcc00390040100000043c828f0300829702000f +:101ddc0000e0447c00e0657c0200313a0200523a9b +:101dec000a18b1000a10920021886000b58f400fcc +:101dfc00219040000000438c0400428c2b202302d5 +:101e0c00240080102110620000a0043c7030842457 +:101e1c0000e0847c2b206400dbff801421886000b0 +:101e2c002b185102050060142b1822022b184202a9 +:101e3c000500605400a0023c2b182202d2ff601057 +:101e4c002190400000a0023c703042244217020056 +:101e5c00050003241b0043140400032400a0023ccf +:101e6c002588220225904202840171ae880192ae2f +:101e7c00304011ae2400bf8f2000b48f1c00b38ff4 +:101e8c001800b28f1400b18f1000b08f0800e0035f +:101e9c002800bd272b202202e2ff80542b18510270 +:101eac008687400b00a0043c00a0023c0002842466 +:101ebc00684042247587400b211044007187400b09 +:101ecc0068406324070043140080023c25882202ea +:101edc0025104202840171ae880182aea087400bae +:101eec00304011ae21884002840172aea087400bb5 +:041efc00304011aeb3 +:020000040000fa +:020000041d02db +:101f00000c008294d0ffbd27010042301800b0af12 +:101f10002c00bfaf2800b4af2400b3af2000b2af95 +:101f20001c00b1af218080003e004010040080ac56 +:101f300000a0143c6d018282130040501000068ef8 +:101f400000a0113c2c3d3126a0003326d787400b42 +:101f5000020112240b0033526d0180a20c00229664 +:101f600002014230fbff525414003126212020028e +:101f7000fe8c400f14003126f9ff33560c002296d8 +:101f80006d0180a21000068e1700c0100e0004968e +:101f90002288400f0800058e30004010040002ae79 +:101fa000ffff0324350043500c0002960800038e07 +:101fb000ffff4224000003ae040002ae01006424cf +:101fc00000006290000004ae2c00bf8f2800b48f88 +:101fd0002400b38f2000b28f1c00b18f1800b08f87 +:101fe0000800e0033000bd27040000ae1000a52764 +:101ff0002288400f0100062401000324120043142c +:102000002c00bf8f1000a2932800b48f2400b38f40 +:102010002000b28f1c00b18f1800b08f0800e003c1 +:102020003000bd272c00bf8fffff02242800b48f93 +:102030002400b38f2000b28f1c00b18f1800b08f26 +:102040000800e0033000bd270c000396ffff0224c8 +:1020500010006334f287400b0c0003a60c000296bc +:10206000100042340c0002a60800028e040000aeec +:10207000000002aef287400bffff02243000423422 +:082080001a88400b0c0002a6b7 +:020000040000fa +:020000041d02db +:10208800e0ffbd271000b0af1c00bfaf1800b2af13 +:102098001400b1af1c00a0102180a0001b00c0508c +:1020a8001c00bf8f110080142190c0000000023c6a +:1020b800000042241c0040102188a6000000000ceb +:1020c80001000424000002a201001026fbff1116e3 +:1020d8001c00bf8f211040021400b18f1800b28f6e +:1020e8001000b08f0800e0032000bd271c00bf8f40 +:1020f800211040021400b18f1800b28f1000b08f69 +:102108000800e0032000bd271c00bf8f21900000bd +:10211800211040021400b18f1800b28f1000b08f48 +:102128000800e0032000bd2700a0023ca800438c63 +:10213800020002242400621080bf023c80bf023cdf +:1021480080bf053c80bf043c0060428c3060a52401 +:102158001060842400804230050040142190c000a3 +:102168000080033480bf023c086043ac2190c0006b +:102178000000828c0100423009004014a0000224b3 +:102188006688400b000000000500401000000000b9 +:102198000000838c01006330fbff6010ffff4224c6 +:1021a8000000828c01004230d0ff40542390d200be +:1021b8000000a28cffff52260c004012000002a271 +:1021c8005e88400b0100102640684224dbff401067 +:1021d80080bf023c80bf053c80bf043c0068428c45 +:1021e8003068a5245788400b106884243d88400b2c +:0421f8002390d2005e +:020000040000fa +:020000041d02db +:1021fc00211080005600c0100c00ca2c4d00401558 +:10220c002618a40003006330233804002900601052 +:10221c000300e7300600e0102330c7000000a3984d +:10222c000300a3882128a700000083b82120870081 +:10223c000f00c3302338c3001100e01021306000c0 +:10224c002138e5000000a3980300a3880400a89897 +:10225c000700a8880800a9980b00a9880c00aa9868 +:10226c000f00aa88000083ac040088ac080089ac7d +:10227c001000a52410008424f2ffa714fcff8aace4 +:10228c000300c3302338c3002a00e0102130600063 +:10229c002138e5000000a3980300a3880400a524be +:1022ac0004008424fbffa714fcff83ac2100001066 +:1022bc00000000000500e0102330c7000000a398c8 +:1022cc002128a700000083b8212087000f00c3300d +:1022dc002338c3000d00e010213060002138e500e8 +:1022ec000000a38c0400a88c0800a98c0c00aa8cfc +:1022fc00000083ac040088ac080089ac1000a52455 +:10230c0010008424f6ffa714fcff8aac0300c33032 +:10231c002338c3000700e010213060002138e500ad +:10232c000000a38c0400a52404008424fcffa71443 +:10233c00fcff83ac0600c0102138c5000000a39040 +:10234c000100a52401008424fcffa714ffff83a037 +:10235c000800e0030000000000008a9021108000bb +:10236c0003004015000000000800e00300000224f8 +:10237c0001008a9003004015000000000800e003f3 +:10238c000100022402008a900300401500000000a6 +:10239c000800e0030200022403008a9003004015a9 +:1023ac00822004000800e0030300022401008424be +:1023bc008020040000008a8c0101093c01012935b0 +:1023cc00c07909002340490124400f010600001187 +:1023dc0024600a01040088110000000000008a90ab +:1023ec00220000100000842404008b8c234069011f +:1023fc0024400f010600001124600b010400881119 +:10240c000000000004008a901800001004008424ce +:10241c0008008a8c2340490124400f01060000115a +:10242c0024600a01040088110000000008008a9052 +:10243c000e000010080084240c008b8c23406901d2 +:10244c0024400f010600001124600b0104008811c8 +:10245c00000000000c008a90040000100c00842482 +:10246c0010008a8cd7ff0010100084240400401543 +:10247c0000000000000084240800e0032310820008 +:10248c0001008a9004004015000000000100842423 +:10249c000800e0032310820002008a90040040151b +:1024ac0000000000020084240800e00323108200d6 +:1024bc0003008a90030084240800e00323108200a8 +:020000040000fa +:020000041d02db +:1024cc000c00a294e0ffbd27020043301400b0af13 +:1024dc001c00bfaf1800b1af2b0060102180a00012 +:1024ec00000243301c0060100400a38c0002423434 +:1024fc000c00a2a41d006010ff0091300a000424ff +:10250c0028002412800042301000028e3e0062101f +:10251c00010063240000028e01004424040003ae79 +:10252c00000051a00100032400a0023c000004aef6 +:10253c006d0143a00a000224210022520c000296d5 +:10254c001c00bf8f211020021400b08f1800b18f17 +:10255c000800e0032000bd270b0060140002423489 +:10256c000c00a2a4ff009130211800000800048e7a +:10257c00000004ae0a000424e4ff24561000028e6e +:10258c006c89400b800042301c00bf8fffff112470 +:10259c00211020021400b08f1800b18f0800e00346 +:1025ac002000bd27d9ff40541000028e0d000424da +:1025bc003389400f212800024589400b0400038e0b +:1025cc0000014230dfff40101c00bf8f0e0004964c +:1025dc000800058e238d400f0400068e0400038e28 +:1025ec00060043500800028e0c000296ffff1124d7 +:1025fc00300042340c0002a60800028e040000ae2b +:10260c005389400b000002ae2024117c8a89400fb4 +:0c261c00212800025389400b2188400057 +:020000040000fa +:020000041d02db +:102628000c00a294e8ffbd27400043301000b0af73 +:102638001400bfaf2180a0001c0060141800a4a3e0 +:10264800020043303d006050300042341000a38c3b +:102658001b0060500e00a4940800a58c2d00a0500b +:1026680000a0053c0400068e238d400f0e00049642 +:10267800ffff02240800038e040002ae1800a29394 +:10268800000062a01800a28301006324000003aeca +:102698000a000324130043500c0003961400bf8f54 +:1026a8001000b08f0800e0031800bd271400bf8f8a +:1026b8002014047c1000b08f0800e0031800bd2728 +:1026c80001000624238d400f1800a5271400bf8f92 +:1026d8001800a283040000ae1000b08f0800e003c9 +:1026e8001800bd2700016330edff60101400bf8f94 +:1026f8000e0004960800058e238d400f0400068ef8 +:102708000800038e1800a283040000aea989400bbc +:10271800000003ae1040a524200003240800423422 +:10272800080005ae000005ae100003ae040003aebd +:102738000c0002a69c89400b200006240c00a2a4d1 +:0c2748000400a0aca989400bffff022494 +:020000040000fa +:020000041d02db +:10275400e8ffbd271400bfaf1000beaf21f0a003f7 +:10276400029d023ccc41428ca48182af0800042427 +:10277400e8030524eb60400f0000000021e8c003db +:102784001400bf8f1000be8f1800bd270800e0039f +:1027940000000000e8ffbd271400bfaf1000beaf6b +:1027a40021f0a0039d7d400f00000000211840008f +:1027b400010002240700621400000000317e400f73 +:1027c40000000000a48182af01000224f789400bbd +:1027d400000000002110000021e8c0031400bf8f96 +:1027e4001000be8f1800bd270800e00300000000a1 +:1027f400f8ffbd270400beaf21f0a003a481828f9f +:1028040021e8c0030400be8f0800bd270800e003d0 +:1028140000000000e8ffbd271400bfaf1000beafea +:1028240021f0a00308000424fe5f400f0000000014 +:102834000800401000000000317e400f000000003e +:10284400a48182af08000424e8030524eb60400f50 +:102854000000000021e8c0031400bf8f1000be8fe9 +:0c2864001800bd270800e0030000000081 +:020000040000fa +:020000041d02db +:102870000c008394e0ffbd271000b0af01000224dc +:1028800021808000110064301c00bfaf1800b2af7f +:10289000300082141400b1af0002623018004014fe +:1028a0000400028efffd63300c0003a61a00112401 +:1028b0000d00122418004018ffff44240000028e6f +:1028c000040004ae0100442400004290000004ae65 +:1028d00080006430050080141c00bf8f150051502b +:1028e0000800028e0a0052500400028e1800b28fb7 +:1028f0001400b18f1000b08f0800e0032000bd2746 +:1029000014004014211000002a8a400bfffd6330a0 +:10291000eaff401cffff4424400062300d004014d9 +:1029200021200002c087400f00000000348a400bc5 +:102930000c000396080040101c00bf8f0400048e9a +:102940000000028e01008424ffff4224040004ae34 +:10295000000002ae1c00bf8f100063340c0003a601 +:10296000ffff02241800b28f1400b18f1000b08f47 +:082970000800e0032000bd2770 +:020000040000fa +:020000041d02db +:102978000020202020202020202028282828282047 +:10298800202020202020202020202020202020203f +:1029980020801010101010101010101010101010af +:1029a8001004040404040404040404101010101097 +:1029b8001010414141414141010101010101010161 +:1029c80001010101010101010101010110101010b3 +:1029d8001010424242424242020202020202020233 +:1029e8000202020202020202020202021010101087 +:1029f80020000000000000000000000000000000af +:102a080000000000000000000000000000000000be +:102a180000000000000000000000000000000000ae +:102a2800000000000000000000000000000000009e +:102a3800000000000000000000000000000000008e +:102a4800000000000000000000000000000000007e +:102a5800000000000000000000000000000000006e +:102a6800000000000000000000000000000000005e +:102a7800000000000009121b242d363f48415a531c +:102a88006c657e7719100b023d342f265158434a46 +:102a9800757c676e323b2029161f040d7a736861b6 +:102aa8005e574c452b2239300f061d14636a717826 +:102ab800474e555c646d767f4049525b2c253e3706 +:102ac80008011a137d746f6659504b42353c272e06 +:102ad8001118030a565f444d727b60691e170c0576 +:102ae8003a3328214f465d546b627970070e151ce6 +:102af800232a31384148535a656c777e09001b12e6 +:102b08002d243f3658514a437c756e671019020bc5 +:102b1800343d262f737a6168575e454c3b32292035 +:102b28001f160d046a6378714e475c55222b3039a5 +:102b3800060f141d252c373e0108131a6d647f7685 +:102b480049405b523c352e2718110a03747d666f85 +:102b58005059424b171e050c333a21285f564d44f5 +:102b68007b7269600e071c152a233831464f545d65 +:042b7800626b7079a3 +:020000040000fa +:020000041d02db +:102b7c00e0ffbd27040002241800b0af1c00bfaf5b +:102b8c001c00c21021808000000102240300c2102e +:102b9c00000000001300c0141c00bf8f2800a050c0 +:102bac000800058e0c000296080042340c0002a6a8 +:102bbc000c000296080005aefbfe42302530c20028 +:102bcc00100007ae0c0006a6040000ae2110000099 +:102bdc001c00bf8f1800b08f0800e0032000bd2739 +:102bec001c00bf8fffff02241800b08f0800e00309 +:102bfc002000bd270c00829408004230070040548e +:102c0c000c0002960800848c040080500c00029684 +:102c1c005390400f000000000c000296000000ae24 +:102c2c00f7fe4230040042340c0002a6080000ae4d +:102c3c00100000ae040000aef78a400b211000001b +:102c4c000300a01000000000ef8a400b1000078e5c +:102c5c00e58e400f1000a6af21284000e0ff401089 +:0c2c6c001000a68fef8a400b2000072408 +:020000040000fa +:020000041d02db +:102c7800286e756c6c2900003031323334353637a4 +:102c88003839414243444546000000003031323370 +:102c98003435363738396162636465660000000090 +:102ca80001000000000000000a0000000000000011 +:102cb8006400000000000000e803000000000000bd +:102cc8001027000000000000a0860100000000009e +:102cd80040420f00000000008096980000000000ad +:102ce80000e1f5050000000000ca9a3b0000000062 +:102cf80000e40b540200000000e8764817000000ca +:102d08000010a5d4e800000000a0724e18090000c9 +:102d180000407a10f35a00000080c6a47e8d03009c +:102d28000000c16ff286230000008a5d78456301c8 +:102d3800000064a7b3b6e00d0000e8890423c78a41 +:102d48000000803f000020410000003f5f70894084 +:020000040000fa +:020000041d02db +:102d5800a8ffbd270400a1af0800a2af0c00a3afd5 +:102d68001000a4af1400a5af1800a6af1c00a7afb1 +:102d78002000a8af2400a9af2800aaaf2c00abaf51 +:102d88003000acaf3400adaf3800aeaf3c00afaff1 +:102d98004000b8af4400b9af4800bfaf12400000d0 +:102da8004c00a8af104000005000a8af029d1a3c8c +:102db800e83a5a2700000000006804400060054017 +:102dc80009f84003000000005000a88f110000011e +:102dd8004c00a88f130000010400a18f0800a28fe7 +:102de8000c00a38f1000a48f1400a58f1800a68fc5 +:102df8001c00a78f2000a88f2400a98f2800aa8f65 +:102e08002c00ab8f3000ac8f3400ad8f3800ae8f04 +:102e18003c00af8f4000b88f4400b98f4800bf8f87 +:0c2e28005800bd27c00000001800004248 +:020000040000fa +:020000041d02db +:102e3400e8ffbd271400bfaf1000beaf21f0a00310 +:102e440081bf023c00f6428c100042300700401063 +:102e54000000000001000224308182af029d023c88 +:102e6400e43f4424578f400f0000000021e8c003d2 +:102e74001400bf8f1000be8f1800bd270800e003a8 +:102e840000000000f8ffbd270400beaf21f0a0033e +:102e940080bf023c00800334080043ac21e8c00337 +:102ea4000400be8f0800bd270800e00300000000f6 +:102eb400f8ffbd270400beaf21f0a00380bf023c91 +:102ec40000800334040043ac21e8c0030400be8f37 +:102ed4000800bd270800e00300000000f8ffbd273c +:102ee4000400beaf21f0a00380bf023c0100032414 +:102ef400080043ac21e8c0030400be8f0800bd27ce +:102f04000800e00300000000e0ffbd271c00bfaf85 +:102f14001800b2af1400b1af1000b0af2700a0107a +:102f2400211080002020a47020001124238024027a +:102f3400403005002718100004306600061802020d +:102f44002518c30006280502200006320a28660058 +:102f5400042082000100a3340b286400218f400f59 +:102f64002120a0000f001112219040001f00022414 +:102f74000f000212010004248a8e400f0420040270 +:102f8400212840001f86400f212040021c00bf8fd3 +:102f94001800b28f1400b18f1000b08f0800e00346 +:102fa4002000bd27029d023ce28b400bc441458cae +:102fb400029d023ce28b400bc841458c218f400f9f +:102fc400000000001c00bf8f1800b28f1400b18fe6 +:0c2fd4001000b08f0800e0032000bd27b3 +:020000040000fa +:020000041d02db +:102fe00053504920466c61736820636f6e66696751 +:102ff00075726564000000004552524f523a2053ea +:10300000504920466c617368206e6f74206465744b +:103010006563746564000000466c617368207374b6 +:1030200061747573207265676973746572203a20e4 +:10303000307825780a00000053504920466c6173af +:103040006820646574656374696f6e204641494cfd +:1030500045442e202056656e646f723a20307825e4 +:10306000782c20436869702049443a2030782578cc +:103070000a00000053504920466c61736820646563 +:103080007465637465642e202056656e646f723ab1 +:1030900020307825782c20436869702049443a20f4 +:0830a000307825780a000000d9 +:020000040000fa +:020000041d02db +:1030a800e0ffbd271800b0af00a0103c3040028ef2 +:1030b800100040101c00bfaf1b00801821184400ee +:1030c8002b206200110080141c00bf8f00a0043c5c +:1030d8008801848c2b2083000d00805400a0023cc2 +:1030e8001c00bf8f304003ae1800b08f0800e0030b +:1030f8002000bd275b87400f1000a4af3040028e30 +:10310800edff40141000a48f1c00bf8f00a0023cec +:103118000c000324800143ac1800b08fffff022489 +:103128000800e0032000bd272b2043000500801481 +:1031380000a0043c8401848c2b206400e9ff8010eb +:103148001c00bf8f1c00bf8f00a0023c1600032488 +:10315800800143ac1800b08fffff02240800e00391 +:043168002000bd275f +:020000040000fa +:020000041d02db +:10316c00211080002600c0101000ca2c1f00401532 +:10317c00ff00a530005205002528aa0000540500c8 +:10318c002528aa00030083300500601004000724e2 +:10319c002338e3002330c700000085b821208700c6 +:1031ac000f00c3302338c3000800e010213060004a +:1031bc002138e400000085ac040085ac080085ac27 +:1031cc0010008424fbff8714fcff85ac0300c33084 +:1031dc002338c3000500e010213060002138e400e2 +:1031ec0004008424feff8714fcff85ac0400c0108f +:1031fc002138c40001008424feff8714ffff85a042 +:08320c000800e00300000000cf +:020000040000fa +:020000041d02db +:10321400200002240900052400008380feff625080 +:1032240001008424030065542d000224878c400b84 +:1032340001008424190062102b0002241b00625038 +:103244000100842421380000029d063c7829c6240c +:103254002110c30001004290040042300c004010d1 +:103264002110000040280200c01002002110a2001a +:103274000100842421104300000083802128c3001e +:103284000100a5900400a530f6ffa014d0ff42244d +:10329400231802000800e0030b10670001008424d7 +:1032a40000008380938c400b01000724000083807e +:0832b400938c400b213800004f +:020000040000fa +:020000041d02db +:1032bc00e0ffbd271800b0af029d103c7829102606 +:1032cc0021189000010063901c00bfaf0400673010 +:1032dc000900e01021108000d0ff82242a2845002c +:1032ec001100a0101c00bf8fff0042301800b08fdf +:1032fc000800e0032000bd27010067300400e05007 +:10330c00030063300c00c0140000000003006330a5 +:10331c0004006010a9ff42242a284500f2ffa014e3 +:10332c001c00bf8f1c00bf8fff0002241800b08f41 +:10333c000800e0032000bd27ca8f400f1000a5af86 +:10334c002180500001000392c68c400b1000a58f09 +:020000040000fa +:020000041d02db +:10335c00feff082440300400403805002548c70013 +:10336c001b0020110000000000ff013c0100213473 +:10337c002b08c1001a0020100000000000ff013cc7 +:10338c00010021342b08e100150020100000000082 +:10339c000200810442300600233006000200a10422 +:1033ac0042380700233807002a08c7000300201002 +:1033bc000000000007000010ffff02242a08e600ae +:1033cc000300201000000000020000100100022485 +:1033dc00000002240800e0030000000000000000d0 +:0c33ec00fcff001025100800000000008d +:020000040000fa +:020000041d02db +:1033f8000c008294e8ffbd271000b0af0100032441 +:103408002180800001024430170083101400bfaff0 +:103418000202423002020324060043500800058ecf +:10342800211000001400bf8f1000b08f0800e003c7 +:103438001800bd27fbffa010211000000400068e15 +:10344800f9ffc0101400bf8f238d400f0e000496a3 +:103458000400038e040043100c000296300042342e +:10346800ffff42300c0002a60800048e2000433003 +:10347800ffff0224040000ae000004ae0b8d400bd9 +:043488000a10030023 +:020000040000fa +:020000041d02db +:10348c00e0ffbd271c00bfaf1200a0101800b0afaa +:10349c001000c0100300842c060080140000023cb5 +:1034ac001c00bf8f2110c0001800b08f0800e00373 +:1034bc002000bd27000042240b0040102120a0005a +:1034cc002128c0000000000c1400a6af2b8d400b6f +:1034dc001400a68f1c00bf8f211000001800b08fa5 +:1034ec000800e0032000bd272180a6000000a48076 +:1034fc000100a5241000a5af0575400f1400a6af60 +:10350c001000a58ff9ffb0141400a68f2c8d400b62 +:04351c001c00bf8f41 +:020000040000fa +:020000041d02db +:10352000c2350400ff00c630ffffc924fe00212d74 +:103530000b0020100000000082ffc6247f80013ca9 +:10354000ffff213424208100003f013c2520810021 +:103550000000a6ac251004000800e00300000000f5 +:103560000d00c0140000000021488400f8ff201165 +:1035700000000000403a04002040e8702330c800fa +:10358000043807010080013c24208100024a070022 +:10359000e9ff001025208900c0ff043cecff00106b +:0835a0000000062400000000f9 +:020000040000fa +:020000041d02db +:1035a800c8ffbd273400bfaf3000beaf21f0a00375 +:1035b8003800c4af6280400f000000001400c2272a +:1035c80021204000212800001c0006245b8c400fad +:1035d800000000003800c28f0000428c1400c2af07 +:1035e8001400c227212040003e11400f00000000b7 +:1035f8001000c2a31000c2830300401000000000a6 +:10360800828d400b0000000021e8c0033400bf8f0a +:103618003000be8f3800bd270800e003000000001e +:020000040000fa +:020000041d02db +:10362800002a04000080013c2528a100c23d0400b6 +:10363800ff00e7309e0006242330c7000d00c004b9 +:10364800000000002000c128030020140000000032 +:103658000500001000000224020081040628c500ad +:1036680023280500251005000800e00300000000dd +:1036780000000000807f013c010021342b088100fc +:103688000300201400000000f7ff00100080023c37 +:0c369800f5ff0010ffff022400000000fe +:020000040000fa +:020000041d02db +:1036a400e8ffbd271400bfaf6190400f0000000089 +:1036b40088bf023c0030438c0003637c0800601424 +:1036c40099aa033c0010042488bf033c083064ac6e +:1036d4000030438c00086330fdff601499aa033c5a +:1036e40081bf023c5566632430f240ac30f243acf7 +:1036f4006655033caa99633430f243ac81bf023c63 +:103704000100032418f643ac81bf023c10f6428c3e +:08371400c58d400b0000000010 +:020000040000fa +:020000041d02db +:10371c00e0ffbd271800b2af1400b1af1000b0af7e +:10372c001c00bfaf218080002188a000d48d400bed +:10373c00ffff12243389400f000000000b005210d1 +:10374c00010010260000028221282002f9ff4014fb +:10375c00212040001c00bf8f1800b28f1400b18fc5 +:10376c001000b08f0800e0032000bd271c00bf8fa5 +:10377c00ffff02241800b28f1400b18f1000b08f1d +:08378c000800e0032000bd2746 +:020000040000fa +:020000041d02db +:103794001b00c010211000000000828011004010a6 +:1037a4000000a38012004314ffffc624f48d400bd5 +:1037b400ffff072400008280090040100100a524b7 +:1037c4000000a3800b004314ff004230ffffc62417 +:1037d400f8ffc714010084240800e003211000004e +:1037e4000000a380ff0063300800e00323104300bf +:1037f400ff004230ff0063300800e0032310430061 +:083804000800e00300000000d1 +:020000040000fa +:020000041d02db +:10380c00ffff032403008314211080000800e00351 +:10381c00000000000c00a494010003240102843079 +:10382c00030083500800a68c0800e003ffff02246d +:10383c00f6ffc050ffff02240400a48c1000a38ce0 +:10384c00f2ff8350ffff02240000a38c0600c3107c +:10385c00010084240400a4acffff64240000a4ac89 +:10386c000800e003ffff62a001006324198e400be7 +:04387c000000a3acf9 +:020000040000fa +:020000041d02db +:10388000f8ffbd270400beaf21f0a003211880007f +:103890002110a0000800c3a30c00c2a30c00c39316 +:1038a00080bf023c305a43ac0800c39380bf023c47 +:1038b000205a43ac0000000080bf023c105a428cea +:1038c00001004230fcff40100000000080bf023cbd +:1038d000205a428c0800c2a30800c29321e8c0030a +:1038e0000400be8f0800bd270800e00300000000b0 +:1038f000f8ffbd270400beaf21f0a00388bf033c42 +:10390000e060628c8431027ce06062ac21e8c0033c +:103910000400be8f0800bd270800e003000000007f +:10392000f8ffbd270400beaf21f0a00388bf033c11 +:10393000e060628c010004248431827ce06062ac2f +:103940000100022421e8c0030400be8f0800bd2747 +:083950000800e0030000000084 +:020000040000fa +:020000041d02db +:10395800d0ffbd273800a2273800a6af1000a2afbd +:1039680021304000ff7f02242800b0af2400a2af1e +:1039780021808000c20002241400a4272c00bfafbd +:103988001400b0af1c00b0af3c00a7af1800a0af48 +:10399800533d400f2000a2a71400a28f000040a0b2 +:1039a8001400a28f2c00bf8f231050002800b08f66 +:0839b8000800e0033000bd2708 +:020000040000fa +:020000041d02db +:1039c0000000803f000020410000c84200007a440f +:1039d00000401c460050c347002474498096184b91 +:1039e00020bcbe4c286b6e4ef9021550ec78ad60d1 +:1039f000caf249710000803fcdcccc3d0ad7233cb0 +:103a00006f12833a17b7d138acc52737bd37863523 +:103a100095bfd63377cc2b325f708930ffe6db2e33 +:083a200008e53c1e6042a20d06 +:020000040000fa +:020000041d02db +:103a28000080013c120080102430810002008104d3 +:103a380000000000232004009e0005242038877021 +:103a48002328a7000420e400800084248000882c18 +:103a58002128a8000342040001000831232088001f +:103a68004020040042220400c045050025208800ab +:103a7800251086000800e003000000000000000098 +:020000040000fa +:020000041d02db +:103a8800e0ffbd271400b0af029d103c1800b1af95 +:103a98001c00bfaf00a0113c782910261c8a400fdb +:103aa8006040248e21180202010063808800633080 +:103ab800faff6014ffff03240400431000a0033c36 +:103ac8006040658c038e400f212040001c00bf8f92 +:103ad8001800b18f1400b08f0800e0032000bd2744 +:020000040000fa +:020000041d02db +:103ae800e0ffbd271c00bfaf1800beaf21f0a00348 +:103af800004802401000c2af006802401f00423078 +:103b0800008182af00700240088182af00600340ec +:103b1800ff0f023cfeff4234241062000060824026 +:103b2800c00000004000000040000000400000000d +:083b3800a98d400f0000000000 +:020000040000fa +:020000041d02db +:103b4000c8ffbd274000a3273400bfaf4000a6af89 +:103b50004400a7af1000a3af1400a4af1c00a4af93 +:103b6000d988400f2800a5af1000a68f2800a58f88 +:103b70001800a2af2400a2af1400a427c1000224a1 +:103b80009669400f2000a2a73400bf8f0800e00311 +:043b90003800bd2715 +:020000040000fa +:020000041d02db +:103b940000a0033c5c40628ce8ffbd270d00401090 +:103ba4001400bfaf0000448c5c4064acffff0324ee +:103bb400030043101400bf8f0800e0031800bd2762 +:103bc400e966042400a0033c800164ac0800e0031f +:103bd4001800bd27fa8e400f20000424ed8e400b00 +:043be400ffff0324b8 +:020000040000fa +:020000041d02db +:103be800e0ffbd271800b1af1400b0af1c00bfaf95 +:103bf8002a8c400f218880000700201a218040006d +:103c0800ffff0224040002122120000221280000e4 +:103c18005b8c400f213020021c00bf8f2110000256 +:103c28001800b18f1400b08f0800e0032000bd27f2 +:020000040000fa +:020000041d02db +:103c38000000043ce8ffbd27000084240300801036 +:103c48001400bfaf09f880000000000000008430b5 +:103c58000000a530ce73400f000000000000023cb9 +:103c680000004224030040100000000009f8400052 +:0c3c780000000000f9ff00100000000038 +:020000040000fa +:020000041d02db +:103c8400e8ffbd271400bfaf0600800421108000a8 +:103c94008a8e400f000000001400bf8f0800e0036c +:103ca4001800bd2701004230422004008a8e400fd4 +:103cb40025208200212040007281400f21284000ed +:0c3cc4001400bf8f0800e0031800bd27ab +:020000040000fa +:020000041d02db +:103cd0000000023ce8ffbd2700004224060040101f +:103ce0001400bfaf0000023c00004224030040105b +:103cf000029d023c3f000070029d023c183d4224a0 +:103d0000030040100000000009f84000000000001f +:083d1000448f400b000000008d +:020000040000fa +:020000041d02db +:103d180000606041c000000099aa033c81bf023cda +:103d28005566632430f240ac30f243ac6655033c30 +:103d3800aa99633430f243ac81bf023c01000324ea +:103d480018f643ac81bf023c10f6428c488f400bfa +:043d58000000000067 +:020000040000fa +:020000041d02db +:103d5c00e0ffbd271400b0af00a0103c403d05268d +:103d6c001c00bfafc78d400f1800b1af403d0526fa +:103d7c000a0004243389400f218840001c00bf8fa7 +:103d8c00211020021400b08f1800b18f0800e0033e +:043d9c002000bd271f +:020000040000fa +:020000041d02db +:103da000e0ffbd272400a2272118800000a0043cca +:103db0002400a5af2800a6af403d84242128600040 +:103dc000213040001c00bfaf2c00a7af533d400f77 +:103dd0001000a2af1c00bf8f0800e0032000bd2729 +:020000040000fa +:020000041d02db +:103de0000000023c00004224050040100000023c9c +:103df0000000422403004010029d023c3f0000707e +:103e0000029d023c183d4224fdff401000000000ce +:083e100009f840000000000069 +:020000040000fa +:020000041d02db +:103e18004a462e636f6d00004368616c6574447593 +:103e2800696e6f20563220496e697469616c697acf +:103e380065640000746573742025640a000000003e +:020000040000fa +:020000041d02db +:103e4800006803408000023c251062000068824040 +:103e5800040080100010032488bf023c0800e0031f +:103e6800041043ac88bf023c0800e003081043acd0 +:020000040000fa +:020000041d02db +:103e78000900801000a0023c7001438cf8ff8424e4 +:103e88002b18830001006054700144ac0400829038 +:103e9800fe004230040082a00800e0030000000099 +:020000040000fa +:020000041d02db +:103ea8004a462e636f6d0000426174746572792012 +:103eb800766f6c746167653a2025660a0000000019 +:0c3ec80000c07f443d0a5740000030411c +:020000040000fa +:020000041d02db +:103ed40000a0033c3440622401000424080044ace4 +:103ee40000a0043c68408424344064ac0000033cdb +:0c3ef400000263240800e003040043ac5b +:020000040000fa +:020000041d02db +:103f0000496e766572746572207475726e65642090 +:103f10004f4e0000496e766572746572207475723a +:083f20006e6564204f46460067 +:020000040000fa +:020000041d02db +:103f2800029d033c78296324211883002110800016 +:103f38000100649020004324010084300800e0035d +:043f48000b106400f6 +:020000040000fa +:020000041d02db +:103f4c00029d023c782942242110820001004290fb +:103f5c00e0ff8324020042300b2062000800e003e3 +:043f6c0021108000a0 +:020000040000fa +:020000041d02db +:103f7000f8ffbd270400beaf21f0a00321e8c00375 +:103f80000400be8f0800bd270800e0030000000009 +:020000040000fa +:020000041d02db +:103f90005052494e544600005258204649464f2040 +:0c3fa0004f766572666c6f7700000000c1 +:020000040000fa +:020000041d02db +:103fac000100843003008014000000000800e003ce +:0c3fbc00006060410800e00320606041ec +:020000040000fa +:020000041d02db +:103fc8000300a01021300000df8a400b20000724e6 +:0c3fd80004000624df8a400b21380000a2 +:020000040000fa +:020000041d02db +:103fe4005761746368646f672077617320747269c2 +:083ff400676765726564000057 +:020000040000fa +:020000041d02db +:103ffc00f8ff0224008003402410620002004234c7 +:08400c000800e003008082407f +:020000040000fa +:020000041d02db +:10401400f8ff0224008003402410620003004234ad +:084024000800e0030080824067 +:020000040000fa +:020000041d02db +:10402c0000601a40bfff1b3cffff7b3724d05b03b3 +:08403c0000609a4018000042e8 +:020000040000fa +:020000041d02db +:10404400029d023c78294224211044000100429040 +:084054000800e0030700423000 +:020000040000fa +:020000041d02db +:10405c00029d023c78294224211044000100429028 +:08406c000800e00303004230ec +:020000040000fa +:020000041d02db +:10407400029d023c78294224211044000100429010 +:084084000800e00320004230b7 +:020000040000fa +:020000041d02db +:10408c00029d023c782942242110440001004290f8 +:08409c000800e00304004230bb +:020000040000fa +:020000041d02db +:1040a400029d023c782942242110440001004290e0 +:0840b4000800e0031700423090 +:020000040000fa +:020000041d02db +:1040bc00029d023c782942242110440001004290c8 +:0840cc000800e003020042308d +:020000040000fa +:020000041d02db +:1040d400029d023c782942242110440001004280c0 +:0840e4000800e00397004230e0 +:020000040000fa +:020000041d02db +:1040ec00029d023c78294224211044000100429098 +:0840fc000800e003100042304f +:020000040000fa +:020000041d02db +:10410400029d023c7829422421104400010042808f +:084114000800e00388004230be +:020000040000fa +:020000041d02db +:10411c00029d023c78294224211044000100429067 +:08412c000800e003010042302d +:020000040000fa +:020000041d02db +:10413400029d023c7829422421104400010042904f +:084144000800e00344004230d2 +:020000040000fa +:020000041d02db +:10414c0000a0023c5c40438c5c4044ac0800e003a3 +:04415c00000083ac30 +:020000040000fa +:020000041d02db +:104160005541525431204f45525200004a462e6369 +:0c4170006f6d00004a462e636f6d00006a +:020000040000fa +:020000041d02db +:08417c000800e003206062412d +:020000040000fa +:020000041d02db +:084184000800e0030060624145 +:020000040000fa +:020000041d02db +:08418c000800e0030000000040 +:020000040000fa +:020000041d02db +:084194000800e0030000000038 +:020000040000fa +:020000041d02db +:08419c000800e0038000822c02 +:020000040000fa +:020000041d02db +:0841a4000800e0037f008230f7 +:020000040000fa +:020000041d02db +:0841ac000800e003200082245a +:020000040000fa +:020000041d02db +:0841b4000800e003e0ff822493 +:020000040000fa +:020000041d02db +:0841bc000800e003800002246a +:020000040000fa +:020000041d02db +:1041c4000000804f0000004fbfad3a4f0000803d1b +:00000001FF diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map new file mode 100644 index 0000000..c3347e0 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.map @@ -0,0 +1,5221 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o (malloc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuinoV2_775F512H_/production/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + (_printf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) + build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o (_printf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) (__floatunsisf) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +mBatteryCurrent 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +TerminalWorkString 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +gu16BufferSize 0x2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mac_addr 0x6 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mRxData 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +mDeviceID 0x2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o +ActualTemp 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +PowerRelayState 0x4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o +param 0x1c build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +mModuleIPConfig 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +gsockerrno 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +astUartData 0x620 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +I2CSlaveBuffer 0xa build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +DataChunkWritten 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +mTxData 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +mI2CWaitCounter 0x4 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +gastrSockets 0xb0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +at_sb_printf 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +mTerminalTickState 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gfpPingCb 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +gu8OpCode 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +astTimer 0xf0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d003800 0xbd4c 48460 App's exec code +.text._vfprintf_cdfFnop 0x9d00f54c 0x13d4 5076 +.text 0x9d010920 0x7ed4 32468 App's exec code +.dinit 0x9d0187f4 0xb60 2912 +.rodata 0x9d019354 0x990 2448 Read-only const +.text 0x9d019ce4 0x974 2420 App's exec code +.text._vfscanf_s 0x9d01a658 0x868 2152 +.text 0x9d01aec0 0x2a84 10884 App's exec code +.rodata 0x9d01d944 0x494 1172 Read-only const +.text 0x9d01ddd8 0x1108 4360 App's exec code +.rodata 0x9d01eee0 0x404 1028 Read-only const +.text 0x9d01f2e4 0x103c 4156 App's exec code +.text.scale 0x9d020320 0x2a0 672 +.text.fpsubadd 0x9d0205c0 0x278 632 +.text.malloc 0x9d020838 0x278 632 +.text 0x9d020ab0 0x26c 620 App's exec code +.rodata 0x9d020d1c 0x268 616 Read-only const +.text 0x9d020f84 0x4a8 1192 App's exec code +.text.fp32div 0x9d02142c 0x230 560 +.text.__floatdisf 0x9d02165c 0x220 544 +.text.fp32mul 0x9d02187c 0x1bc 444 +.text 0x9d021a38 0x1a0 416 App's exec code +.text.realloc 0x9d021bd8 0x194 404 +.text._sbrk_init 0x9d021d6c 0x194 404 +.text._filbuf 0x9d021f00 0x188 392 +.text.read 0x9d022088 0x174 372 +.text 0x9d0221fc 0x2d0 720 App's exec code +.text.fputc 0x9d0224cc 0x15c 348 +.text._flsbuf 0x9d022628 0x12c 300 +.text 0x9d022754 0x11c 284 App's exec code +.text.fgetc 0x9d022870 0x108 264 +.rodata 0x9d022978 0x204 516 Read-only const +.text.setvbuf 0x9d022b7c 0xfc 252 +.rodata 0x9d022c78 0xe0 224 Read-only const +.text.general_exception 0x9d022d58 0xdc 220 +.text 0x9d022e34 0x1ac 428 App's exec code +.rodata 0x9d022fe0 0xc8 200 Read-only const +.text._sbrk 0x9d0230a8 0xc4 196 +.text 0x9d02316c 0xa8 168 App's exec code +.text.atoi 0x9d023214 0xa8 168 +.text.range 0x9d0232bc 0xa0 160 +.text.fpcmp 0x9d02335c 0x9c 156 +.text.fflush 0x9d0233f8 0x94 148 +.text.write 0x9d02348c 0x94 148 +.text.libm 0x9d023520 0x88 136 +.text 0x9d0235a8 0x80 128 App's exec code +.text.fptoul 0x9d023628 0x7c 124 +.text.SoftReset 0x9d0236a4 0x78 120 +.text.fputs 0x9d02371c 0x78 120 +.text.strncmp 0x9d023794 0x78 120 +.text.ungetc 0x9d02380c 0x74 116 +.text 0x9d023880 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d023958 0x68 104 +.rodata 0x9d0239c0 0x68 104 Read-only const +.text.sitofp 0x9d023a28 0x60 96 +.text.wspace 0x9d023a88 0x60 96 +.text 0x9d023ae8 0x58 88 App's exec code +.text._sscanf_s 0x9d023b40 0x54 84 +.text._bufallo 0x9d023b94 0x54 84 +.text.sbrk 0x9d023be8 0x50 80 +.text.main_entry 0x9d023c38 0x4c 76 +.text 0x9d023c84 0x4c 76 App's exec code +.text._bootstrap_except 0x9d023cd0 0x48 72 +.text 0x9d023d18 0x44 68 App's exec code +.text.puts 0x9d023d5c 0x44 68 +.text._printf_cdfFnopsu 0x9d023da0 0x40 64 +.vector_default 0x9d023de0 0x38 56 +.rodata 0x9d023e18 0x30 48 Read-only const +.text.INTConfigureSyste 0x9d023e48 0x30 48 +.text.free 0x9d023e78 0x30 48 +.rodata 0x9d023ea8 0x2c 44 Read-only const +.text._stub_sbd_memlayo 0x9d023ed4 0x2c 44 +.rodata 0x9d023f00 0x28 40 Read-only const +.text.tolower 0x9d023f28 0x24 36 +.text.toupper 0x9d023f4c 0x24 36 +.text 0x9d023f70 0x20 32 App's exec code +.rodata 0x9d023f90 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d023fac 0x1c 28 +.text.setbuf 0x9d023fc8 0x1c 28 +.rodata 0x9d023fe4 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d023ffc 0x18 24 +.text.CheKseg0CacheOn 0x9d024014 0x18 24 +.text 0x9d02402c 0x18 24 App's exec code +.text.isalnum 0x9d024044 0x18 24 +.text.isalpha 0x9d02405c 0x18 24 +.text.iscntrl 0x9d024074 0x18 24 +.text.isdigit 0x9d02408c 0x18 24 +.text.isgraph 0x9d0240a4 0x18 24 +.text.islower 0x9d0240bc 0x18 24 +.text.isprint 0x9d0240d4 0x18 24 +.text.ispunct 0x9d0240ec 0x18 24 +.text.isspace 0x9d024104 0x18 24 +.text.isupper 0x9d02411c 0x18 24 +.text.isxdigit 0x9d024134 0x18 24 +.text._buffree 0x9d02414c 0x14 20 +.rodata 0x9d024160 0x1c 28 Read-only const +.text.INTEnableInterrup 0x9d02417c 0x8 8 +.text.INTDisableInterru 0x9d024184 0x8 8 +.text._on_reset 0x9d02418c 0x8 8 +.text._on_bootstrap 0x9d024194 0x8 8 +.text.isascii 0x9d02419c 0x8 8 +.text.toascii 0x9d0241a4 0x8 8 +.text._tolower 0x9d0241ac 0x8 8 +.text._toupper 0x9d0241b4 0x8 8 +.text.getpagesize 0x9d0241bc 0x8 8 +.rodata 0x9d0241c4 0x10 16 Read-only const + Total kseg0_program_mem used : 0x209d4 133588 26.2% of 0x7c7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- + Total kseg0_boot_mem used : 0 0 <1% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d002180 0x10 16 General-Exception +.vector_0 0x9d002200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d002220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d002240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d002260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d002280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0022a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0022c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0022e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d002300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d002320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d002340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d002360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d002380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0023a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0023c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0023e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d002400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d002420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d002440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d002460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d002480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0024a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0024c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0024e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d002500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d002520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d002540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d002560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d002580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0025a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0025c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0025e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d002600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d002620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d002640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d002660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d002680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0026a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0026c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0026e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d002700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d002720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d002740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d002760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d002780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0027a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0027c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0027e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d002800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d002820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d002840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d002860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d002880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0028a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0028c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0028e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d002900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d002920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d002940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d002960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d002980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0029a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0029c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0029e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x1f0 496 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x200 512 43.8% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x20de4 134628 26.0% of 0x7e47f + -------------------------------------------------------------------------- + + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.eh_frame 0xa0000000 0x30 48 +.sdata 0xa0000030 0x7c 124 Small init data +.sbss 0xa00000ac 0x194 404 Small uninit data +.bss 0xa0000240 0x2e30 11824 Uninitialized data +.data 0xa0003070 0x4bc 1212 Initialized data +.bss 0xa000352c 0x800 2048 Uninitialized data +.data 0xa0003d2c 0x2c4 708 Initialized data +.bss 0xa0003ff0 0x74 116 Uninitialized data + Total kseg1_data_mem used : 0x4064 16484 25.2% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x4064 16484 25.2% of 0x10000 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa0004068 0x200 512 Reserved for heap +stack 0xa0004280 0xbd70 48496 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_program_mem 0x9d003800 0x0007c7ff xr +kseg0_boot_mem 0x9d003000 0x000007f0 +exception_mem 0x9d002000 0x00001000 +kseg1_boot_mem 0xbfc00000 0x00000490 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +kseg1_data_mem 0xa0000000 0x00010000 w !x +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Uart.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Util.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/main.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/system.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/template.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/timer.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/SPI.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/ina219.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/I2C.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/TC77.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d002000 _ebase_address = 0x9d002000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d002180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x1f0 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + *(.reset.startup) + .reset.startup + 0xbfc00008 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d002180 0x10 + *(.gen_handler) + .gen_handler 0x9d002180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d002200 0x8 + *(.vector_0) + .vector_0 0x9d002200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d002200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d002220 0x8 + *(.vector_1) + .vector_1 0x9d002220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d002220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d002240 0x8 + *(.vector_2) + .vector_2 0x9d002240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d002240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d002260 0x8 + *(.vector_3) + .vector_3 0x9d002260 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d002260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d002280 0x8 + *(.vector_4) + .vector_4 0x9d002280 0x8 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0x9d002280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0022a0 0x8 + *(.vector_5) + .vector_5 0x9d0022a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0022a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0022c0 0x8 + *(.vector_6) + .vector_6 0x9d0022c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0022c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0022e0 0x8 + *(.vector_7) + .vector_7 0x9d0022e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0022e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d002300 0x8 + *(.vector_8) + .vector_8 0x9d002300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d002300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d002320 0x8 + *(.vector_9) + .vector_9 0x9d002320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d002320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d002340 0x8 + *(.vector_10) + .vector_10 0x9d002340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d002340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d002360 0x8 + *(.vector_11) + .vector_11 0x9d002360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d002360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d002380 0x8 + *(.vector_12) + .vector_12 0x9d002380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d002380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0023a0 0x8 + *(.vector_13) + .vector_13 0x9d0023a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0023a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0023c0 0x8 + *(.vector_14) + .vector_14 0x9d0023c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0023c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0023e0 0x8 + *(.vector_15) + .vector_15 0x9d0023e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0023e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d002400 0x8 + *(.vector_16) + .vector_16 0x9d002400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d002400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d002420 0x8 + *(.vector_17) + .vector_17 0x9d002420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d002420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d002440 0x8 + *(.vector_18) + .vector_18 0x9d002440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d002440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d002460 0x8 + *(.vector_19) + .vector_19 0x9d002460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d002460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d002480 0x8 + *(.vector_20) + .vector_20 0x9d002480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d002480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0024a0 0x8 + *(.vector_21) + .vector_21 0x9d0024a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0024a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0024c0 0x8 + *(.vector_22) + .vector_22 0x9d0024c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0024c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0024e0 0x8 + *(.vector_23) + .vector_23 0x9d0024e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0024e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d002500 0x8 + *(.vector_24) + .vector_24 0x9d002500 0x8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d002500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d002520 0x8 + *(.vector_25) + .vector_25 0x9d002520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d002520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d002540 0x8 + *(.vector_26) + .vector_26 0x9d002540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d002540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d002560 0x8 + *(.vector_27) + .vector_27 0x9d002560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d002560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d002580 0x8 + *(.vector_28) + .vector_28 0x9d002580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d002580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0025a0 0x8 + *(.vector_29) + .vector_29 0x9d0025a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0025a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0025c0 0x8 + *(.vector_30) + .vector_30 0x9d0025c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0025c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0025e0 0x8 + *(.vector_31) + .vector_31 0x9d0025e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0025e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d002600 0x8 + *(.vector_32) + .vector_32 0x9d002600 0x8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d002600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d002620 0x8 + *(.vector_33) + .vector_33 0x9d002620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d002620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d002640 0x8 + *(.vector_34) + .vector_34 0x9d002640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d002640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d002660 0x8 + *(.vector_35) + .vector_35 0x9d002660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d002660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d002680 0x8 + *(.vector_36) + .vector_36 0x9d002680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d002680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0026a0 0x8 + *(.vector_37) + .vector_37 0x9d0026a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0026a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0026c0 0x8 + *(.vector_38) + .vector_38 0x9d0026c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0026c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0026e0 0x8 + *(.vector_39) + .vector_39 0x9d0026e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0026e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d002700 0x8 + *(.vector_40) + .vector_40 0x9d002700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d002700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d002720 0x8 + *(.vector_41) + .vector_41 0x9d002720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d002720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d002740 0x8 + *(.vector_42) + .vector_42 0x9d002740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d002740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d002760 0x8 + *(.vector_43) + .vector_43 0x9d002760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d002760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d002780 0x8 + *(.vector_44) + .vector_44 0x9d002780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d002780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0027a0 0x8 + *(.vector_45) + .vector_45 0x9d0027a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0027a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0027c0 0x8 + *(.vector_46) + .vector_46 0x9d0027c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0027c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0027e0 0x8 + *(.vector_47) + .vector_47 0x9d0027e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0027e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d002800 0x8 + *(.vector_48) + .vector_48 0x9d002800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d002800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d002820 0x8 + *(.vector_49) + .vector_49 0x9d002820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d002820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d002840 0x8 + *(.vector_50) + .vector_50 0x9d002840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d002840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d002860 0x8 + *(.vector_51) + .vector_51 0x9d002860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d002860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d002880 0x8 + *(.vector_52) + .vector_52 0x9d002880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d002880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0028a0 0x8 + *(.vector_53) + .vector_53 0x9d0028a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0028a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0028c0 0x8 + *(.vector_54) + .vector_54 0x9d0028c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0028c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0028e0 0x8 + *(.vector_55) + .vector_55 0x9d0028e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0028e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d002900 0x8 + *(.vector_56) + .vector_56 0x9d002900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d002900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d002920 0x8 + *(.vector_57) + .vector_57 0x9d002920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d002920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d002940 0x8 + *(.vector_58) + .vector_58 0x9d002940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d002940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d002960 0x8 + *(.vector_59) + .vector_59 0x9d002960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d002960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d002980 0x8 + *(.vector_60) + .vector_60 0x9d002980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d002980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0029a0 0x8 + *(.vector_61) + .vector_61 0x9d0029a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0029a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0029c0 0x8 + *(.vector_62) + .vector_62 0x9d0029c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0029c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0029e0 0x8 + *(.vector_63) + .vector_63 0x9d0029e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0029e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup + *(.startup) + +.text 0x9d003800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d003800 . = ALIGN (0x4) + +.init 0x9d003800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d003800 . = ALIGN (0x4) + +.fini 0x9d003800 0x0 + *(.fini) + 0x9d003800 . = ALIGN (0x4) + +.preinit_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d003800 PROVIDE (__preinit_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.init_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d003800 PROVIDE (__init_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.fini_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d003800 PROVIDE (__fini_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.ctors 0x9d003800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d003800 . = ALIGN (0x4) + +.dtors 0x9d003800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d003800 . = ALIGN (0x4) + +.rodata 0x9d003800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d003800 . = ALIGN (0x4) + +.sdata2 0x9d003000 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d003000 . = ALIGN (0x4) + +.sbss2 0x9d003000 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d003000 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d003000 . = ALIGN (0x4) + +.dbg_data 0xa0000000 0x0 + 0xa0000000 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000000 0x0 + *(.jcr) + 0xa0000000 . = ALIGN (0x4) + +.eh_frame 0xa0000000 0x30 + *(.eh_frame) + .eh_frame 0xa0000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000030 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000030 . = ALIGN (0x4) + +.persist 0xa0000030 0x0 + 0xa0000030 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 _persist_end = . + +.data 0xa0000030 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 . = . + 0xa0008020 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000030 0x0 + *(.got.plt) + *(.got) + 0xa0000030 . = ALIGN (0x4) + +.sdata 0xa0000030 0x7c + 0xa0000030 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000030 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000030 egstrNmBusCapabilities + .sdata 0xa0000034 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .sdata 0xa000003c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sdata 0xa0000040 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sdata 0xa0000044 0x2 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000044 State + *fill* 0xa0000046 0x2 + .sdata 0xa0000048 0xc build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .sdata 0xa0000054 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0xa0000054 gUartStrings + .sdata 0xa0000058 0x8 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .sdata 0xa0000060 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa0000067 TerminalSocket + 0xa0000068 TerminalServerSocket + 0xa0000069 SyslogSocket + 0xa000006a SyslogServerSocket + 0xa000006b NetworkSocket + 0xa000006c NetworkServerSocket + 0xa000006d BootloaderSocket + 0xa000006e BootloaderServerSocket + 0xa000006f mWiFiState + .sdata 0xa0000070 0x4 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + 0xa0000070 mLoraPreamble + .sdata 0xa0000074 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .sdata 0xa000007c 0x8 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .sdata 0xa0000084 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .sdata 0xa000008c 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa0000094 BtldrComputedCRC + 0xa0000098 BootloaderState + 0xa000009c BootloaderDataStartPtr + .sdata 0xa00000a4 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa00000a4 _Files + .sdata 0xa00000a8 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa00000a8 __XC_UART + 0xa00000ac . = ALIGN (0x4) + 0xa00000ac _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa00000ac . = ALIGN (0x4) + 0xa00000ac _data_end = . + 0xa00000ac _bss_begin = . + +.sbss 0xa00000ac 0x194 + 0xa00000ac _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa00000ac 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .sbss 0xa00000b0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0xa00000b8 pfWifiCb + 0xa00000bc pfIpCb + 0xa00000c0 pfOtaCb + 0xa00000c4 pfSigmaCb + 0xa00000c8 pfHifCb + 0xa00000cc pfSSLCb + .sbss 0xa00000d0 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .sbss 0xa00000d8 0x8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sbss 0xa00000e0 0x14 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .sbss 0xa00000f4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sbss 0xa00000f8 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + *fill* 0xa00000f9 0x1 + .sbss 0xa00000fa 0x6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa00000fa gu16SessionID + 0xa00000fc gbSocketInit + .sbss 0xa0000100 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .sbss 0xa0000104 0x4 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa0000104 LoraData + .sbss 0xa0000108 0x18 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000108 DataSize + 0xa000010c DataCtr + 0xa0000110 BufPtr + 0xa0000114 RxPtr + 0xa0000115 Command + 0xa0000116 CRC + 0xa0000117 SenderID + 0xa0000118 SenderAddress + 0xa0000119 Flags + 0xa000011a IsUpdating + 0xa000011c BmpDataPtr + .sbss 0xa0000120 0xc build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .sbss 0xa000012c 0x18 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa000012c gu32HostIp + 0xa0000130 gu8RetryCount + 0xa0000140 mWiFiInitOK + .sbss 0xa0000144 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .sbss 0xa0000148 0x8 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0xa0000148 ina219_currentDivider_mA + 0xa000014c ina219_powerDivider_mW + .sbss 0xa0000150 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + 0xa0000150 WatchdogTriggered + .sbss 0xa0000154 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa0000154 BootloaderHeader + 0xa0000158 BootloaderDataSize + 0xa000015c BootloaderDataCtr + 0xa0000160 BootloaderBufPtr + 0xa0000164 BootloaderCRC + 0xa0000168 BootloaderCommand + .sbss 0xa000016c 0x1 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .sbss 0xa000016d 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000016d _outdone + *fill* 0xa000016e 0x2 + .sbss 0xa0000170 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0000170 __allocp + 0xa0000174 __alloct + 0xa0000178 __allocx + .sbss 0xa0000180 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa0000180 errno + .sbss 0xa0000184 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa0000184 _minbrk + 0xa0000188 _maxbrk + *(.scommon) + .scommon 0xa000018c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0xa000018c at_sb_printf + .scommon 0xa0000190 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000190 mWifiSPIBaudrate + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .scommon 0xa0000191 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + *fill* 0xa0000191 0x3 + .scommon 0xa0000194 0x15 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa0000194 gpfAppResolveCb + 0xa0000198 gu16BufferSize + 0xa000019c gpfAppSocketCb + 0xa00001a0 gsockerrno + 0xa00001a4 gfpPingCb + 0xa00001a8 gu8OpCode + .scommon 0xa00001a9 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .scommon 0xa00001a9 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + *fill* 0xa00001a9 0x3 + .scommon 0xa00001ac 0x2 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa00001ac acIntUartRxBuff + *fill* 0xa00001ae 0x2 + .scommon 0xa00001b0 0x14 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0xa00001b0 mTerminalOpened + 0xa00001b4 TerminalDataPtr + 0xa00001b8 mTerminalPendingAction + 0xa00001bc mHelpStringPtr + 0xa00001c0 mTerminalTickState + .scommon 0xa00001c4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0xa00001c4 ActualTemp + .scommon 0xa00001c8 0xa build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa00001c8 u8IsMacAddrValid + 0xa00001cc mac_addr + .scommon 0xa00001d2 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + *fill* 0xa00001d2 0x2 + .scommon 0xa00001d4 0x4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + 0xa00001d4 PowerRelayState + .scommon 0xa00001d8 0x18 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + 0xa00001d8 mBatteryCurrent + 0xa00001dc mVoltageMeanSum + 0xa00001e0 mVoltageMeanCount + 0xa00001e4 mBatterySOC + 0xa00001e8 mBatteryVoltage + 0xa00001ec mCurrentModuleOK + .scommon 0xa00001f0 0x8 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + 0xa00001f0 mLastTransactionOK + 0xa00001f4 mI2CWaitCounter + .scommon 0xa00001f8 0x2 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0xa00001f8 mSPIFlashHighSpeedBaudrate + 0xa00001f9 mSPIFlashBaudrate + *fill* 0xa00001fa 0x2 + .scommon 0xa00001fc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0xa00001fc mSyslogBufPtr + .scommon 0xa0000200 0x38 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0xa0000200 CurDataChunkSize + 0xa0000204 BootloaderFirmwareChunkWriteCount + 0xa0000208 BootloaderFlashWriteDataPtr + 0xa000020c BootloaderFlashErased + 0xa0000210 BootloaderFlashWriteState + 0xa0000214 BootloaderCurFlashWriteAddress + 0xa0000218 BooloaderFlashEraseState + 0xa000021c BootloaderCurFlashEraseAddress + 0xa0000220 BootloaderFlashWritePollCount + 0xa0000224 BootloaderInterfaceState + 0xa0000228 DataChunkWritten + 0xa000022c BooloaderFlashErasePollCount + 0xa0000230 FirmwareUploaded + 0xa0000234 CurDataChunkIndex + .scommon 0xa0000238 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .scommon 0xa0000238 0x2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + 0xa0000238 mDeviceID + *fill* 0xa000023a 0x2 + .scommon 0xa000023c 0x4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0xa000023c BootloaderRxPtr + 0xa0000240 _sbss_end = . + 0xa0000240 . = ALIGN (0x4) + +.bss 0xa0000240 0x2e30 + *(.dynbss) + *(COMMON) + COMMON 0xa0000240 0xb0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa0000240 gastrSockets + COMMON 0xa00002f0 0x40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0xa00002f0 astInternalUartData + COMMON 0xa0000330 0x26e build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0xa0000330 mRxData + 0xa0000468 mTxData + *fill* 0xa000059e 0x2 + COMMON 0xa00005a0 0x384 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0xa00005a0 TerminalWorkString + 0xa00006cc TerminalPrevDataBuf + 0xa00007f8 TerminalDataBuf + COMMON 0xa0000924 0x620 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0xa0000924 astUartData + COMMON 0xa0000f44 0xf0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0xa0000f44 astTimer + COMMON 0xa0001034 0xd04 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0xa0001034 NetworkRxBuf + 0xa0001434 TerminalRxBuf + 0xa0001834 BootloaderRxBuf + 0xa0001c34 addr_in + 0xa0001c44 param + 0xa0001c60 mModuleIPConfig + 0xa0001c70 SyslogRxBuf + COMMON 0xa0001d38 0x16 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0xa0001d38 I2CSlaveBuffer + 0xa0001d44 I2CMasterBuffer + *fill* 0xa0001d4e 0x2 + COMMON 0xa0001d50 0x1000 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0xa0001d50 mFlashSectorBuffer + COMMON 0xa0002d50 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0xa0002d50 mSyslogBuffer + COMMON 0xa0002f44 0x12c build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0xa0002f44 BootloaderBuffer + 0xa0003070 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0003070 . = ALIGN (0x4) + 0xa0003070 _end = . + 0xa0003070 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0003070 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .mdebug.abi32 0xa0003070 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .mdebug.abi32 0xa0003070 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x248 + *(.comment) + .comment 0x00000000 0x3c build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xa88 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_aranges + 0x00000440 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_aranges + 0x00000460 0x20 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_aranges + 0x00000480 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_aranges + 0x000004a0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_aranges + 0x000004c0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_aranges + 0x000004e0 0x20 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_aranges + 0x00000500 0x20 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_aranges + 0x00000520 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000540 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000568 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x00000688 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_aranges + 0x000006b8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x000006e0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000708 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000728 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_aranges + 0x00000748 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000768 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x00000788 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000007a8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x000007d0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_aranges + 0x000007f8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000828 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000848 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000868 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x00000888 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000928 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000948 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000968 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000009a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000009c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x000009e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000a08 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000a28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000a48 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_aranges + 0x00000a68 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_pubnames + 0x00000000 0x34ca + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x20 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000020 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubnames + 0x000000c6 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubnames + 0x0000016c 0x8f build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubnames + 0x000001fb 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubnames + 0x0000021e 0x173 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubnames + 0x00000391 0xe5 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubnames + 0x00000476 0xa6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubnames + 0x0000051c 0x104 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000620 0x6fd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000d1d 0x207 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubnames + 0x00000f24 0xcd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubnames + 0x00000ff1 0xee build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubnames + 0x000010df 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubnames + 0x00001102 0xb8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubnames + 0x000011ba 0x23 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubnames + 0x000011dd 0x1ce build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubnames + 0x000013ab 0x75 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubnames + 0x00001420 0x31 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubnames + 0x00001451 0x24 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_pubnames + 0x00001475 0x125 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_pubnames + 0x0000159a 0x194 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_pubnames + 0x0000172e 0x174 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_pubnames + 0x000018a2 0x101 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_pubnames + 0x000019a3 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_pubnames + 0x00001a7b 0x31 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_pubnames + 0x00001aac 0x49 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_pubnames + 0x00001af5 0xec build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_pubnames + 0x00001be1 0x347 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_pubnames + 0x00001f28 0x25 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_pubnames + 0x00001f4d 0x72 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001fbf 0xca build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubnames + 0x00002089 0x41 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_pubnames + 0x000020ca 0x13b build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_pubnames + 0x00002205 0x1af build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_pubnames + 0x000023b4 0x92 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_pubnames + 0x00002446 0x18a build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_pubnames + 0x000025d0 0xa3 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_pubnames + 0x00002673 0x71 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_pubnames + 0x000026e4 0x3b9 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_pubnames + 0x00002a9d 0x7d build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_pubnames + 0x00002b1a 0x5c build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_pubnames + 0x00002b76 0x310 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002e86 0x2f build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_pubnames + 0x00002eb5 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002ed5 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x00002f10 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x00002f39 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002f63 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x00002f8e 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00002fb9 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x00002fec 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x0000300c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x00003030 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00003058 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00003075 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_pubnames + 0x000030a7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x000030cc 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x000030f5 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x00003113 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_pubnames + 0x0000313d 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00003167 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x00003187 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x000031a3 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x000031cf 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_pubnames + 0x000031fb 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x0000321c 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x0000323a 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00003256 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x00003271 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x00003352 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x0000336f 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x0000338d 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x000033e9 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x00003404 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x00003420 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x00003442 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x00003466 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x00003486 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubnames + 0x000034a6 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_info 0x00000000 0x40899 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x37a8 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_info 0x000037a8 0x1cdf build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_info 0x00005487 0x1654 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_info 0x00006adb 0x3e6 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_info 0x00006ec1 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_info 0x00006ec1 0x146 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_info 0x00007007 0x118f build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_info 0x00008196 0x98d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_info 0x00008b23 0x47c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_info 0x00008f9f 0xc18 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_info 0x00009bb7 0x3a40 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_info 0x0000d5f7 0xa04 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_info 0x0000dffb 0x52c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_info 0x0000e527 0x680 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_info 0x0000eba7 0x141 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_info 0x0000ece8 0x92d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_info 0x0000f615 0x142 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_info 0x0000f757 0x1ddb build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_info 0x00011532 0x7e0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_info 0x00011d12 0x557 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_info 0x00012269 0x115b build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_info 0x000133c4 0x3b38 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_info 0x00016efc 0x1aa3 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_info 0x0001899f 0x1963 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_info 0x0001a302 0x19e8 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_info 0x0001bcea 0x14fb build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_info 0x0001d1e5 0x127b build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_info 0x0001e460 0x113f build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_info 0x0001f59f 0x1a37 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_info 0x00020fd6 0x113b build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_info 0x00022111 0x113d build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_info 0x0002324e 0x214f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_info 0x0002539d 0x31ba build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_info 0x00028557 0x131a build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_info 0x00029871 0x1d66 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_info 0x0002b5d7 0x1791 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_info 0x0002cd68 0x12f5 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_info 0x0002e05d 0x188b build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_info 0x0002f8e8 0x15a7 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_info 0x00030e8f 0x16f7 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_info 0x00032586 0x181c build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_info 0x00033da2 0x159e build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_info 0x00035340 0x1328 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_info 0x00036668 0x2b2e build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_info 0x00039196 0x130c build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_info 0x0003a4a2 0x14cc build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_info 0x0003b96e 0x1f92 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_info 0x0003d900 0x2d0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_info 0x0003dbd0 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003dc7e 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0003dd39 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0003dde7 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0003de97 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0003df49 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0003dffb 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0003e0dd 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0003e199 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0003e25d 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0003e333 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0003e333 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x0003e3e8 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_info 0x0003e4cc 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0003e591 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0003e65c 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0003e713 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_info 0x0003e7d5 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x0003e898 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003e950 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x0003ea03 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0003eadd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0003eadd 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_info 0x0003ebc2 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003eca2 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x0003ed58 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x0003ee0b 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x0003eebc 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x0003eebc 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x0003f0d5 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x0003f0d5 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x0003f18a 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0003f240 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x0003f355 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x0003f400 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x0003f4ad 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x0003f4ad 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x0003f578 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x0003f83a 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x0003ffbc 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_info 0x00040774 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_abbrev 0x00000000 0x5cb8 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1f2 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_abbrev 0x000001f2 0x1f4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_abbrev 0x000003e6 0x239 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_abbrev 0x0000061f 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_abbrev 0x000006e7 0x1 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_abbrev 0x000006e8 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_abbrev 0x0000073d 0x23e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_abbrev 0x0000097b 0x157 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_abbrev 0x00000ad2 0x105 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_abbrev 0x00000bd7 0x1fd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_abbrev 0x00000dd4 0x224 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_abbrev 0x00000ff8 0x1ad build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_abbrev 0x000011a5 0x102 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_abbrev 0x000012a7 0x153 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_abbrev 0x000013fa 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_abbrev 0x0000144f 0x175 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_abbrev 0x000015c4 0x55 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_abbrev 0x00001619 0x245 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_abbrev 0x0000185e 0x122 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_abbrev 0x00001980 0xe8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_abbrev 0x00001a68 0x17b build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_abbrev 0x00001be3 0x2bb build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_abbrev 0x00001e9e 0x268 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_abbrev 0x00002106 0x2a0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_abbrev 0x000023a6 0x2c7 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_abbrev 0x0000266d 0x223 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_abbrev 0x00002890 0x1a2 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_abbrev 0x00002a32 0x166 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_abbrev 0x00002b98 0x339 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_abbrev 0x00002ed1 0x166 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_abbrev 0x00003037 0x166 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_abbrev 0x0000319d 0x217 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_abbrev 0x000033b4 0x316 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_abbrev 0x000036ca 0x18e build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_abbrev 0x00003858 0x272 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_abbrev 0x00003aca 0x1c4 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_abbrev 0x00003c8e 0x18e build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_abbrev 0x00003e1c 0x220 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_abbrev 0x0000403c 0x24d build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_abbrev 0x00004289 0x1da build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_abbrev 0x00004463 0x298 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_abbrev 0x000046fb 0x233 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_abbrev 0x0000492e 0x18c build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_abbrev 0x00004aba 0x2d9 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_abbrev 0x00004d93 0x1b5 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_abbrev 0x00004f48 0x1b2 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_abbrev 0x000050fa 0x2a4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_abbrev 0x0000539e 0x9a build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_abbrev 0x00005438 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x0000546a 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x0000548d 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000054b0 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x000054d3 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x000054f6 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00005519 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x0000553e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x00005563 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x00005588 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x000055ad 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x000055ae 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x000055d3 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_abbrev 0x00005614 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x00005639 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x0000565e 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00005683 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_abbrev 0x000056a8 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x000056cd 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x000056f2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x00005717 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x00005760 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x00005761 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_abbrev 0x000057a4 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x000057da 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x000057ff 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00005824 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00005849 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x0000584a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x0000586f 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00005870 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00005895 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x000058ba 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x000058f2 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x00005917 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x0000593c 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x0000593d 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x0000596f 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x000059e8 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00005b1a 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_abbrev 0x00005c59 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_line 0x00000000 0x82b9 + *(.debug_line) + .debug_line 0x00000000 0x20d build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_line 0x0000020d 0x251 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_line 0x0000045e 0x339 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_line 0x00000797 0x195 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_line 0x0000092c 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_line 0x0000092c 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_line 0x000009a6 0x3b2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_line 0x00000d58 0x22d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_line 0x00000f85 0x1e8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_line 0x0000116d 0x2cd build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_line 0x0000143a 0x568 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_line 0x000019a2 0x34b build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_line 0x00001ced 0x207 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_line 0x00001ef4 0x27e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_line 0x00002172 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_line 0x000021ec 0x2db build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_line 0x000024c7 0x7a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_line 0x00002541 0x4ef build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_line 0x00002a30 0x2d2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_line 0x00002d02 0x1f0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_line 0x00002ef2 0x156 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_line 0x00003048 0x2c6 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_line 0x0000330e 0x262 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_line 0x00003570 0x3c5 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_line 0x00003935 0x2ef build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_line 0x00003c24 0x25b build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_line 0x00003e7f 0x161 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_line 0x00003fe0 0x101 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_line 0x000040e1 0x38e build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_line 0x0000446f 0x101 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_line 0x00004570 0x101 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_line 0x00004671 0x22f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_line 0x000048a0 0x574 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_line 0x00004e14 0x155 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_line 0x00004f69 0x23d build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_line 0x000051a6 0x1ad build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_line 0x00005353 0x161 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_line 0x000054b4 0x2cc build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_line 0x00005780 0x23e build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_line 0x000059be 0x1e9 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_line 0x00005ba7 0x299 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_line 0x00005e40 0x2af build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_line 0x000060ef 0x165 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_line 0x00006254 0x4f2 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_line 0x00006746 0x193 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_line 0x000068d9 0x19a build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_line 0x00006a73 0x3d5 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_line 0x00006e48 0x137 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_line 0x00006f7f 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x00007030 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00007092 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x00007103 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00007175 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x000071e8 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x0000725b 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x000072f2 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x00007376 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x000073fe 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x00007494 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00007494 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x00007504 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_line 0x00007574 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x000075e2 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x00007652 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x000076c3 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_line 0x00007733 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x000077a4 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x00007814 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x00007883 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x000078f0 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x000078f0 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_line 0x00007960 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x000079d0 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00007a40 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00007aaf 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00007b1d 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00007b1d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00007b8d 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x00007b8d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00007bfd 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00007c6d 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x00007ce5 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00007d5d 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00007dd6 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00007dd6 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x00007e69 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x00007f6e 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x000080d6 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_line 0x0000822b 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_frame 0x00000000 0x3768 + *(.debug_frame) + .debug_frame 0x00000000 0x2c build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_frame 0x0000002c 0xfc build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_frame 0x00000128 0x9c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_frame 0x000001c4 0xd4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_frame 0x00000298 0x208 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_frame 0x000004a0 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_frame 0x000005ac 0xd4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_frame 0x00000680 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_frame 0x0000078c 0x748 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_frame 0x00000ed4 0x294 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_frame 0x00001168 0x128 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_frame 0x00001290 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_frame 0x0000139c 0x20c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_frame 0x000015a8 0x25c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_frame 0x00001804 0x17c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_frame 0x00001980 0x2c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_frame 0x000019ac 0x2c build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_frame 0x000019d8 0x138 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_frame 0x00001b10 0x130 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_frame 0x00001c40 0xf4 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_frame 0x00001d34 0x128 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_frame 0x00001e5c 0x10c build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_frame 0x00001f68 0x2c build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_frame 0x00001f94 0x64 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_frame 0x00001ff8 0x148 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_frame 0x00002140 0x2b8 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_frame 0x000023f8 0x2c build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_frame 0x00002424 0x64 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_frame 0x00002488 0xb8 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_frame 0x00002540 0x48 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_frame 0x00002588 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_frame 0x00002660 0x198 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_frame 0x000027f8 0x9c build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_frame 0x00002894 0x160 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_frame 0x000029f4 0xa0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_frame 0x00002a94 0x80 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_frame 0x00002b14 0x1b4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_frame 0x00002cc8 0x80 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_frame 0x00002d48 0x64 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_frame 0x00002dac 0x198 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_frame 0x00002f44 0x64 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_frame 0x00002fa8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00002fd0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x00003000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x00003020 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x00003040 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00003060 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x00003080 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x000030a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x000030c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x000030e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00003108 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00003134 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_frame 0x000031a0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x000031e8 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x00003220 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00003240 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_frame 0x00003268 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x00003294 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x000032bc 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x000032e8 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x00003320 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_frame 0x00003378 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x000033ec 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00003414 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00003444 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00003464 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x00003584 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x000035a4 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x000035d4 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x00003660 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x0000368c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x000036b4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x000036d4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00003700 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00003720 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_frame 0x00003740 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_str 0x00000000 0x3178 + *(.debug_str) + .debug_str 0x00000000 0x242 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_str 0x00000242 0x14a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_str 0x0000038c 0x149 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_str 0x000004d5 0xa build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_str 0x000004df 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_str 0x000004df 0x36 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_str 0x00000515 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_str 0x00000515 0xa build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_str 0x0000051f 0x25 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_str 0x00000544 0x178 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_str 0x000006bc 0x2d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_str 0x000006e9 0x31 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_str 0x0000071a 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_str 0x0000072c 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_str 0x0000072c 0x19 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_str 0x00000745 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_str 0x00000745 0x168 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_str 0x000008ad 0x2d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_str 0x000008da 0x16 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_str 0x000008f0 0x12f build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_str 0x00000a1f 0x226 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_str 0x00000c45 0x14f build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_str 0x00000d94 0x1ac build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_str 0x00000f40 0x181 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_str 0x000010c1 0x145 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_str 0x00001206 0x12f build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_str 0x00001335 0x12f build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_str 0x00001464 0x14d build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_str 0x000015b1 0x12f build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_str 0x000016e0 0x12f build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_str 0x0000180f 0x17f build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_str 0x0000198e 0x281 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_str 0x00001c0f 0x146 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_str 0x00001d55 0x170 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_str 0x00001ec5 0x15b build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_str 0x00002020 0x138 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_str 0x00002158 0x1ac build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_str 0x00002304 0x18b build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_str 0x0000248f 0x17e build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_str 0x0000260d 0x193 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_str 0x000027a0 0x14b build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_str 0x000028eb 0x15e build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_str 0x00002a49 0x29e build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_str 0x00002ce7 0x13a build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_str 0x00002e21 0x159 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_str 0x00002f7a 0x1fe build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_str 0x00003178 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_str 0x00003178 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_loc 0x00000000 0x1489 + *(.debug_loc) + .debug_loc 0x00000000 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x000000c9 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x00000a8c 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_loc 0x00001421 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x33f2 + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x276 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000276 0x149 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubtypes + 0x000003bf 0x14c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubtypes + 0x0000050b 0x3c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubtypes + 0x00000547 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubtypes + 0x00000559 0x5e build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubtypes + 0x000005b7 0xa2 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000659 0x48 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubtypes + 0x000006a1 0x10c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubtypes + 0x000007ad 0x41c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00000bc9 0x40 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubtypes + 0x00000c09 0x56 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubtypes + 0x00000c5f 0x5a build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubtypes + 0x00000cb9 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubtypes + 0x00000ccb 0x47 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubtypes + 0x00000d12 0x12 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubtypes + 0x00000d24 0x29d build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubtypes + 0x00000fc1 0x3c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00000ffd 0xcf build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubtypes + 0x000010cc 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .debug_pubtypes + 0x000011b3 0x1f8 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .debug_pubtypes + 0x000013ab 0x136 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .debug_pubtypes + 0x000014e1 0x175 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .debug_pubtypes + 0x00001656 0x155 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .debug_pubtypes + 0x000017ab 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .debug_pubtypes + 0x00001892 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .debug_pubtypes + 0x00001979 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .debug_pubtypes + 0x00001a60 0x13c build/ChaletDuinoV2_775F512H_/production/Source/main.o + .debug_pubtypes + 0x00001b9c 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .debug_pubtypes + 0x00001c83 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .debug_pubtypes + 0x00001d6a 0x145 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .debug_pubtypes + 0x00001eaf 0x2d3 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002182 0xfc build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .debug_pubtypes + 0x0000227e 0x17e build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x000023fc 0x136 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x00002532 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .debug_pubtypes + 0x0000262a 0x12e build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .debug_pubtypes + 0x00002758 0x121 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .debug_pubtypes + 0x00002879 0x110 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .debug_pubtypes + 0x00002989 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .debug_pubtypes + 0x00002a81 0x11a build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .debug_pubtypes + 0x00002b9b 0xf8 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .debug_pubtypes + 0x00002c93 0x2d0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .debug_pubtypes + 0x00002f63 0xe7 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .debug_pubtypes + 0x0000304a 0x10d build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .debug_pubtypes + 0x00003157 0x149 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .debug_pubtypes + 0x000032a0 0x2c build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .debug_pubtypes + 0x000032cc 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x0000330c 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x00003365 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubtypes + 0x000033be 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_ranges 0x00000000 0x280 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000050 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_ranges 0x00000070 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000088 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x000000a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x000000f0 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x00000108 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_ranges 0x00000120 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000140 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000160 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000170 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x00000200 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x00000210 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000220 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000250 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000270 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/system.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/template.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + .gnu.attributes + 0x00000290 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .gnu.attributes + 0x000002a0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + .gnu.attributes + 0x000002b0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .gnu.attributes + 0x000002c0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .gnu.attributes + 0x000002d0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + .gnu.attributes + 0x000002e0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + .gnu.attributes + 0x000002f0 0x10 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + .gnu.attributes + 0x00000300 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x00000560 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000570 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .gnu.attributes + 0x00000580 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_775F512H_/production/ChaletLora.X.production.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0004280 0x400 + .stack 0xa0004280 0x400 stack + +.data 0xa0003070 0x4bc + .data 0xa0003070 0x4bc build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.bss 0xa000352c 0x800 + .bss 0xa000352c 0x400 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .bss 0xa000392c 0x400 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + +.data 0xa0003d2c 0x2c4 + .data 0xa0003d2c 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003d2c _iob + .data 0xa0003dcc 0x6c build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + .data 0xa0003e38 0x58 build/ChaletDuinoV2_775F512H_/production/Source/main.o + .data 0xa0003e90 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + .data 0xa0003ee8 0x58 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .data 0xa0003f40 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + .data 0xa0003f98 0x58 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.bss 0xa0003ff0 0x74 + .bss 0xa0003ff0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003ff0 _sibuf + 0xa0004010 _sobuf + .bss 0xa0004030 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa000404c 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa000404c __allocs + .bss 0xa000405c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa0004060 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z23 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z24 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z40 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z41 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z43 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z44 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z60 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.bss%z61 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z62 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z63 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z64 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z65 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z66 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z67 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z68 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z69 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z70 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z71 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z72 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z73 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z74 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z75 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z76 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z77 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z78 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z79 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z80 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z81 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z82 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z83 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z84 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z85 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z86 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z87 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z88 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z89 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z90 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z91 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z92 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z93 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z94 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z95 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z96 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z97 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z98 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z99 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z100 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z101 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z102 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z103 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z104 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z105 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z106 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z107 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z108 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z109 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z110 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z111 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z112 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z113 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z114 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z115 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z116 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z117 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z118 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z119 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z120 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z121 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z122 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z123 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z124 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z125 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z126 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z127 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z128 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z129 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z130 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z131 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z132 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z133 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z134 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z135 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z136 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z137 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z138 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z139 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z140 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z141 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z142 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z143 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z144 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z145 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z146 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z147 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z148 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z149 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z150 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z151 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z152 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z153 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z154 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z155 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z156 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z157 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z158 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z159 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z160 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z161 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z162 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z163 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z164 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z165 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z166 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z167 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z168 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z169 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z170 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z171 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z172 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z173 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z174 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z175 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z176 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z177 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z178 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z179 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z180 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z181 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z182 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z183 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z184 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z185 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z186 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z187 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z188 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z189 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z190 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z191 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z192 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z193 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z194 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z195 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z196 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z197 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z198 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z199 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z200 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z201 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z202 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z203 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z204 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z205 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z208 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z212 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z213 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z214 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z215 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z216 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z217 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z218 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z219 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z220 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z221 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z222 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z229 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.bss%z231 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.data%z232 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.bss%z233 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + +.bss%z239 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.data%z240 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.bss%z241 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + +.data%z242 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + +.bss%z243 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + +.data%z244 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + +.bss%z245 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + +.data%z251 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + +.bss%z252 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + +.data%z253 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + +.bss%z254 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + +.data%z255 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + +.bss%z256 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.data%z257 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.bss%z258 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.data%z259 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.bss%z260 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.data%z262 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.bss%z263 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + +.data%z264 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + +.bss%z265 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + +.data%z266 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + +.bss%z267 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.data%z268 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.bss%z269 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + +.data%z275 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + +.bss%z276 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + +.data%z277 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + +.bss%z278 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.data%z279 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.bss%z280 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + +.data%z281 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + +.bss%z282 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.data%z283 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.bss%z284 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.data%z285 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.bss%z286 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.data%z287 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.bss%z288 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.data%z289 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.bss%z290 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.data%z291 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.bss%z292 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.data%z293 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.bss%z294 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.data%z295 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.bss%z296 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.data%z305 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.bss%z306 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.data%z307 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.bss%z308 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.data%z309 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.bss%z310 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.data%z311 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.bss%z312 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.data%z313 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.bss%z314 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + +.data%z315 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + +.bss%z316 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.data%z317 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.bss%z318 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z319 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +._debug_exception + 0xbfc00480 0x2c + ._debug_exception + 0xbfc00480 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + 0xbfc00480 __DbgExecReturn + +.text 0x9d003800 0xbd4c + .text 0x9d003800 0x2904 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + 0x9d003fb4 m2m_wifi_download_mode + 0x9d0042f4 m2m_wifi_ble_set_gain_table + 0x9d004368 m2m_wifi_init_hold + 0x9d0043ac m2m_wifi_init_start + 0x9d0044f8 m2m_wifi_init + 0x9d004554 m2m_wifi_deinit + 0x9d00459c m2m_wifi_reinit_hold + 0x9d0045d8 m2m_wifi_reinit_start + 0x9d004610 m2m_wifi_reinit + 0x9d004670 m2m_wifi_yield + 0x9d0046a0 m2m_wifi_handle_events + 0x9d0046d4 m2m_wifi_default_connect + 0x9d004720 m2m_wifi_connect + 0x9d004794 m2m_wifi_connect_sc + 0x9d004bd8 m2m_wifi_disconnect + 0x9d004c24 m2m_wifi_set_mac_address + 0x9d004c90 m2m_wifi_set_static_ip + 0x9d004d24 m2m_wifi_request_dhcp_client + 0x9d004d48 m2m_wifi_request_dhcp_server + 0x9d004d70 m2m_wifi_enable_dhcp + 0x9d004de8 m2m_wifi_set_lsn_int + 0x9d004e3c m2m_wifi_set_cust_InfoElement + 0x9d004e9c m2m_wifi_set_scan_options + 0x9d004f14 m2m_wifi_set_scan_region + 0x9d004f84 m2m_wifi_request_scan + 0x9d00502c m2m_wifi_request_scan_passive + 0x9d0050d4 m2m_wifi_wps + 0x9d005160 m2m_wifi_wps_disable + 0x9d0051b8 m2m_wifi_p2p + 0x9d005264 m2m_wifi_p2p_disconnect + 0x9d0052bc m2m_wifi_enable_ap + 0x9d005334 m2m_wifi_disable_ap + 0x9d00538c m2m_wifi_req_curr_rssi + 0x9d0053e4 m2m_wifi_req_restrict_ble + 0x9d00543c m2m_wifi_req_unrestrict_ble + 0x9d005494 m2m_wifi_send_ethernet_pkt + 0x9d005534 m2m_wifi_get_otp_mac_address + 0x9d0055b0 m2m_wifi_get_mac_address + 0x9d005624 m2m_wifi_req_scan_result + 0x9d005690 m2m_wifi_get_num_ap_found + 0x9d0056b8 m2m_wifi_get_sleep_mode + 0x9d0056e8 m2m_wifi_set_sleep_mode + 0x9d005774 m2m_wifi_request_sleep + 0x9d0057f8 m2m_wifi_set_device_name + 0x9d005894 m2m_wifi_get_chipId + 0x9d0058c4 m2m_wifi_get_firmware_version + 0x9d005928 m2m_wifi_check_ota_rb + 0x9d005994 m2m_ota_get_firmware_version + 0x9d0059f8 m2m_wifi_enable_monitoring_mode + 0x9d005aac m2m_wifi_disable_monitoring_mode + 0x9d005af8 m2m_wifi_send_wlan_pkt + 0x9d005b94 m2m_wifi_start_provision_mode + 0x9d005c8c m2m_wifi_stop_provision_mode + 0x9d005cd8 m2m_wifi_get_connection_info + 0x9d005d24 m2m_wifi_set_sytem_time + 0x9d005d78 m2m_wifi_get_sytem_time + 0x9d005dc4 m2m_wifi_enable_sntp + 0x9d005e3c m2m_wifi_set_power_profile + 0x9d005ea8 m2m_wifi_set_tx_power + 0x9d005f14 m2m_wifi_enable_firmware_logs + 0x9d005f80 m2m_wifi_set_battery_voltage + 0x9d005ff0 m2m_wifi_prng_get_random_bytes + 0x9d006090 m2m_wifi_ble_api_send + .text 0x9d006104 0x2140 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/socket/source/socket.o + 0x9d006104 Socket_ReadSocketData + 0x9d006a3c socketInit + 0x9d006ab0 socketDeinit + 0x9d006b10 registerSocketCallback + 0x9d006b48 socket + 0x9d006dd0 bind + 0x9d006f00 listen + 0x9d006fe8 accept + 0x9d00705c connect + 0x9d0071d4 send + 0x9d007378 sendto + 0x9d007510 recv + 0x9d0076f8 close + 0x9d007838 recvfrom + 0x9d007a28 nmi_inet_addr + 0x9d007b9c gethostbyname + 0x9d007fd4 setsockopt + 0x9d008160 getsockopt + 0x9d00819c m2m_ping_req + .text 0x9d008244 0x1a7c build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + 0x9d008244 InitUart + 0x9d0084f4 UartResetPort + 0x9d0087a8 UartOpenComPort + 0x9d008998 UartReceiveData + 0x9d008ae4 UartGetPendingDataSize + 0x9d008bdc UartTransmitData + 0x9d009320 DataSentNotification + 0x9d0095f4 UartTick + 0x9d009bcc UartBlockAndTick + 0x9d009c2c UartBlockUntillBufEmpty + .text 0x9d009cc0 0x18ac build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + 0x9d00a83c InitWiFi + 0x9d00ab14 TurnOFFWiFi + 0x9d00aba8 CloseSockets + 0x9d00ac94 GetWiFiSate + 0x9d00acb8 TickWiFi + 0x9d00ada4 OpenTerminalServer + 0x9d00ae60 SendTerminalData + 0x9d00aee8 SentTerminalByte + 0x9d00af64 OpenNetworkServer + 0x9d00b020 SendNetworkData + 0x9d00b0a8 SentNetworkByte + 0x9d00b124 OpenSyslogServer + 0x9d00b1e0 SendSyslogData + 0x9d00b258 SendSyslogByte + 0x9d00b2d4 IsSyslogClientConnected + 0x9d00b314 OpenBootloaderServer + 0x9d00b3d0 CloseBootloaderServer + 0x9d00b438 SendBootloaderData + 0x9d00b4b0 SendSBootloaderByte + 0x9d00b52c IsBootloaderClientConnected + .text 0x9d00b56c 0x1638 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + 0x9d00b56c BootloaderInterfaceInit + 0x9d00b5c0 BootloaderInterfaceTick + 0x9d00b5f8 BootloaderExecuteCmd + 0x9d00b860 BootloaderCRCError + 0x9d00b8c8 BootloaderInterfaceStateMachine + 0x9d00c178 BootloaderResetStateMachine + 0x9d00c1d4 BootloaderActivateBootloader + 0x9d00c214 BootloaderDeactivateBootloader + 0x9d00c244 BootloaderFlashEraseStateMachine + 0x9d00c478 ResetBootloaderFlashEraseStateMachine + 0x9d00c4ac BootloaderFlashWriteStateMachine + 0x9d00c6d8 BootloaderPrintFlashData + 0x9d00c6f8 BootloaderCheckFlashBootloaderData + 0x9d00caac ResetBootloaderFlashWriteStateMachine + 0x9d00caec BootloaderBytesToInt + .text 0x9d00cba4 0x1584 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmasic.o + 0x9d00cba4 chip_apply_conf + 0x9d00cc58 nm_clkless_wake + 0x9d00ce98 chip_idle + 0x9d00cf0c enable_rf_blocks + 0x9d00cfac enable_interrupts + 0x9d00d0b4 cpu_start + 0x9d00d230 nmi_get_chipid + 0x9d00d448 nmi_get_rfrevid + 0x9d00d4a0 restore_pmu_settings_after_global_reset + 0x9d00d4f4 nmi_update_pll + 0x9d00d568 nmi_set_sys_clk_src_to_xo + 0x9d00d5c4 chip_wake + 0x9d00d618 chip_reset_and_cpu_halt + 0x9d00d7ac chip_reset + 0x9d00d814 wait_for_bootrom + 0x9d00d9a0 wait_for_firmware_start + 0x9d00dac0 chip_deinit + 0x9d00dbdc set_gpio_dir + 0x9d00dcb0 set_gpio_val + 0x9d00dd84 get_gpio_val + 0x9d00de10 pullup_ctrl + 0x9d00dec8 nmi_get_otp_mac_address + 0x9d00e028 nmi_get_mac_address + .text 0x9d00e128 0x1424 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0x9d00e260 hif_chip_wake + 0x9d00e32c hif_set_sleep_mode + 0x9d00e35c hif_get_sleep_mode + 0x9d00e384 hif_chip_sleep + 0x9d00e4a8 hif_init + 0x9d00e514 hif_deinit + 0x9d00e574 hif_check_compatibility + 0x9d00e5ec hif_enable_access + 0x9d00e70c hif_check_code + 0x9d00e7fc hif_send + 0x9d00f114 hif_yield + 0x9d00f13c hif_handle_isr + 0x9d00f208 hif_receive + 0x9d00f464 hif_register_cb + +.text._vfprintf_cdfFnopsuxX + 0x9d00f54c 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d00f54c 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d00f54c _vfprintf_cdfFnopsuxX + 0x9d00f54c _vfprintf_cdfFnopuxX + 0x9d00f54c _vfprintf_cdnopsuxX + 0x9d00f54c _vfprintf_fF + 0x9d00f54c _vfprintf_cdnopuxX + +.text 0x9d010920 0x7ed4 + .text 0x9d010920 0x1170 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + 0x9d011620 spi_flash_read + 0x9d0116f8 spi_flash_write + 0x9d0118c4 spi_flash_erase + 0x9d011a10 spi_flash_get_size + .text 0x9d011a90 0x1108 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + 0x9d01252c nm_spi_write_reg + 0x9d012604 nm_spi_write_block + 0x9d01270c nm_spi_read_reg_with_ret + 0x9d012858 nm_spi_read_block + 0x9d012a14 nm_spi_init + 0x9d012b2c nm_spi_deinit + 0x9d012b54 nm_spi_read_reg + .text 0x9d012b98 0xf40 build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + 0x9d012b98 InternalUartInit + 0x9d012d70 OpenInternalPort + 0x9d012f90 SendInternalUartData + 0x9d0132ac SendInternalUartDataBlocking + 0x9d013384 TickInternalUart + 0x9d01345c InternalUart1AInterrupt + 0x9d013698 InternalUart2Interrupt + 0x9d0138b8 ResetUart1 + 0x9d0139c0 ResetUart2 + 0x9d013ab8 process + .text 0x9d013ad8 0xe68 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + 0x9d013ad8 InitTerminal + 0x9d013b58 TickTerminal + 0x9d013bb4 RxTerminalBuf + 0x9d013c40 RxTerminalData + 0x9d013d90 ParseNewBuffer + 0x9d01488c TerminalPrintString + 0x9d0148e0 TerminalPrintChar + 0x9d014920 TerminalStateMachine + .text 0x9d014940 0xd9c build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + 0x9d014940 InitSPIFlash + 0x9d014ab4 SPIFlashCheckAndConfigure + 0x9d014b84 SPIFlashWriteEnable + 0x9d014be8 SPIFlashReadStatusReg + 0x9d014c90 SPIFlashCheckBusy + 0x9d014cec SPIFlashCheckChipID + 0x9d014e28 SPIFlashReadBuffer + 0x9d014fa8 SPIFlashEraseSector + 0x9d0150d0 SPIFlashErase64KSector + 0x9d015224 SPIFlashWriteSectorWorkingBuffer + 0x9d0153e0 SPIFlashWriteByte + 0x9d015534 SPIFlashWriteBuffer + .text 0x9d0156dc 0xce8 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + 0x9d0156dc SwapEndianShort + 0x9d015728 SwapEndianInt + 0x9d015784 ConvertIntToStrLeadingZero + 0x9d015ba8 ConvertIntToStr + 0x9d015efc ConvertCharToStrLeadingZero + 0x9d016064 ConvertStrToValue + 0x9d016250 ConvertCharToStr + 0x9d016308 Crc8 + 0x9d0163a0 Delay + .text 0x9d0163c4 0xca4 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + 0x9d0163c4 BootloaderProtocolInit + 0x9d0163f4 BootloaderProtocolStateMachine + 0x9d01693c BootloaderProtocolProtocolAnalyzeNewData + 0x9d0169b8 BootloaderProtocolResetStateMachine + 0x9d016a0c BootloaderProtocolSendFrame + 0x9d016bd8 BootloaderProtocolGetDataBufferPtr + 0x9d016bfc BootloaderProtocolSendHeartbeat + 0x9d016c44 BootloaderProtocolSendACK + 0x9d016c98 BootloaderProtocolSendNACK + 0x9d016ce8 BootloaderProtocolSendInitUploadResponse + 0x9d016e48 BootloaderProtocolSendDataChunkResult + 0x9d016f3c BootloaderProtocolSendBootloaderState + 0x9d016fa0 BootloaderProtocolSendFirmwareUploadResult + 0x9d017004 BootloaderProtocolSendFlashCheckResult + .text 0x9d017068 0xbf4 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + 0x9d017374 m2m_ssl_handshake_rsp + 0x9d0173ec m2m_ssl_send_certs_to_winc + 0x9d017734 m2m_ssl_retrieve_cert + 0x9d017a70 m2m_ssl_retrieve_hash + 0x9d017b30 m2m_ssl_stop_processing_certs + 0x9d017b70 m2m_ssl_ecc_process_done + 0x9d017b94 m2m_ssl_set_active_ciphersuites + 0x9d017bfc m2m_ssl_init + .text 0x9d017c5c 0xb98 build/ChaletDuinoV2_775F512H_/production/Source/timer.o + 0x9d017c5c TimerInit + 0x9d017d2c IsMilliSecTimerExpired + 0x9d017e94 IsSecTimerExpired + 0x9d017ff8 IsTimerExpired + 0x9d0183ac TimerStart + 0x9d0184d4 TimerStartSeconds + 0x9d018578 TimerReset + 0x9d0185fc IsTimerRunning + 0x9d018640 TimerStop + 0x9d018684 Sleep + 0x9d0186e0 Timer1MilliSecInterrupt + +.dinit 0x9d0187f4 0xb60 + .dinit 0x9d0187f4 0xb60 data_init + +.rodata 0x9d019354 0x990 + .rodata 0x9d019354 0x990 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderInterface.o + +.text 0x9d019ce4 0x974 + .text 0x9d019ce4 0x974 build/ChaletDuinoV2_775F512H_/production/Source/NetworkProtocol.o + 0x9d019ce4 ProtocolInit + 0x9d019d14 StateMachine + 0x9d01a290 ProtocolAnalyzeNewData + 0x9d01a2d0 ResetStateMachine + 0x9d01a318 ProtocolExecCmd + 0x9d01a354 ProtocolAcknowledge + 0x9d01a3b8 ProtocolCalcCrc + 0x9d01a434 ProtocolIsReceiving + 0x9d01a474 ProtocolGetFrame + 0x9d01a630 ProtocolMsgDataPtr + +.text._vfscanf_s + 0x9d01a658 0x868 + .text._vfscanf_s + 0x9d01a658 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01a658 _vfscanf_s + 0x9d01a658 _vfscanf_0 + +.text 0x9d01aec0 0x2a84 + .text 0x9d01aec0 0x740 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + 0x9d01aec0 nm_get_hif_info + 0x9d01af60 nm_get_firmware_full_info + 0x9d01b0f4 nm_get_ota_firmware_info + 0x9d01b288 nm_drv_init_download_mode + 0x9d01b304 nm_drv_init_hold + 0x9d01b3b0 nm_drv_init_start + 0x9d01b4e4 nm_drv_init + 0x9d01b548 nm_drv_deinit + 0x9d01b5c8 nm_cpu_start + .text 0x9d01b600 0x6fc build/ChaletDuinoV2_775F512H_/production/Source/ChaletduinoV2Board.o + 0x9d01b600 InitBoard + .text 0x9d01bcfc 0x674 build/ChaletDuinoV2_775F512H_/production/Source/LoraNetworkInterface.o + 0x9d01bcfc ExecuteMasterCommand + 0x9d01c280 SendLoraNetworkCommand + 0x9d01c328 TestTx + .text 0x9d01c370 0x654 build/ChaletDuinoV2_775F512H_/production/Source/ina219.o + 0x9d01c578 ina219SetCalibration_13V_10A + 0x9d01c5dc ina219SetCalibration_32V_2A + 0x9d01c640 ina219SetCalibration_32V_1A + 0x9d01c6a4 ina219SetCalibration_16V_500mA + 0x9d01c708 ina219SetCalibration_16V_200mA + 0x9d01c76c ina219Init + 0x9d01c7ec ina219GetShuntVoltage + 0x9d01c830 ina219GetBusVoltage + 0x9d01c884 ina219GetPower + 0x9d01c8c8 ina219GetPower_mW + 0x9d01c924 ina219GetCurrent + 0x9d01c968 ina219GetCurrent_mA + .text 0x9d01c9c4 0x574 build/ChaletDuinoV2_775F512H_/production/Source/I2C.o + 0x9d01c9c4 I2CInit + 0x9d01ca30 I2CWrite + 0x9d01cbf4 I2CTransmitByte + 0x9d01cc20 I2CRead + 0x9d01cf14 I2CWasLastTransactionOK + .text 0x9d01cf38 0x51c build/ChaletDuinoV2_775F512H_/production/Source/main.o + 0x9d01cf38 main + 0x9d01d414 _mon_putc + .text 0x9d01d454 0x4f0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + 0x9d01d58c m2m_ota_init + 0x9d01d600 m2m_ota_notif_set_url + 0x9d01d674 m2m_ota_notif_check_for_update + 0x9d01d6cc m2m_ota_notif_sched + 0x9d01d728 m2m_ota_start_update + 0x9d01d79c m2m_ota_rollback + 0x9d01d844 m2m_ota_abort + 0x9d01d89c m2m_ota_switch_firmware + +.rodata 0x9d01d944 0x494 + .rodata 0x9d01d944 0x494 build/ChaletDuinoV2_775F512H_/production/Source/Terminal.o + +.text 0x9d01ddd8 0x1108 + .text 0x9d01ddd8 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d01ddd8 __umoddi3 + .text 0x9d01e234 0x454 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmbus.o + 0x9d01e234 nm_bus_iface_init + 0x9d01e280 nm_bus_iface_deinit + 0x9d01e2bc nm_bus_iface_reconfigure + 0x9d01e2e8 nm_read_reg + 0x9d01e320 nm_read_reg_with_ret + 0x9d01e360 nm_write_reg + 0x9d01e3f0 nm_read_block + 0x9d01e564 nm_write_block + .text 0x9d01e688 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01e688 __udivdi3 + .text 0x9d01ead4 0x40c build/ChaletDuinoV2_775F512H_/production/Source/winc3400/common/source/nm_common.o + 0x9d01ead4 m2m_memcpy + 0x9d01eb58 m2m_checksum + 0x9d01ebc8 m2m_memset + 0x9d01ec40 m2m_strlen + 0x9d01ec9c m2m_strncmp + 0x9d01ed70 m2m_strstr + 0x9d01ee48 m2m_memcmp + +.rodata 0x9d01eee0 0x404 + .rodata 0x9d01eee0 0x404 build/ChaletDuinoV2_775F512H_/production/Source/Util.o + 0x9d01eee4 CRC8_TABLE + +.text 0x9d01f2e4 0x103c + .text 0x9d01f2e4 0x390 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0x9d01f2e4 nm_spi_rw + 0x9d01f4a4 nm_bus_init + 0x9d01f590 nm_bus_ioctl + 0x9d01f624 nm_bus_deinit + 0x9d01f64c nm_bus_reinit + .text 0x9d01f674 0x378 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + 0x9d01f674 TC77Configure + 0x9d01f8c4 TC77GetActualTemp + 0x9d01f9c8 TC77GetDeviceID + .text 0x9d01f9ec 0x374 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + 0x9d01fbf0 m2m_periph_init + 0x9d01fc18 m2m_periph_gpio_set_dir + 0x9d01fc70 m2m_periph_gpio_set_val + 0x9d01fcc8 m2m_periph_gpio_get_val + 0x9d01fd18 m2m_periph_pullup_ctrl + .text 0x9d01fd60 0x2f8 build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + 0x9d01fd60 InitBatteryMonitor + 0x9d01fdd0 BatteryMonitorTick + 0x9d01ff44 GetBatteryVoltage + 0x9d01ffac GetSolarPanelCurrent + 0x9d01ffd0 GetBatterySOC + 0x9d01fff4 SendNetworkBatteryData + 0x9d020034 GetCurrentModuleOK + .text 0x9d020058 0x2c8 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d020058 chip_isr + 0x9d020188 nm_bsp_init + 0x9d0201b0 nm_bsp_deinit + 0x9d0201d4 nm_bsp_reset + 0x9d02025c nm_bsp_sleep + 0x9d020294 nm_bsp_register_isr + 0x9d0202c0 nm_bsp_interrupt_ctrl + +.text.scale 0x9d020320 0x2a0 + .text.scale 0x9d020320 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d0205c0 0x278 + .text.fpsubadd + 0x9d0205c0 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d0205c0 __subsf3 + 0x9d0205c0 fpsub + 0x9d0205c8 __addsf3 + 0x9d0205c8 fpadd + +.text.malloc 0x9d020838 0x278 + .text.malloc 0x9d020838 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d020838 malloc + +.text 0x9d020ab0 0x26c + .text 0x9d020ab0 0x26c build/ChaletDuinoV2_775F512H_/production/Source/crc32.o + 0x9d020ab0 crc_32 + 0x9d020ba8 update_crc_32 + +.rodata 0x9d020d1c 0x268 + .rodata 0x9d020d1c 0x268 build/ChaletDuinoV2_775F512H_/production/Source/WiFiCtrl.o + +.text 0x9d020f84 0x4a8 + .text 0x9d020f84 0x260 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + 0x9d020f84 InitChaletPowerRelay + 0x9d020fe0 ChaletPowerRelayTick + 0x9d0210e4 ChaletPowerRelayKickTimer + 0x9d02111c ChaletPowerRelayTurnOn + 0x9d02116c ChaletPowerRelayTurnOff + 0x9d0211bc GetChaletPowerRelayState + .text 0x9d0211e4 0x248 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + 0x9d0211e4 InitSyslog + 0x9d021238 SyslogTick + 0x9d0212d4 SyslogNewByte + 0x9d021378 SyslogNewString + 0x9d0213f0 SyslogIsBufferEmpty + +.text.fp32div 0x9d02142c 0x230 + .text.fp32div 0x9d02142c 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d02142c fpdiv + 0x9d02142c __divsf3 + +.text.__floatdisf + 0x9d02165c 0x220 + .text.__floatdisf + 0x9d02165c 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d02165c __floatdisf + +.text.fp32mul 0x9d02187c 0x1bc + .text.fp32mul 0x9d02187c 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d02187c __mulsf3 + 0x9d02187c fpmul + +.text 0x9d021a38 0x1a0 + .text 0x9d021a38 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d021a38 strcpy + +.text.realloc 0x9d021bd8 0x194 + .text.realloc 0x9d021bd8 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d021bd8 realloc + +.text._sbrk_init + 0x9d021d6c 0x194 + .text._sbrk_init + 0x9d021d6c 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d021d6c _sbrk_init + +.text._filbuf 0x9d021f00 0x188 + .text._filbuf 0x9d021f00 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d021f00 _filbuf + +.text.read 0x9d022088 0x174 + .text.read 0x9d022088 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d022088 read + +.text 0x9d0221fc 0x2d0 + .text 0x9d0221fc 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d0221fc memcpy + .text 0x9d022364 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d022364 strlen + +.text.fputc 0x9d0224cc 0x15c + .text.fputc 0x9d0224cc 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d0224cc fputc + +.text._flsbuf 0x9d022628 0x12c + .text._flsbuf 0x9d022628 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d022628 _flsbuf + +.text 0x9d022754 0x11c + .text 0x9d022754 0x11c build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + 0x9d022754 InitTempSensor + 0x9d022798 TempSensorCheckAndConfigure + 0x9d0227f4 TempSensorGetTemp + 0x9d022818 TickTempSensor + +.text.fgetc 0x9d022870 0x108 + .text.fgetc 0x9d022870 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d022870 fgetc + +.rodata 0x9d022978 0x204 + .rodata 0x9d022978 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d022978 _ctype + .rodata 0x9d022a7c 0x100 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.text.setvbuf 0x9d022b7c 0xfc + .text.setvbuf 0x9d022b7c 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d022b7c setvbuf + +.rodata 0x9d022c78 0xe0 + .rodata 0x9d022c78 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d022d58 0xdc + .text.general_exception + 0x9d022d58 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d022d58 _general_exception_context + +.text 0x9d022e34 0x1ac + .text 0x9d022e34 0xd8 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + 0x9d022e34 InitWatchdog + 0x9d022e88 EnableWatchdog + 0x9d022eb4 DisableWatchdog + 0x9d022ee0 KickWatchdog + .text 0x9d022f0c 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d022f0c __floatundisf + +.rodata 0x9d022fe0 0xc8 + .rodata 0x9d022fe0 0xc8 build/ChaletDuinoV2_775F512H_/production/Source/SPI_Flash.o + +.text._sbrk 0x9d0230a8 0xc4 + .text._sbrk 0x9d0230a8 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0230a8 _sbrk + +.text 0x9d02316c 0xa8 + .text 0x9d02316c 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d02316c memset + +.text.atoi 0x9d023214 0xa8 + .text.atoi 0x9d023214 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d023214 atoi + +.text.range 0x9d0232bc 0xa0 + .text.range 0x9d0232bc 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d02335c 0x9c + .text.fpcmp 0x9d02335c 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d02335c __eqsf2 + 0x9d02335c __lesf2 + 0x9d02335c __gtsf2 + 0x9d02335c __nesf2 + 0x9d02335c fpcmp + 0x9d02335c __gesf2 + 0x9d02335c __ltsf2 + +.text.fflush 0x9d0233f8 0x94 + .text.fflush 0x9d0233f8 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d0233f8 fflush + +.text.write 0x9d02348c 0x94 + .text.write 0x9d02348c 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d02348c write + +.text.libm 0x9d023520 0x88 + .text.libm 0x9d023520 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d023520 frexpf + 0x9d023520 fpfrexp + +.text 0x9d0235a8 0x80 + .text 0x9d0235a8 0x80 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/winc_init.o + 0x9d0235a8 wifi_init + +.text.fptoul 0x9d023628 0x7c + .text.fptoul 0x9d023628 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d023628 fptoul + 0x9d023628 fptoui + 0x9d023628 __fixunssfsi + +.text.SoftReset + 0x9d0236a4 0x78 + .text.SoftReset + 0x9d0236a4 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d0236a4 SoftReset + +.text.fputs 0x9d02371c 0x78 + .text.fputs 0x9d02371c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d02371c fputs + +.text.strncmp 0x9d023794 0x78 + .text.strncmp 0x9d023794 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d023794 strncmp + +.text.ungetc 0x9d02380c 0x74 + .text.ungetc 0x9d02380c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d02380c ungetc + +.text 0x9d023880 0xd8 + .text 0x9d023880 0x70 build/ChaletDuinoV2_775F512H_/production/Source/SPI.o + 0x9d023880 SPITransaction + .text 0x9d0238f0 0x68 build/ChaletDuinoV2_775F512H_/production/Source/HarakiriRelay.o + 0x9d0238f0 InitHarakiriRelay + 0x9d023920 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d023958 0x68 + .text._sprintf_cdfFnopuxX + 0x9d023958 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d023958 _sprintf_cdnopuxX + 0x9d023958 _sprintf_cdfFnopuxX + +.rodata 0x9d0239c0 0x68 + .rodata 0x9d0239c0 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d0239c0 _powers_f + 0x9d0239f4 _npowers_f + +.text.sitofp 0x9d023a28 0x60 + .text.sitofp 0x9d023a28 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d023a28 sitofp + 0x9d023a28 litofp + 0x9d023a28 __floatsisf + +.text.wspace 0x9d023a88 0x60 + .text.wspace 0x9d023a88 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d023ae8 0x58 + .text 0x9d023ae8 0x58 build/ChaletDuinoV2_775F512H_/production/Source/exceptions.o + 0x9d023ae8 _general_exception_handler + +.text._sscanf_s + 0x9d023b40 0x54 + .text._sscanf_s + 0x9d023b40 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d023b40 _sscanf_s + 0x9d023b40 _sscanf_0 + +.text._bufallo 0x9d023b94 0x54 + .text._bufallo + 0x9d023b94 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d023b94 _bufallo + +.text.sbrk 0x9d023be8 0x50 + .text.sbrk 0x9d023be8 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023be8 sbrk + +.text.main_entry + 0x9d023c38 0x4c + .text.main_entry + 0x9d023c38 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d023c64 __crt0_exit + +.text 0x9d023c84 0x4c + .text 0x9d023c84 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d023c84 __floatunsisf + +.text._bootstrap_exception_handler + 0x9d023cd0 0x48 + .text._bootstrap_exception_handler + 0x9d023cd0 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d023cd0 _bootstrap_exception_handler + +.text 0x9d023d18 0x44 + .text 0x9d023d18 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d023d18 __pic32_software_reset + +.text.puts 0x9d023d5c 0x44 + .text.puts 0x9d023d5c 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d023d5c puts + +.text._printf_cdfFnopsuxX + 0x9d023da0 0x40 + .text._printf_cdfFnopsuxX + 0x9d023da0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + 0x9d023da0 _printf_cdnopsuxX + 0x9d023da0 _printf_cdnopuxX + 0x9d023da0 _printf_cdfFnopsuxX + 0x9d023da0 _printf_fF + +.vector_default + 0x9d023de0 0x38 + .vector_default + 0x9d023de0 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d023de0 _DefaultInterrupt + +.rodata 0x9d023e18 0x30 + .rodata 0x9d023e18 0x30 build/ChaletDuinoV2_775F512H_/production/Source/main.o + +.text.INTConfigureSystem + 0x9d023e48 0x30 + .text.INTConfigureSystem + 0x9d023e48 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d023e48 INTConfigureSystem + +.text.free 0x9d023e78 0x30 + .text.free 0x9d023e78 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d023e78 free + +.rodata 0x9d023ea8 0x2c + .rodata 0x9d023ea8 0x2c build/ChaletDuinoV2_775F512H_/production/Source/BatteryMonitor.o + +.text._stub_sbd_memlayout + 0x9d023ed4 0x2c + .text._stub_sbd_memlayout + 0x9d023ed4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d023ed4 _sbd_memlayout + 0x9d023ed4 _stub_sbd_memlayout + +.rodata 0x9d023f00 0x28 + .rodata 0x9d023f00 0x28 build/ChaletDuinoV2_775F512H_/production/Source/ChaletPowerRelay.o + +.text.tolower 0x9d023f28 0x24 + .text.tolower 0x9d023f28 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f28 tolower + +.text.toupper 0x9d023f4c 0x24 + .text.toupper 0x9d023f4c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d023f4c toupper + +.text 0x9d023f70 0x20 + .text 0x9d023f70 0x20 build/ChaletDuinoV2_775F512H_/production/Source/DigitalIO.o + 0x9d023f70 InitDigitalIO + +.rodata 0x9d023f90 0x1c + .rodata 0x9d023f90 0x1c build/ChaletDuinoV2_775F512H_/production/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d023fac 0x1c + .text.INTRestoreInterrupts + 0x9d023fac 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d023fac INTRestoreInterrupts + +.text.setbuf 0x9d023fc8 0x1c + .text.setbuf 0x9d023fc8 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d023fc8 setbuf + +.rodata 0x9d023fe4 0x18 + .rodata 0x9d023fe4 0x18 build/ChaletDuinoV2_775F512H_/production/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d023ffc 0x18 + .text.CheKseg0CacheOff + 0x9d023ffc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d023ffc CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d024014 0x18 + .text.CheKseg0CacheOn + 0x9d024014 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d024014 CheKseg0CacheOn + +.text 0x9d02402c 0x18 + .text 0x9d02402c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d02402c _nmi_handler + +.text.isalnum 0x9d024044 0x18 + .text.isalnum 0x9d024044 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024044 isalnum + +.text.isalpha 0x9d02405c 0x18 + .text.isalpha 0x9d02405c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02405c isalpha + +.text.iscntrl 0x9d024074 0x18 + .text.iscntrl 0x9d024074 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024074 iscntrl + +.text.isdigit 0x9d02408c 0x18 + .text.isdigit 0x9d02408c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02408c isdigit + +.text.isgraph 0x9d0240a4 0x18 + .text.isgraph 0x9d0240a4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240a4 isgraph + +.text.islower 0x9d0240bc 0x18 + .text.islower 0x9d0240bc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240bc islower + +.text.isprint 0x9d0240d4 0x18 + .text.isprint 0x9d0240d4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240d4 isprint + +.text.ispunct 0x9d0240ec 0x18 + .text.ispunct 0x9d0240ec 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0240ec ispunct + +.text.isspace 0x9d024104 0x18 + .text.isspace 0x9d024104 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024104 isspace + +.text.isupper 0x9d02411c 0x18 + .text.isupper 0x9d02411c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02411c isupper + +.text.isxdigit 0x9d024134 0x18 + .text.isxdigit + 0x9d024134 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d024134 isxdigit + +.text._buffree 0x9d02414c 0x14 + .text._buffree + 0x9d02414c 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d02414c _buffree + +.rodata 0x9d024160 0x1c + .rodata 0x9d024160 0xc build/ChaletDuinoV2_775F512H_/production/Source/InternalUart.o + .rodata 0x9d02416c 0x8 build/ChaletDuinoV2_775F512H_/production/Source/Syslog.o + .rodata 0x9d024174 0x8 build/ChaletDuinoV2_775F512H_/production/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d02417c 0x8 + .text.INTEnableInterrupts + 0x9d02417c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d02417c INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d024184 0x8 + .text.INTDisableInterrupts + 0x9d024184 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d024184 INTDisableInterrupts + +.text._on_reset + 0x9d02418c 0x8 + .text._on_reset + 0x9d02418c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d02418c _on_reset + +.text._on_bootstrap + 0x9d024194 0x8 + .text._on_bootstrap + 0x9d024194 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d024194 _on_bootstrap + +.text.isascii 0x9d02419c 0x8 + .text.isascii 0x9d02419c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02419c isascii + +.text.toascii 0x9d0241a4 0x8 + .text.toascii 0x9d0241a4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241a4 toascii + +.text._tolower 0x9d0241ac 0x8 + .text._tolower + 0x9d0241ac 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241ac _tolower + +.text._toupper 0x9d0241b4 0x8 + .text._toupper + 0x9d0241b4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0241b4 _toupper + +.text.getpagesize + 0x9d0241bc 0x8 + .text.getpagesize + 0x9d0241bc 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0241bc getpagesize + +.rodata 0x9d0241c4 0x10 + .rodata 0x9d0241c4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .rodata 0x9d0241cc 0x4 build/ChaletDuinoV2_775F512H_/production/Source/TemperatureSensor.o + .rodata 0x9d0241d0 0x4 build/ChaletDuinoV2_775F512H_/production/Source/TC77.o + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z427 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/template.o + +.text%z428 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/system.o + +.text%z429 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/interrupts.o + +.text%z430 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.text%z431 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.text%z432 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.text%z433 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.text%z434 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.text%z435 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.elf b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.elf new file mode 100644 index 0000000..36973bc Binary files /dev/null and b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.elf differ diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.hex b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.hex new file mode 100644 index 0000000..b85984b --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.hex @@ -0,0 +1,9677 @@ +:020000040000fa +:020000041fc01b +:042ff400d9fff8ff0a +:020000040000fa +:020000041fc01b +:042ff800dbcc6cffc3 +:020000040000fa +:020000041fc01b +:042ffc00ffffff7f55 +:020000040000fa +:020000041fc01b +:080000000014400f0000000095 +:020000040000fa +:020000041fc01b +:10038000039d1a3c10905a2708004003000000000b +:020000040000fa +:020000041d00dd +:10418000039d1a3c30805a270800400300000000bd +:020000040000fa +:020000041d00dd +:0842000048a4400b000000007f +:020000040000fa +:020000041d00dd +:0842200048a4400b000000005f +:020000040000fa +:020000041d00dd +:0842400048a4400b000000003f +:020000040000fa +:020000041d00dd +:084260002694400b0000000051 +:020000040000fa +:020000041d00dd +:084280006577400b000000000f +:020000040000fa +:020000041d00dd +:0842a00048a4400b00000000df +:020000040000fa +:020000041d00dd +:0842c00048a4400b00000000bf +:020000040000fa +:020000041d00dd +:0842e00048a4400b000000009f +:020000040000fa +:020000041d00dd +:0843000048a4400b000000007e +:020000040000fa +:020000041d00dd +:0843200048a4400b000000005e +:020000040000fa +:020000041d00dd +:0843400048a4400b000000003e +:020000040000fa +:020000041d00dd +:0843600048a4400b000000001e +:020000040000fa +:020000041d00dd +:0843800048a4400b00000000fe +:020000040000fa +:020000041d00dd +:0843a00048a4400b00000000de +:020000040000fa +:020000041d00dd +:0843c00048a4400b00000000be +:020000040000fa +:020000041d00dd +:0843e00048a4400b000000009e +:020000040000fa +:020000041d00dd +:0844000048a4400b000000007d +:020000040000fa +:020000041d00dd +:0844200048a4400b000000005d +:020000040000fa +:020000041d00dd +:0844400048a4400b000000003d +:020000040000fa +:020000041d00dd +:0844600048a4400b000000001d +:020000040000fa +:020000041d00dd +:0844800048a4400b00000000fd +:020000040000fa +:020000041d00dd +:0844a00048a4400b00000000dd +:020000040000fa +:020000041d00dd +:0844c00048a4400b00000000bd +:020000040000fa +:020000041d00dd +:0844e00048a4400b000000009d +:020000040000fa +:020000041d00dd +:084500001a5f400b00000000ef +:020000040000fa +:020000041d00dd +:0845200048a4400b000000005c +:020000040000fa +:020000041d00dd +:0845400048a4400b000000003c +:020000040000fa +:020000041d00dd +:0845600048a4400b000000001c +:020000040000fa +:020000041d00dd +:0845800048a4400b00000000fc +:020000040000fa +:020000041d00dd +:0845a00048a4400b00000000dc +:020000040000fa +:020000041d00dd +:0845c00048a4400b00000000bc +:020000040000fa +:020000041d00dd +:0845e00048a4400b000000009c +:020000040000fa +:020000041d00dd +:08460000a95f400b000000005f +:020000040000fa +:020000041d00dd +:0846200048a4400b000000005b +:020000040000fa +:020000041d00dd +:0846400048a4400b000000003b +:020000040000fa +:020000041d00dd +:0846600048a4400b000000001b +:020000040000fa +:020000041d00dd +:0846800048a4400b00000000fb +:020000040000fa +:020000041d00dd +:0846a00048a4400b00000000db +:020000040000fa +:020000041d00dd +:0846c00048a4400b00000000bb +:020000040000fa +:020000041d00dd +:0846e00048a4400b000000009b +:020000040000fa +:020000041d00dd +:0847000048a4400b000000007a +:020000040000fa +:020000041d00dd +:0847200048a4400b000000005a +:020000040000fa +:020000041d00dd +:0847400048a4400b000000003a +:020000040000fa +:020000041d00dd +:0847600048a4400b000000001a +:020000040000fa +:020000041d00dd +:0847800048a4400b00000000fa +:020000040000fa +:020000041d00dd +:0847a00048a4400b00000000da +:020000040000fa +:020000041d00dd +:0847c00048a4400b00000000ba +:020000040000fa +:020000041d00dd +:0847e00048a4400b000000009a +:020000040000fa +:020000041d00dd +:0848000048a4400b0000000079 +:020000040000fa +:020000041d00dd +:0848200048a4400b0000000059 +:020000040000fa +:020000041d00dd +:0848400048a4400b0000000039 +:020000040000fa +:020000041d00dd +:0848600048a4400b0000000019 +:020000040000fa +:020000041d00dd +:0848800048a4400b00000000f9 +:020000040000fa +:020000041d00dd +:0848a00048a4400b00000000d9 +:020000040000fa +:020000041d00dd +:0848c00048a4400b00000000b9 +:020000040000fa +:020000041d00dd +:0848e00048a4400b0000000099 +:020000040000fa +:020000041d00dd +:0849000048a4400b0000000078 +:020000040000fa +:020000041d00dd +:0849200048a4400b0000000058 +:020000040000fa +:020000041d00dd +:0849400048a4400b0000000038 +:020000040000fa +:020000041d00dd +:0849600048a4400b0000000018 +:020000040000fa +:020000041d00dd +:0849800048a4400b00000000f8 +:020000040000fa +:020000041d00dd +:0849a00048a4400b00000000d8 +:020000040000fa +:020000041d00dd +:0849c00048a4400b00000000b8 +:020000040000fa +:020000041d00dd +:0849e00048a4400b0000000098 +:020000040000fa +:020000041d00dd +:1050000000601a40c0045a7f0500401300000000f1 +:10501000039d1a3c5c935a270800400300000000df +:1050200001a01d3cf8ffbd2701a01c3c20809c274f +:105030000260094020582001801e2a7d8449497d54 +:1050400002608940c000000000e0dc4102608b404b +:10505000c0000000039d083cc894082509f8000121 +:105060000000000000a0083ca400082500a0093ca6 +:10507000ac3029250600001000000000000000ad43 +:10508000040000ad080000ad0c0000ad10000825c4 +:105090002b080901f9ff201400000000029d083cc4 +:1050a000a8de08250000098d18002011040008253d +:1050b00000000a8d0400082500000b8d0900601116 +:1050c0000400082500000c91ffff4a250100082577 +:1050d00000002ca1fbff4015010029250500001050 +:1050e00000000000000020a1ffff4a25fdff401541 +:1050f0000100292503000825fcff0a24244048015b +:105100000000098de7ff2015000000000000093ca9 +:105110000000292510002011000000000100093cba +:105120000000292588bf0a3c10204a25000049ad0f +:105130000100093c0000292588bf0a3c20204a259f +:10514000000049ad0100093c0000292588bf0a3c48 +:1051500030204a25000049ad00488040ffff0a2466 +:1051600000588a40009d093c00402925017889406b +:105170000000093c0100292500000a2444492a7d39 +:1051800001608a408000093c006889400080084036 +:105190008005097d404c0900006008405800013c32 +:1051a000244001012540280100608840039d083cff +:1051b000d094082509f800010000000000600840b4 +:1051c000bfff013cffff2134244001010060884003 +:1051d000000084300000a530039d083c788f08252e +:0851e0000800000100000000be +:020000040000fa +:020000041fc01b +:1004800000f89b40c0000000039d1b3c58907b2758 +:10049000020060130000000000c09b4000f81b40f9 +:0c04a000c00000001f000042000000002f +:020000040000fa +:020000041d00dd +:1058000028ffbd27d400bfafd000beaf21f0a0035a +:10581000211880002110a000e000c6afd800c3a36b +:10582000dc00c2a7d800c3932c0002241500621428 +:10583000000000001c00c227e000c48f21284000a7 +:105840000400062421380000c257400f0000000069 +:10585000e7014014000000009880828fe4014010ae +:10586000000000009880828f1c00c3272c000424b5 +:105870002128600009f8400000000000fc17400be0 +:1058800000000000d800c3931d000224150062141c +:10589000000000002000c227e000c48f2128400043 +:1058a0000800062421380000c257400f0000000005 +:1058b000cf014014000000009880828fcc0140107e +:1058c000000000009880828f2000c3271d00042460 +:1058d0002128600009f8400000000000fc17400b80 +:1058e00000000000d800c3930800022415006214d1 +:1058f000000000006400c227e000c48f212840009f +:105900003000062401000724c257400f00000000a9 +:10591000b7014014000000009880828fb40140104d +:10592000000000009880828f6400c32708000424d0 +:105930002128600009f8400000000000fc17400b1f +:1059400000000000d800c39310000224a8016210d8 +:1059500000000000d800c393320002241500621436 +:10596000000000002800c227e000c48f212840006a +:105970001400062421380000c257400f0000000028 +:105980009b014014000000009880828f9801401015 +:10599000000000009880828f2800c3273200042472 +:1059a0002128600009f8400000000000fc17400baf +:1059b00000000000d800c3932f0002241b006214d3 +:1059c000000000006400c2272120400021280000c0 +:1059d0006800062411a1400f000000006400c227e7 +:1059e000e000c48f21284000680006242138000010 +:1059f000c257400f000000007d014014000000006d +:105a00009880828f7a014010000000009880828f79 +:105a10006400c3272f0004242128600009f84000f7 +:105a200000000000fc17400b00000000d800c393ea +:105a30003400022414006214000000003c00c2275d +:105a4000e000c48f21284000040006242138000013 +:105a5000c257400f00000000650140140000000024 +:105a60009880828f62014010000000009880828f31 +:105a7000340004242128000009f840000000000040 +:105a8000fc17400b00000000d800c3931300022451 +:105a900017006214000000004000c227e000c48f1d +:105aa000212840000400062421380000c257400f7e +:105ab000000000004e014014000000004000c293ae +:105ac000948082a39880828f4901401000000000da +:105ad0009880828f4000c32713000424212860008f +:105ae00009f8400000000000fc17400b0000000017 +:105af000d800c393150002241500621400000000b2 +:105b00006400c227e000c48f212840002c00062436 +:105b100021380000c257400f00000000340140143b +:105b2000000000009880828f3101401000000000ca +:105b30009880828f6400c327150004242128600008 +:105b400009f8400000000000fc17400b00000000b6 +:105b5000d800c39304000224150062140000000062 +:105b60001400c227e000c48f21284000040006244e +:105b700021380000c257400f000000001c014014f3 +:105b8000000000009880828f190140100000000082 +:105b90009880828f1400c327040004242128600009 +:105ba00009f8400000000000fc17400b0000000056 +:105bb000d800c393650002241500621400000000a1 +:105bc0001400c227e000c48f2128400004000624ee +:105bd00021380000c257400f0000000004014014ab +:105be000000000009880828f01014010000000003a +:105bf0009880828f1400c327650004242128600048 +:105c000009f8400000000000fc17400b00000000f5 +:105c1000d800c3930b00022415006214000000009a +:105c20006400c227e000c48f2128400064000624dd +:105c300001000724c257400f00000000ec00401490 +:105c4000000000009880828fe900401000000000f2 +:105c50009880828f6400c3270b00042421286000f1 +:105c600009f8400000000000fc17400b0000000095 +:105c7000d800c3932a00022415006214000000001b +:105c80004400c227e000c48f2128400004000624fd +:105c900001000724c257400f00000000d400401448 +:105ca000000000009880828fd100401000000000aa +:105cb0009880828f4400c3272a0004242128600092 +:105cc00009f8400000000000fc17400b0000000035 +:105cd000d800c3936900022415006214000000007c +:105ce0004800c227e000c48f212840000400062499 +:105cf00021380000c257400f00000000bc004014d3 +:105d0000000000009880828fb90040100000000061 +:105d10009880828f4800c3276900042421286000ee +:105d200009f8400000000000fc17400b00000000d4 +:105d3000d800c3932200022429006214000000004e +:105d40001400c227e000c48f21284000020006246e +:105d500021380000c257400f00000000a40040148a +:105d6000000000001500c29300120200ffff433044 +:105d70001400c293211062001200c2a71200c29741 +:105d80004c00c2a7e000c28f020044244c00c2971e +:105d90004c00c3270200632421286000213040000a +:105da00001000724c257400f00000000900040147b +:105db000000000009880828f8d00401000000000dd +:105dc0009880828f4c00c327220004242128600081 +:105dd00009f8400000000000fc17400b0000000024 +:105de000d800c3933c00022420006214000000008d +:105df0005000c227e000c48f21284000080006247c +:105e000021380000c257400f000000007800401405 +:105e100000000000e000c28f080044245000c38f3f +:105e20005400c2972128600021304000010007245f +:105e3000c257400f000000006d0040140000000039 +:105e40009880828f6a004010000000009880828f46 +:105e50005000c3273c0004242128600009f84000ba +:105e600000000000fc17400b00000000d800c393a6 +:105e70002400022415006214000000005800c2270c +:105e8000e000c48f212840000400062421380000cf +:105e9000c257400f000000005500401400000000f1 +:105ea0009880828f52004010000000009880828ffe +:105eb0005800c327240004242128600009f840006a +:105ec00000000000fc17400b00000000d800c39346 +:105ed0001f00022446006214000000005c00c2277c +:105ee000e000c48f2128400004000624213800006f +:105ef000c257400f000000003d00401400000000a9 +:105f00005e00c2971000c2a75c00c2976200c2a7e1 +:105f10009c80828f3600401000000000a080828f9d +:105f20003300401000000000a48082973000401031 +:105f300000000000f617400b000000006200c3974d +:105f4000a48082972b104300050040100000000041 +:105f5000a48082976000c2a7da17400b00000000ff +:105f60006200c2976000c2a71000c397e000c28f12 +:105f700021206200a080838f6000c29721286000ea +:105f80002130400021380000c257400f00000000bf +:105f900016004014000000006200c3976000c29722 +:105fa00023106200ffff42306200c2a76000c39767 +:105fb0001000c297211062001000c2a79c80828f3f +:105fc000a080858f6000c3271f000424213060005b +:105fd00009f84000000000006200c297d7ff40149b +:105fe00000000000fc17400b000000000000000053 +:105ff00021e8c003d400bf8fd000be8fd800bd27da +:106000000800e00300000000e0ffbd271c00bfaf58 +:106010001800beaf21f0a0031000c0a30284400fff +:10602000000000001000c2a31000c283050040144d +:10603000000000004344400f000000001218400b15 +:1060400000000000000000001000c28321e8c0032f +:106050001c00bf8f1800be8f2000bd270800e00382 +:1060600000000000e0ffbd271c00bfaf1800beaf5e +:1060700021f0a0032000c4af1000c0a32000c28ff5 +:106080000500401400000000f4ff02241000c2a329 +:106090009118400b000000002000c28f00004280d9 +:1060a00008004010000000002000c28f21204000a6 +:1060b0008e9d400f000000002100422c050040147e +:1060c00000000000f4ff02241000c2a39118400b4e +:1060d000000000002000c28f210042900f00422cdf +:1060e00005004010000000002000c28f21004290f7 +:1060f0000500401400000000f4ff02241000c2a3b9 +:106100009118400b000000002000c28f4100429017 +:106110000d004014000000002000c28f4200429099 +:1061200009004014000000002000c28f430042908c +:106130000500401400000000f4ff02241000c2a378 +:106140009118400b000000002000c28f3f004390d8 +:10615000010002243a006210000000002000c28ffb +:106160003f0043900300022431006214000000004d +:106170002000c28f22004290060040100000000064 +:106180002000c28f220042900500422c05004014de +:1061900000000000f4ff02241000c2a39118400b7d +:1061a000000000002000c28f230043900a00022458 +:1061b0000a006210000000002000c28f23004390fc +:1061c0001a0002240500621000000000f4ff0224ff +:1061d0001000c2a39118400b000000002000c28fe5 +:1061e000240042240e004010000000002000c28f56 +:1061f00024004224000042800900401000000000fa +:106200002000c28f24004224212040008e9d400f98 +:10621000000000001b00422c0a0040140000000097 +:10622000f4ff02241000c2a39118400b00000000ec +:10623000f4ff02241000c2a39118400b00000000dc +:10624000000000001000c28321e8c0031c00bf8fc3 +:106250001800be8f2000bd270800e00300000000ea +:10626000f0ffbd270c00beaf21f0a0031000c4afab +:106270000000c0a31000c28f050040140000000001 +:10628000f4ff02240000c2a3c718400b0000000066 +:106290001000c28f00004290030040140000000074 +:1062a000f4ff02240000c2a31000c28f010042903c +:1062b0000a00422c06004014000000001000c28fab +:1062c00001004290fb00422c03004014000000003b +:1062d000f4ff02240000c2a31000c28f020042900b +:1062e00006004010000000001000c28f0200429023 +:1062f0000300422c0300401400000000f4ff0224bd +:106300000000c2a31000c28f0300428003004004bb +:1063100000000000f4ff02240000c2a30000c283ba +:1063200021e8c0030c00be8f1000bd270800e00369 +:1063300000000000d0ffbd272c00bfaf2800beaf7b +:1063400021f0a003211080003000c2a3f4ff02243a +:106350002000c2a32400c0af3000c2932400c2a317 +:106360002400c2271000a0af1400a0af1800a0aff7 +:1063700001000424230005242130400004000724e8 +:106380003555400f000000002000c2a32000c2834a +:1063900021e8c0032c00bf8f2800be8f3000bd272e +:1063a0000800e00300000000e0ffbd271c00bfafb5 +:1063b0001800beaf21f0a003f4ff02241000c2a316 +:1063c0002384400f000000001000c2a31000c2830d +:1063d00021e8c0031c00bf8f1800be8f2000bd271e +:1063e0000800e00300000000c0ffbd273c00bfaf75 +:1063f0003800beaf21f0a0034000c4af1000c0a31e +:10640000010002243000c2a34000c28f05004014e6 +:1064100000000000f4ff02241000c2a35819400b32 +:10642000000000004000c28f0000428c988082afc4 +:106430004000c28f0800428c9c8082af4000c28f17 +:106440000c00428ca08082af4000c28f10004294aa +:10645000a48082a74000c28f120042903000c2a3e5 +:106460004000c28f12004290030040100000000064 +:10647000030002243000c2a3212000005e54400f1c +:10648000000000001000c2a31000c28327004014c7 +:106490000000000001000424009d023c0058452437 +:1064a0002d58400f000000003000c227212040007e +:1064b0004284400f000000001000c2a31000c283fd +:1064c00020004014000000001400c22721204000da +:1064d000fc23400f000000001000c2a31400c227dc +:1064e000212040003024400f000000001000c28333 +:1064f0001700401400000000aa54400f00000000e4 +:106500001000c2a31000c283140040140000000059 +:106510004000c28f1400429021204000cd18400f4f +:10652000000000005819400b0000000000000000af +:1065300021200000ad84400f000000005819400bde +:1065400000000000000000005819400b000000008f +:10655000000000005819400b00000000000000007f +:106560001000c28321e8c0033c00bf8f3800be8ffb +:106570004000bd270800e00300000000e0ffbd2749 +:106580001c00bfaf1800beaf21f0a0032000c4afb5 +:106590001000c0a3ea18400f000000001000c2a3c2 +:1065a0001000c28305004014000000002000c48fca +:1065b000fa18400f000000001000c2a31000c283b0 +:1065c00021e8c0031c00bf8f1800be8f2000bd272c +:1065d0000800e00300000000e8ffbd271400bfaf83 +:1065e0001000beaf21f0a0031800c4af21200000ae +:1065f0007654400f0000000021200000ad84400fc1 +:10660000000000002110000021e8c0031400bf8f2b +:106610001000be8f1800bd270800e0030000000036 +:10662000e8ffbd271400bfaf1000beaf21f0a003ec +:10663000212000007619400f00000000ea18400fea +:106640000000000021e8c0031400bf8f1000be8fbf +:106650001800bd270800e00300000000e8ffbd2788 +:106660001400bfaf1000beaf21f0a0031800c4afec +:106670001800c48ffa18400f0000000021e8c00382 +:106680001400bf8f1000be8f1800bd270800e00364 +:1066900000000000e0ffbd271c00bfaf1800beaf28 +:1066a00021f0a0032000c4aff4ff02241000c2a315 +:1066b0008819400f000000001000c2a31000c28320 +:1066c00005004014000000002000c48f9719400fff +:1066d000000000001000c2a31000c28321e8c00324 +:1066e0001c00bf8f1800be8f2000bd270800e003ec +:1066f00000000000e8ffbd271400bfaf1000beafd0 +:1067000021f0a003dc84400f0000000001000324fe +:106710000c004310000000000100432c0600601430 +:1067200000000000020003240900431000000000e4 +:10673000d719400b0000000021100000d819400bb1 +:106740000000000001000224d819400b00000000e6 +:1067500002000224d819400b0000000021100000a4 +:1067600021e8c0031400bf8f1000be8f1800bd27a2 +:106770000800e00300000000e8ffbd271400bfafe1 +:106780001000beaf21f0a003bd19400f00000000b3 +:1067900021184000020002240500621400000000dd +:1067a000b357400f00000000ed19400b000000003f +:1067b0002110000021e8c0031400bf8f1000be8f1d +:1067c0001800bd270800e00300000000b0ffbd274f +:1067d0004c00bfaf4800beaf21f0a0035000c4afd3 +:1067e0002110a0005400c2a32000c2272120400095 +:1067f000212800002400062411a1400f0000000001 +:10680000ffff02242000c2a31000a0af1400a0af1d +:106810001800a0af01000424690005242000c2274d +:1068200021304000240007243555400f00000000af +:1068300021e8c0034c00bf8f4800be8f5000bd2729 +:106840000800e00300000000d8ffbd272400bfaf10 +:106850002000beaf21f0a0031000a0af1400a0af35 +:106860001800a0af010004242900052421300000f5 +:10687000213800003555400f0000000021e8c0031a +:106880002400bf8f2000be8f2800bd270800e00332 +:1068900000000000d8ffbd272400bfaf2000beaf1e +:1068a00021f0a0032800c4af2c00c5af2110c00008 +:1068b0003400c7af3000c2a7f4ff02241000c2a307 +:1068c0003000c2972c0042241200c2a73400c28fad +:1068d0007a004010000000003400c28f0400428c97 +:1068e00076004010000000003400c28f0800429083 +:1068f0002100422c71004010000000003800c28fbf +:106900006a004010000000003800c28f1400c2afbf +:106910003800c28f040042241800c2af3800c48f70 +:10692000212800003000062411a1400f00000000c3 +:106930001400c28f1200c397000043a42800c28f26 +:10694000010003240d004310000000000100432c4f +:1069500010006014000000000200032456004314dd +:10696000000000001400c28f020042900200423476 +:10697000ff0043301400c28f020043a01400c28ff6 +:106980000200429001004234ff0043301400c28fe5 +:10699000020043a03400c28f0c00438cff0002248d +:1069a00008006214000000003400c28f0c00428c0a +:1069b000ff0043301400c28f030043a0811a400b34 +:1069c000000000003400c28f0c00428c0f00422ceb +:1069d0003a004010000000003400c28f0c00428cce +:1069e00036004010000000003400c28f0c00428cc2 +:1069f000ff004230ffff4224ff0043301400c28feb +:106a0000030043a02c00c28f2c00401000000000a7 +:106a10002c00c28f0500422c28004010000000000e +:106a20002c00c28fff0043301800c28f280043a003 +:106a30003400c28f080043901800c28f000043a0aa +:106a40001800c28f010044243400c28f0400438c1c +:106a50003400c28f0800429021286000213040009d +:106a6000349d400f000000003400c28f0000428cb3 +:106a70000d004010000000001800c28f0100032428 +:106a8000210043a01800c28f220043243400c28f8b +:106a90000000428c212060002128400006000624ce +:106aa000349d400f000000001000c0a31000c283fe +:106ab000b01a400b0000000000000000f1ff0224ab +:106ac00021e8c0032400bf8f2000be8f2800bd270f +:106ad0000800e00300000000e0ffbd271c00bfaf7e +:106ae0001800beaf21f0a0032000c4af2400c5af42 +:106af000f4ff02241000c2a32000c28f02004290c3 +:106b0000020042302b004014000000002000c28f21 +:106b10002500429001004230260040140000000091 +:106b20002400c48f212800006800062411a1400f12 +:106b3000000000002400c28f460044242000c28fc1 +:106b4000050043242000c28f0400429021286000e9 +:106b500021304000349d400f000000002000c28f13 +:106b6000040042902400c38f21106200460040a020 +:106b70002000c28f03004290211840002400c28fe1 +:106b8000440043a42000c28f020042900100423022 +:106b90000100422cff0043302400c28f670043a055 +:106ba0002000c28f2c0043902400c28f410043a0dc +:106bb0001000c0a31000c28321e8c0031c00bf8fd7 +:106bc0001800be8f2000bd270800e0030000000071 +:106bd00038ffbd27c400bfafc000beaf21f0a00387 +:106be000c800c4afcc00c5aff1ff02242000c2a38f +:106bf0002400c2271000a2afc800c48f01000524e2 +:106c000021300000cc00c78f251a400f0000000083 +:106c10002000c2a32000c283240040140000000012 +:106c20002400c2271000a0af1400a0af1800a0af2e +:106c3000010004243d0005242130400030000724d9 +:106c40003555400f000000002000c2a32000c28381 +:106c500016004010000000002400c3275400c22783 +:106c60002120600021284000b61a400f00000000db +:106c70002000c2a32000c2830c00401400000000ca +:106c80005400c2271000a0af1400a0af1800a0af9e +:106c90000100042428000524213040006800072456 +:106ca0003555400f000000002000c2a32000c28321 +:106cb00021e8c003c400bf8fc000be8fc800bd273d +:106cc0000800e0030000000028ffbd27d400bfaf8c +:106cd000d000beaf21f0a003d800c4afdc00c5af28 +:106ce000e000c6aff1ff02242000c2a3e000c28f83 +:106cf0007300401000000000e000c28f0000428cd2 +:106d00006f00401000000000e000c28f05004290bc +:106d10006b00401000000000e000c28f05004290b0 +:106d20000500422c6600401000000000e000c28f09 +:106d3000040043901a0002240600621000000000c4 +:106d4000e000c28f040043900a0002245c00621439 +:106d5000000000003800c2271000a2afd800c48f86 +:106d60000300052410000624dc00c78f251a400ffd +:106d7000000000002000c2a32000c2835000401485 +:106d800000000000e000c28f05004290ffff422497 +:106d9000ff0042302800c2a3e000c28f04004290ee +:106da00042100200ff0042302900c2a3e000c28f5f +:106db0000000438c2900c2932800c42702008424c9 +:106dc00021286000213040009894400f000000000e +:106dd0003800c2272800c3271000a3af10000324e7 +:106de0001400a3af300003241800a3af0100042453 +:106df000bd00052421304000300007243555400fe8 +:106e0000000000002000c2a32000c2832c0040101c +:106e1000000000003800c3276800c227212060005e +:106e200021284000b61a400f000000002000c2a335 +:106e30002000c28322004014000000006800c22726 +:106e40002400c2afe000c28f05004290ffff422441 +:106e5000ff0043302400c28f000043a0e000c28f37 +:106e6000040043902400c28f010043a02400c28f7d +:106e700002004424e000c28f0000438ce000c28f77 +:106e8000040042902128600021304000349d400fd2 +:106e9000000000006800c2271000a0af1400a0afdf +:106ea0001800a0af01000424280005242130400070 +:106eb000680007243555400f000000002000c2a3e1 +:106ec0002000c28321e8c003d400bf8fd000be8f52 +:106ed000d800bd270800e00300000000c8febd2761 +:106ee0003401bfaf3001beaf21f0a0033801c4af01 +:106ef0003c01c5af4001c6aff1ff02242000c2a390 +:106f00004001c28f8c004010000000002800c22702 +:106f10001000a2af3801c48f020005246c000624c3 +:106f20003c01c78f251a400f000000002000c2a3bb +:106f30002000c2838000401400000000c000c2276f +:106f400021204000212800006c00062411a1400fe0 +:106f5000000000004001c28f0000428c250040105c +:106f6000000000004001c28f0400428c0500401068 +:106f700000000000f1ff02242000c2a31a1c400bf5 +:106f80000000000040000224c000c2a34001c28fe4 +:106f90000000438cc000c29342100200ff00423048 +:106fa000c000c42701008424212860002130400053 +:106fb0009894400f00000000030040100000000003 +:106fc000f1ff02242000c2a34001c28f0000438cc5 +:106fd000c000c293c000c42701008424212860009f +:106fe00021304000349d400f000000001a1c400b6f +:106ff000000000004001c28f0400428c18004010c5 +:10700000000000004001c28f080042904100422c65 +:107010000500401400000000f1ff02242000c2a37c +:107020001a1c400b000000004001c28f0800429073 +:10703000c000c2a34001c28f0400438cc000c293b1 +:10704000c000c427010084242128600021304000b2 +:10705000349d400f000000001a1c400b000000008f +:10706000f1ff02242000c2a32000c2830f004014bd +:10707000000000002800c227c000c3271000a3aff3 +:107080006c0003241400a3af300003241800a3af46 +:1070900001000424bd0005242130400030000724f5 +:1070a0003555400f000000002000c2a32000c2831d +:1070b00021004010000000002800c3275800c2270c +:1070c0002120600021284000b61a400f0000000077 +:1070d0002000c2a32000c28317004014000000005b +:1070e0005800c2272400c2af4001c28f0400438c65 +:1070f0004001c28f080042902400c48f2128600004 +:1071000021304000349d400f000000005800c2278d +:107110001000a0af1400a0af1800a0af010004241d +:107120002800052421304000680007243555400f11 +:10713000000000002000c2a32000c28321e8c00399 +:107140003401bf8f3001be8f3801bd270800e00336 +:1071500000000000e8ffbd271400bfaf1000beaf65 +:1071600021f0a0031800c4af1c00c5af2000c6afbb +:107170001c00c28f07004014000000002000c28fd6 +:107180000400401000000000f1ff0224061d400b27 +:10719000000000001800c28f010003242a004310e1 +:1071a000000000000100432c0900601400000000f2 +:1071b00002000324580043100000000003000324d1 +:1071c0007300431000000000021d400b000000008f +:1071d0002000c38f0400022404006210000000009d +:1071e000f1ff0224061d400b000000001c00c28fae +:1071f0000000428c0a00401000000000010003243f +:107200000c004314000000001480838ffdff022453 +:1072100024106200148082af901c400b000000001c +:107220001480828f02004234148082af901c400b85 +:1072300000000000f1ff0224061d400b00000000ca +:10724000051d400b000000002000c38f0400022435 +:107250000400621000000000f1ff0224061d400b34 +:10726000000000001c00c28f0000428c01000324bb +:1072700013004310000000000100432c06006014be +:10728000000000000200032415004310000000006d +:10729000c11c400b000000001480838ffbff022400 +:1072a00024106200148082af1480838ff7ff0224c1 +:1072b00024106200148082afc41c400b0000000048 +:1072c0001480828f04004234148082af1480828f35 +:1072d00008004234148082afc41c400b0000000040 +:1072e0001480828f04004234148082af1480838f14 +:1072f000f7ff022424106200148082afc41c400bec +:1073000000000000f1ff0224061d400b00000000f9 +:10731000051d400b000000002000c38f0400022464 +:107320000400621000000000f1ff0224061d400b63 +:10733000000000001c00c28f0000428c09004010b9 +:1073400000000000010003240c00431400000000b2 +:107350001480828f10004234148082afe21c400bf4 +:10736000000000001480838fefff022424106200cd +:10737000148082afe21c400b00000000f1ff0224e9 +:10738000061d400b00000000051d400b0000000022 +:107390002000c28f0f0040100000000014000324e2 +:1073a00016004314000000001480828f4000423415 +:1073b000148082af00a0023ca44044241c00c58f6e +:1073c00014000624349d400f00000000051d400bf2 +:1073d000000000001480838fbfff0224241062008d +:1073e000148082af00a0023ca44044242128000065 +:1073f0001400062411a1400f00000000f1ff022438 +:10740000061d400b00000000f1ff0224061d400b8a +:10741000000000002110000021e8c0031400bf8f0d +:107420001000be8f1800bd270800e0030000000018 +:10743000e8ffbd271400bfaf1000beaf21f0a003ce +:107440001800c4af1c00c5af2000c6af1c00c28f1f +:107450000400401400000000f1ff02248c1d400bca +:10746000000000001800c28f010003241e0043101a +:10747000000000000100432c09006014000000001f +:10748000020003243900431000000000030003241d +:107490004800431000000000881d400b0000000061 +:1074a0002000c28f0000428c0400422c04004010d7 +:1074b00000000000f1ff02248c1d400b00000000c2 +:1074c0002000c28f04000324000043ac1c00c28fc4 +:1074d0001480838f020063300100632c000043acf2 +:1074e0008b1d400b000000002000c28f0000428c6a +:1074f0000400422c0400401000000000f1ff0224b0 +:107500008c1d400b000000002000c28f04000324eb +:10751000000043ac1480828f040042300500401408 +:10752000000000001c00c28f000040ac8b1d400b0f +:10753000000000001480828f0800423006004010d6 +:10754000000000001c00c28f01000324000043acb7 +:107550008b1d400b000000001c00c28f02000324a2 +:10756000000043ac8b1d400b000000002000c28fc8 +:107570000000428c0400422c040040100000000077 +:10758000f1ff02248c1d400b000000002000c28f80 +:1075900004000324000043ac1c00c28f1480838fbe +:1075a000100063302b180300000043ac8b1d400b10 +:1075b000000000001480828f400042301400401010 +:1075c000000000002000c28f0000428c1400422cfa +:1075d0000400401000000000f1ff02248c1d400b4d +:1075e000000000002000c28f14000324000043ac00 +:1075f0001c00c48f00a0023ca440452414000624b3 +:10760000349d400f000000008b1d400b0000000067 +:107610002000c28f000040ac8b1d400b000000001a +:10762000f1ff02248c1d400b00000000211000001f +:1076300021e8c0031400bf8f1000be8f1800bd27c3 +:107640000800e0030000000070ffbd278c00bfaf02 +:107650008800beaf21f0a0039000c4af9400c5af76 +:107660009800c6aff1ff02242000c2a39800c28f89 +:10767000a7004010000000009800c28f0000428c5c +:1076800003004014000000009800c28f0c0040a4ca +:107690009800c28f0400428c9d0040100000000042 +:1076a0009800c28f0800428c990040100000000032 +:1076b0009800c28f0c004294211840009800c28f9d +:1076c0000e004294211062006500422c9000401090 +:1076d000000000009800c28f100042940101422c6b +:1076e0008b004010000000009800c28f0c004394f3 +:1076f0009800c28f0e00429421106200ffff4330b9 +:107700009800c28f1000429421106200ffff4230a7 +:107710002c0042242800c2a72800c2975800c32783 +:107720001000a3af9000c48f040005242130400056 +:107730009400c78f251a400f000000002000c2a34c +:107740002000c28372004014000000002c00c227f9 +:107750002c0042242400c2af2800c2972c00c3276b +:1077600021206000212800002130400011a1400f9d +:1077700000000000010002242c00c2a39800c28f68 +:107780001400438c01000224060062140000000073 +:107790002c00c39380ff022425106200ff004230ba +:1077a0002c00c2a39800c28f1800438c0100022451 +:1077b00005006214000000002c00c2934000423417 +:1077c000ff0042302c00c2a32c0002242f00c2a3d1 +:1077d0001480828f5000c2af2c00c2270c004224bc +:1077e0002120400000a0023ca440452414000624af +:1077f000349d400f000000002d00c0a39800c28ff0 +:107800000000428c11004010000000009800c28f60 +:107810000c004294ff0042302d00c2a39800c28f9a +:107820000000438c2d00c2932400c48f21286000e7 +:1078300021304000349d400f000000002d00c29315 +:107840002400c38f211062002400c2af9800c28fb1 +:107850000e004294ff0042302e00c2a39800c28f57 +:107860000400438c2e00c2932400c48f21286000a2 +:1078700021304000349d400f000000002e00c293d4 +:107880002400c38f211062002400c2af2400c28fe5 +:10789000ffff43302c00c2272c004224ffff423060 +:1078a00023106200ffff42303000c2a79800c28f51 +:1078b000100042943200c2a79800c28f0800438c87 +:1078c0003200c2972400c48f21286000213040007c +:1078d000349d400f000000005800c2272800c397c5 +:1078e0002c00c4271000a4af1400a3af3000032461 +:1078f0001800a3af01000424bd000524213040007e +:10790000300007243555400f000000002000c2a3be +:107910002000c28321e8c0038c00bf8f8800be8f87 +:107920009000bd270800e0030000000068ffbd27ad +:107930009400bfaf9000beaf21f0a0039800c4af89 +:107940009c00c5afa000c6aff1ff02242000c2a377 +:10795000a000c28ff600401000000000a000c28fff +:107960000000428c0300401400000000a000c28f01 +:10797000140040a4a000c28f0400428cec00401010 +:1079800000000000a000c28f0800428ce8004010f8 +:1079900000000000a000c28f0c00428ce4004010e8 +:1079a00000000000a000c28f1000428ce0004010d8 +:1079b00000000000a000c28f140042942118400073 +:1079c000a000c28f16004294211062006500422c74 +:1079d000d700401000000000a000c28f18004294a1 +:1079e0000101422cd200401000000000a000c28f14 +:1079f0001a0042943106422ccd00401000000000d5 +:107a0000a000c28f14004394a000c28f16004294bd +:107a100021106200ffff4330a000c28f1800429483 +:107a200040100200ffff423021106200ffff433090 +:107a3000a000c28f1a00429421106200ffff423062 +:107a40002c0042242800c2a72800c2976000c32748 +:107a50001000a3af9800c48f04000524213040001b +:107a60009c00c78f251a400f000000002000c2a311 +:107a70002000c283ae00401400000000a000c28fae +:107a80001a0042942800c397231062002a00c2a75c +:107a90002c00c0af3000c0af3400c2272c004224fd +:107aa0002400c2af2a00c2973400c32721206000ff +:107ab000212800002130400011a1400f00000000eb +:107ac000020002243400c2a3a000c28f1c00438c19 +:107ad0000100022406006214000000003400c39379 +:107ae00080ff022425106200ff0042303400c2a350 +:107af000a000c28f2000438c010002240500621404 +:107b0000000000003400c29340004234ff004230c5 +:107b10003400c2a32c0002243700c2a31480828f39 +:107b20005800c2af3400c2270c004224212040007c +:107b300000a0023ca440452414000624349d400fbc +:107b4000000000003500c0a3a000c28f0000428cde +:107b50001100401000000000a000c28f14004294e9 +:107b6000ff0042303500c2a3a000c28f0000438c4a +:107b70003500c2932400c48f2128600021304000ca +:107b8000349d400f000000003500c2932400c38fd5 +:107b9000211062002400c2afa000c28f16004294e0 +:107ba000ff0042303600c2a3a000c28f0400438c05 +:107bb0003600c2932400c48f212860002130400089 +:107bc000349d400f000000003600c2932400c38f94 +:107bd000211062002400c2af2400c28fffff433097 +:107be0003400c2272c004224ffff423023106200e1 +:107bf000ffff42303800c2a7a000c28f1800429495 +:107c00003a00c2a7a000c28f0800438c3a00c29776 +:107c10002400c48f2128600021304000349d400f93 +:107c2000000000003a00c2972400c38f21106200b8 +:107c30002400c2afa000c28f0c00438c3a00c29750 +:107c40002400c48f2128600021304000349d400f63 +:107c5000000000003a00c2972400c38f2110620088 +:107c60002400c2af2400c28fffff43303400c2277c +:107c70002c004224ffff423023106200ffff4230fd +:107c80003c00c2a7a000c28f1a0042943e00c2a7c7 +:107c9000010002242c00c2a33c00c2973000c2a7fe +:107ca0003e00c2973200c2a7a000c28f1000448cd1 +:107cb000a000c28f1a004294211840002c00c22755 +:107cc0001000a4af1400a3af080003241800a3af52 +:107cd00001000424be0005242130400008000724d0 +:107ce0003555400f000000002000c2a32000c283d1 +:107cf0000f004014000000006000c2272a00c39754 +:107d00003400c4271000a4af1400a3af3000032434 +:107d10001800a3af01000424bd0005242130400059 +:107d2000300007243555400f000000002000c2a39a +:107d30002000c28321e8c0039400bf8f9000be8f53 +:107d40009800bd270800e00300000000d8ffbd2711 +:107d50002400bfaf2000beaf21f0a0032800c4afb5 +:107d60002120a0002118c0003400c7af3800c28f06 +:107d70002c00c4a33000c3a31800c2a72c00c393d7 +:107d80003000c2931800c4971000a4af1400a0af35 +:107d90002800c48f21286000213040003400c78fa4 +:107da000701f400f0000000021e8c0032400bf8fb7 +:107db0002000be8f2800bd270800e003000000005f +:107dc000a8ffbd275400bfaf5000beaf21f0a003f5 +:107dd0005800c4af2120c0006400c7af6800c38f43 +:107de0006c00c28f5c00c5a36000c4a34800c3a799 +:107df0004c00c2a3f1ff02241000c2a35800c38f9d +:107e00004800c2972000c0af2400c3af5c00c393fa +:107e10002800c3a32c00c2af4c00c2930400401042 +:107e200000000000211000008d1f400b000000002a +:107e3000020002241400c2af5c00c2932100422c55 +:107e400013004010000000009c1f400b00000000c9 +:107e50002400c38f5c00c293211062000000429096 +:107e600003004014000000005c00c2932800c2a37d +:107e70005c00c2932b100200ff0042305c00c393f1 +:107e8000ffff63245c00c3a3f1ff40140000000067 +:107e90006000c293020003240f00431000000000a2 +:107ea000030003242e0043100000000001000324ff +:107eb00045004314000000002000c2271400c48fb6 +:107ec00021284000f41a400f000000001000c2a357 +:107ed000f91f400b000000006400c28f3d004010fd +:107ee000000000003000c0af3400c0af3800c0a3b5 +:107ef0006400c28f212040008e9d400f00000000d2 +:107f00001800c2a71800c39740000224050062149d +:107f1000000000006400c28f3000c2afce1f400bd3 +:107f2000000000006400c28f3400c2af1800c29786 +:107f3000ff0042303800c2a32000c3273000c22710 +:107f40001400c48f2128600021304000b71b400f6f +:107f5000000000001000c2a3f91f400b0000000049 +:107f60006400c28f1e004010000000006400c28f39 +:107f70001c00c2af1c00c28f020044241c00c28f30 +:107f800001004290ffff4224ff0043301c00c28fdb +:107f9000000042903c00c4af4000c3a34100c2a314 +:107fa0002000c3273c00c2271400c48f2128600092 +:107fb00021304000321b400f000000001000c2a31f +:107fc000f91f400b0000000000000000f91f400beb +:107fd0000000000000000000f91f400b000000003e +:107fe000000000001000c28321e8c0035400bf8fce +:107ff0005000be8f5800bd270800e00300000000bd +:10800000d8ffbd272400bfaf2000beaf21f0a003e2 +:108010001000a0af1400a0af1800a0af010004240e +:108020002b00052421300000213800003555400f79 +:108030000000000021e8c0032400bf8f2000be8f95 +:108040002800bd270800e00300000000d0ffbd2786 +:108050002c00bfaf2800beaf21f0a0033000c4af9a +:108060002000c227212040003000c58f06000624d2 +:10807000349d400f000000001000a0af1400a0af1e +:108080001800a0af01000424020005242000c2272c +:1080900021304000080007243555400f0000000043 +:1080a00021e8c0032c00bf8f2800be8f3000bd2701 +:1080b0000800e00300000000d8ffbd272400bfaf88 +:1080c0002000beaf21f0a0032800c4af2800c28f5b +:1080d0000800438c2800c28f080043ac2800c28fe0 +:1080e0000400438c2800c28f040043ac2800c28fd8 +:1080f0000000438c2800c28f000043ac2800c28fd0 +:108100000c00438c2800c28f0c0043ac2800c28fa7 +:108110001000a0af1400a0af1800a0af020004240c +:108120000a00052421304000140007243555400f73 +:108130000000000021e8c0032400bf8f2000be8f94 +:108140002800bd270800e00300000000d0ffbd2785 +:108150002c00bfaf2800beaf21f0a003211080008b +:108160003000c2a33000c2930400401000000000a1 +:108170000b0002246020400b000000000c000224d1 +:108180002000c2a32000c2931000a0af1400a0af33 +:108190001800a0af02000424212840002130000074 +:1081a000213800003555400f0000000021e8c003d1 +:1081b0002c00bf8f2800be8f3000bd270800e003d1 +:1081c00000000000d8ffbd272400bfaf2000beafd5 +:1081d00021f0a0032800c4af2800c28f1000a0af78 +:1081e0001400a0af1800a0af01000424390005243a +:1081f00021304000040007243555400f00000000e6 +:1082000021e8c0032400bf8f2000be8f2800bd27b7 +:108210000800e00300000000d8ffbd272400bfaf26 +:108220002000beaf21f0a0032800c4af2800c28ff9 +:108230000000429001004224ffff42301000a0af36 +:108240001400a0af1800a0af010004241100052401 +:108250002800c68f213840003555400f000000002f +:1082600021e8c0032400bf8f2000be8f2800bd2757 +:108270000800e00300000000d0ffbd272c00bfafc6 +:108280002800beaf21f0a0033000c4aff4ff0224e9 +:108290002000c2a33000c48f9818400f00000000d7 +:1082a0000c004014000000003000c28f1000a0af8e +:1082b0001400a0af1800a0af01000424160005248c +:1082c00021304000080007243555400f0000000011 +:1082d0002000c2a32000c28321e8c0032c00bf8f6e +:1082e0002800be8f3000bd270800e003000000001a +:1082f000d0ffbd272c00bfaf2800beaf21f0a003e8 +:10830000211080003000c2a3f4ff02242000c2a389 +:108310002400c0af3000c2930200422c1000401075 +:10832000000000003000c2932400c2a32400c22732 +:108330001000a0af1400a0af1800a0af01000424eb +:108340006c00052421304000040007243555400fff +:10835000000000002000c2a3da20400b0000000053 +:10836000f1ff02242000c2a32000c28321e8c00341 +:108370002c00bf8f2800be8f3000bd270800e0030f +:1083800000000000d0ffbd272c00bfaf2800beaf0b +:1083900021f0a003211080003000c2a7f4ff0224c6 +:1083a0002000c2a33000c2972400c2a72400c22725 +:1083b0001000a0af1400a0af1800a0af010004246b +:1083c0001700052421304000040007243555400fd4 +:1083d000000000002000c2a32000c28321e8c003e7 +:1083e0002c00bf8f2800be8f3000bd270800e0039f +:1083f00000000000d0ffbd272c00bfaf2800beaf9b +:1084000021f0a003211080003000c2a32000c0a3ef +:108410003000c29305004010000000003000c293fd +:108420000f00422c05004014000000003000c393f0 +:10843000ff00022410006214000000003000c2930c +:108440002400c2a32400c2271000a0af1400a0afd4 +:108450001800a0af010004241200052421304000c0 +:10846000040007243555400f000000002000c2a37f +:108470002021400b00000000f1ff02242000c2a3d5 +:108480002000c28321e8c0032c00bf8f2800be8fcc +:108490003000bd270800e00300000000d0ffbd272a +:1084a0002c00bfaf2800beaf21f0a0032110800038 +:1084b0003000c2a32000c0a33000c29305004010ca +:1084c000000000003000c2930f00422c0500401451 +:1084d000000000003000c393ff000224100062146b +:1084e000000000003000c2932400c2a32400c22771 +:1084f0001000a0af1400a0af1800a0af010004242a +:108500002500052421304000040007243555400f84 +:10851000000000002000c2a34a21400b0000000020 +:10852000f1ff02242000c2a32000c28321e8c0037f +:108530002c00bf8f2800be8f3000bd270800e0034d +:1085400000000000c8ffbd273400bfaf3000beaf41 +:1085500021f0a003211080003c00c5af3800c2a369 +:10856000f1ff02242000c2a33800c293050040108e +:10857000000000003800c2930f00422c0500401498 +:10858000000000003800c393ff0002243d00621485 +:10859000000000003c00c28f3a00401000000000c4 +:1085a0002200c0a72200c2973c00c38f21106200a6 +:1085b000000042902400c2a32400c2930500422c74 +:1085c00030004010000000002200c2970100422449 +:1085d0002200c2a78b21400b000000002200c2979e +:1085e0003c00c38f21106200000042902100422c09 +:1085f00023004010000000002200c2973c00c38fff +:108600002110620000004290211840002200c29711 +:1086100021106200ffff4230010042242200c2a765 +:108620002400c293ffff42242400c2a32400c2936b +:10863000eaff4014000000003800c2932800c2a3e3 +:108640002200c3972800c2273c00c48f1000a4afab +:108650001400a3af040003241800a3af01000424f6 +:10866000eb00052421304000040007243555400f5d +:10867000000000002000c2a3a121400b0000000068 +:10868000000000002000c28321e8c0033400bf8f37 +:108690003000be8f3800bd270800e0030000000056 +:1086a000c8ffbd273400bfaf3000beaf21f0a0032c +:1086b000211080003c00c5af3800c2a33800c2932f +:1086c0002000c2a33800c29307004014000000003d +:1086d0002100c227212040003c00c58f080006244d +:1086e000349d400f000000001000a0af1400a0afa8 +:1086f0001800a0af010004242f0005242000c22789 +:10870000213040000c0007243555400f00000000c8 +:1087100021e8c0033400bf8f3000be8f3800bd2772 +:108720000800e00300000000d0ffbd272c00bfaf11 +:108730002800beaf21f0a0032000c0a31000a0af0e +:108740001400a0af1800a0af0100042431000524dc +:1087500021300000213800003555400f0000000096 +:108760002000c2a32000c28321e8c0032c00bf8fd9 +:108770002800be8f3000bd270800e0030000000085 +:10878000d0ffbd272c00bfaf2800beaf21f0a00353 +:10879000211080003000c2a32000c0a33000c3938a +:1087a0000100022409006210000000003000c393a1 +:1087b0000600022405006210000000003000c39390 +:1087c0000b00022410006214000000003000c2936d +:1087d0002400c2a32400c2271000a0af1400a0af41 +:1087e0001800a0af010004245b00052421304000e4 +:1087f000040007243555400f000000002000c2a3ec +:108800000422400b00000000f4ff02242000c2a359 +:108810002000c28321e8c0032c00bf8f2800be8f38 +:108820003000bd270800e00300000000d0ffbd2796 +:108830002c00bfaf2800beaf21f0a0032000c0a3d2 +:108840001000a0af1400a0af1800a0af01000424d6 +:108850005c00052421300000213800003555400f10 +:10886000000000002000c2a32000c28321e8c00352 +:108870002c00bf8f2800be8f3000bd270800e0030a +:108880000000000090ffbd276c00bfaf6800beafc6 +:1088900021f0a0037000c4af1000c22721204000c7 +:1088a0007000c58f48000624349d400f0000000072 +:1088b0007000c28f410042245800c327212060006d +:1088c0002128400004000624349d400f00000000d1 +:1088d0007000c28f410042245c00c3272120600049 +:1088e0002128400004000624349d400f00000000b1 +:1088f0006000c0a31000c227212040004722400f83 +:108900000000000021e8c0036c00bf8f6800be8f2c +:108910007000bd270800e00300000000d0ffbd2765 +:108920002c00bfaf2800beaf21f0a0033000c4afc1 +:10893000f4ff02242000c2a33000c48f1918400f96 +:10894000000000001b004014000000003000c28f37 +:108950001000a0af1400a0af1800a0af01000424c5 +:108960004800052421304000540007243555400fad +:10897000000000002000c2a32000c383ffff0224e8 +:108980000c006214000000003000c28f1000a0af85 +:108990001400a0af1800a0af010004244600052475 +:1089a00021304000480007243555400f00000000ea +:1089b0002000c2a32000c28321e8c0032c00bf8f87 +:1089c0002800be8f3000bd270800e0030000000033 +:1089d000d0ffbd272c00bfaf2800beaf21f0a00301 +:1089e0002000c0a31000a0af1400a0af1800a0afdb +:1089f0000100042447000524213000002138000034 +:108a00003555400f000000002000c2a32000c283a3 +:108a100021e8c0032c00bf8f2800be8f3000bd2787 +:108a20000800e00300000000d0ffbd272c00bfaf0e +:108a30002800beaf21f0a0032000c0a31000a0af0b +:108a40001400a0af1800a0af010004240300052407 +:108a500021300000213800003555400f0000000093 +:108a60002000c2a32000c28321e8c0032c00bf8fd6 +:108a70002800be8f3000bd270800e0030000000082 +:108a8000d0ffbd272c00bfaf2800beaf21f0a00350 +:108a90002000c0a31000a0af1400a0af1800a0af2a +:108aa00001000424050005242130000021380000c5 +:108ab0003555400f000000002000c2a32000c283f3 +:108ac00021e8c0032c00bf8f2800be8f3000bd27d7 +:108ad0000800e00300000000d0ffbd272c00bfaf5e +:108ae0002800beaf21f0a0032000c0a31000a0af5b +:108af0001400a0af1800a0af010004240600052454 +:108b000021300000213800003555400f00000000e2 +:108b10002000c2a32000c28321e8c0032c00bf8f25 +:108b20002800be8f3000bd270800e00300000000d1 +:108b3000d0ffbd272c00bfaf2800beaf21f0a0039f +:108b40003000c4af2110a0003400c2a7ffff0224f0 +:108b50002000c2a33000c28f1600401000000000a9 +:108b60003400c29713004010000000003400c29788 +:108b70002400c2a70e0002242600c2a72400c22798 +:108b80003400c3973000c48f1000a4af1400a3af0b +:108b90001a0003241800a3af010004249e0005243a +:108ba00021304000040007243555400f000000002c +:108bb0002000c2a32000c28321e8c0032c00bf8f85 +:108bc0002800be8f3000bd270800e0030000000031 +:108bd000e0ffbd271c00bfaf1800beaf21f0a0030f +:108be0002000c4af2400c5af1000c0a3d353400f72 +:108bf000000000001000c2a31000c283080040144f +:108c0000000000002000c48f2400c58fd848400f0a +:108c1000000000001000c2a33554400f0000000007 +:108c20001000c28321e8c0031c00bf8f1800be8f54 +:108c30002000bd270800e00300000000e0ffbd2782 +:108c40001c00bfaf1800beaf21f0a0032000c4afce +:108c50001000c0a3d353400f000000001000c2a3b7 +:108c60001000c28307004014000000002000c48fe1 +:108c70003049400f000000001000c2a33554400fdf +:108c8000000000001000c28321e8c0031c00bf8f59 +:108c90001800be8f2000bd270800e0030000000080 +:108ca000d0ffbd272c00bfaf2800beaf21f0a0032e +:108cb000211080003000c2a32000c0a33000c29366 +:108cc0002400c2a32400c2271000a0af1400a0af4c +:108cd0001800a0af01000424140005242130400036 +:108ce000040007243555400f000000002000c2a3f7 +:108cf0002000c28321e8c0032c00bf8f2800be8f54 +:108d00003000bd270800e00300000000f8ffbd2789 +:108d10000400beaf21f0a00394808293ff00423094 +:108d200021e8c0030400be8f0800bd270800e0034f +:108d300000000000e8ffbd271400bfaf1000beaf69 +:108d400021f0a0031254400f0000000021e8c003ee +:108d50001400bf8f1000be8f1800bd270800e0036d +:108d600000000000d0ffbd272c00bfaf2800beaf21 +:108d700021f0a003211880002110a0003000c3a31f +:108d80003400c2a32000c0a33000c2932400c2a3b9 +:108d90003400c2932500c2a32400c2271000a0af54 +:108da0001400a0af1800a0af010004242d0005247a +:108db00021304000040007243555400f000000001a +:108dc0002000c2a33000c293212040000554400f70 +:108dd000000000002000c28321e8c0032c00bf8fe8 +:108de0002800be8f3000bd270800e003000000000f +:108df000d0ffbd272c00bfaf2800beaf21f0a003dd +:108e00003000c4af2000c0a31254400f0000000087 +:108e10002100c2a32100c393040002240e006214a7 +:108e2000000000003000c28f2400c2af2400c2271f +:108e30001000a0af1400a0af1800a0af01000424e0 +:108e40003a00052421304000040007243555400f26 +:108e5000000000002000c2a32000c28321e8c0035c +:108e60002c00bf8f2800be8f3000bd270800e00314 +:108e700000000000a8ffbd275400bfaf5000beafe8 +:108e800021f0a0035800c4af2110a0005c00c2a3d1 +:108e90005c00c2933000422c03004014000000002c +:108ea000300002245c00c2a35c00c2930100422493 +:108eb0005c00c2a35c00c2932000c3272120600095 +:108ec0005800c58f21304000349d400f0000000045 +:108ed0001000a0af1400a0af1800a0af0100042440 +:108ee000090005242000c22721304000300007245b +:108ef0003555400f0000000021e8c0035400bf8f2b +:108f00005000be8f5800bd270800e003000000009d +:108f1000a8ffbd275400bfaf5000beaf21f0a00393 +:108f20005800c4af2110a0006000c6af5c00c2a30f +:108f30005c00c2932100422c040040140000000099 +:108f4000f4ff0224ea23400b000000005c00c293ff +:108f50002000c327212060005800c58f2130400029 +:108f6000349d400f000000005c00c2932000c32726 +:108f700021106200000040a06000c28f4400c2af18 +:108f80002000c2271000a0af1400a0af1800a0afaf +:108f90000100042426000524213040002c00072471 +:108fa0003555400f0000000021e8c0035400bf8f7a +:108fb0005000be8f5800bd270800e00300000000ed +:108fc000e8ffbd271400bfaf1000beaf21f0a00323 +:108fd000fa44400f0000000021e8c0031400bf8fd6 +:108fe0001000be8f1800bd270800e003000000003d +:108ff000e0ffbd271c00bfaf1800beaf21f0a003eb +:109000002000c4af1000c0a3d353400f00000000e5 +:109010001000c2a31000c28307004014000000002b +:109020002000c48f3a83400f000000001000c2a34c +:109030003554400f000000001000c28321e8c00337 +:109040001c00bf8f1800be8f2000bd270800e00362 +:1090500000000000e0ffbd271c00bfaf1800beaf3e +:1090600021f0a0031000c0a31200c0a71200c22765 +:1090700021200000212840001283400f0000000042 +:109080001000c2a31000c2830600401400000000bc +:109090001200c297212040008c54400f00000000b5 +:1090a0001000c2a31000c28321e8c0031c00bf8fc0 +:1090b0001800be8f2000bd270800e003000000005c +:1090c000e0ffbd271c00bfaf1800beaf21f0a0031a +:1090d0002000c4af1000c0a3d353400f0000000015 +:1090e0001000c2a31000c28307004014000000005b +:1090f0002000c48f9e83400f000000001000c2a318 +:109100003554400f000000001000c28321e8c00366 +:109110001c00bf8f1800be8f2000bd270800e00391 +:109120000000000090ffbd276c00bfaf6800beaf1d +:1091300021f0a0037000c4af7400c5af2110c000bf +:109140007800c2a31000c227212040007000c58f04 +:1091500048000624349d400f000000007000c28fbc +:10916000410042245800c3272120600021284000ec +:1091700004000624349d400f000000007000c28fe0 +:10918000410042245c00c3272120600021284000c8 +:1091900004000624349d400f000000006000c0a3be +:1091a0007800c2931000c327212060007400c58f8f +:1091b000213040007524400f0000000021e8c0036a +:1091c0006c00bf8f6800be8f7000bd270800e003f1 +:1091d0000000000038ffbd27c400bfafc000beaf15 +:1091e00021f0a003c800c4afcc00c5af2110c0005f +:1091f000d000c2a3f4ff02242000c2a3c800c28f83 +:109200004000401000000000c800c48f1918400f33 +:10921000000000003b00401400000000c800c28fa6 +:109220002400c32721206000212840004800062494 +:10923000349d400f00000000c800c28f4800422447 +:109240002400c327890063242120600021284000d6 +:109250000c000624349d400f00000000cc00c28f9b +:10926000000042802700401000000000cc00c28fa8 +:1092700024004010000000002400c22748004224bf +:1092800021204000cc00c58f40000624349d400fb3 +:1092900000000000d000c293ac00c2a32400c2278b +:1092a0001000a0af1400a0af1800a0af010004246c +:1092b000a700052421304000980007243555400fb1 +:1092c000000000002000c2a32000c383ffff02248f +:1092d0000c006214000000002400c2271000a0afa0 +:1092e0001400a0af1800a0af010004248a000524d8 +:1092f00021304000980007243555400f0000000041 +:109300002000c2a32000c28321e8c003c400bf8f95 +:10931000c000be8fc800bd270800e00300000000a9 +:10932000d8ffbd272400bfaf2000beaf21f0a003af +:109330001000a0af1400a0af1800a0af01000424db +:109340000c00052421300000213800003555400f65 +:109350000000000021e8c0032400bf8f2000be8f62 +:109360002800bd270800e00300000000d8ffbd274b +:109370002400bfaf2000beaf21f0a0031000a0afbb +:109380001400a0af1800a0af0100042407000524ba +:1093900021300000213800003555400f000000004a +:1093a00021e8c0032400bf8f2000be8f2800bd2706 +:1093b0000800e00300000000d8ffbd272400bfaf75 +:1093c0002000beaf21f0a0032800c4af2800c227b0 +:1093d0001000a0af1400a0af1800a0af010004243b +:1093e0000d00052421304000080007243555400faa +:1093f0000000000021e8c0032400bf8f2000be8fc2 +:109400002800bd270800e00300000000d8ffbd27aa +:109410002400bfaf2000beaf21f0a0031000a0af1a +:109420001400a0af1800a0af010004241c00052404 +:1094300021300000213800003555400f00000000a9 +:1094400021e8c0032400bf8f2000be8f2800bd2765 +:109450000800e00300000000d0ffbd272c00bfafd4 +:109460002800beaf21f0a003211080003000c2a36d +:109470003000c29304004010000000000e000224df +:109480002325400b000000000f0002242000c2a38f +:109490002000c2931000a0af1400a0af1800a0af2e +:1094a0000100042421284000213000002138000060 +:1094b0003555400f0000000021e8c0032c00bf8f8d +:1094c0002800be8f3000bd270800e0030000000028 +:1094d000d0ffbd272c00bfaf2800beaf21f0a003f6 +:1094e000211080003000c2a32000c0a33000c2932e +:1094f0002400c2a32400c2271000a0af1400a0af14 +:109500001800a0af010004241800052421304000f9 +:10951000040007243555400f000000002000c2a3be +:109520002000c28321e8c0032c00bf8f2800be8f1b +:109530003000bd270800e00300000000d0ffbd2779 +:109540002c00bfaf2800beaf21f0a0032110800087 +:109550003000c2a32000c0a33000c2932400c2a3e5 +:109560002400c2271000a0af1400a0af1800a0afc5 +:1095700001000424190005242130400004000724c0 +:109580003555400f000000002000c2a32000c28318 +:1095900021e8c0032c00bf8f2800be8f3000bd27fc +:1095a0000800e00300000000d0ffbd272c00bfaf83 +:1095b0002800beaf21f0a003211080003000c2a31c +:1095c0002000c0a33000c2932400c2a32400c227fd +:1095d0001000a0af1400a0af1800a0af0100042439 +:1095e0001b00052421304000040007243555400f9e +:1095f000000000002000c2a32000c28321e8c003b5 +:109600002c00bf8f2800be8f3000bd270800e0036c +:1096100000000000d0ffbd272c00bfaf2800beaf68 +:1096200021f0a003211080003000c2a72000c0a3b9 +:109630002400c0af3000c2972400c2a72400c22774 +:109640001000a0af1400a0af1800a0af01000424c8 +:109650001a00052421304000040007243555400f2e +:10966000000000002000c2a32000c28321e8c00344 +:109670002c00bf8f2800be8f3000bd270800e003fc +:1096800000000000c8ffbd273400bfaf3000beaff0 +:1096900021f0a0033800c4af2110a0003c00c2a7f5 +:1096a000f4ff02242000c2a32400c0af2800c0aff2 +:1096b0003c00c2973406422c13004010000000000a +:1096c0003800c28f10004010000000003c00c2971c +:1096d0002800c2a73800c28f2400c2af2400c227ce +:1096e0001000a0af1400a0af1800a0af0100042428 +:1096f000bb00052421304000080007243555400fe9 +:10970000000000002000c2a32000c28321e8c003a3 +:109710003400bf8f3000be8f3800bd270800e00343 +:1097200000000000c8ffbd273400bfaf3000beaf4f +:1097300021f0a0033800c4af2110a0003c00c2a358 +:10974000f4ff02242000c2a33800c28f140040108e +:10975000000000003c00c2932a00c2a32400c227dc +:10976000212040003800c58f06000624349d400f9c +:10977000000000002400c2271000a0af1400a0af1a +:109780001800a0af0100042420000524213040006f +:10979000080007243555400f000000002000c2a338 +:1097a0002000c28321e8c0033400bf8f3000be8f89 +:1097b0003800bd270800e00300000000f0ffbd27cf +:1097c0000c00beaf21f0a0031000c4af2110a00018 +:1097d0001400c2a70000c0a31000c28f07004010f1 +:1097e000000000001000c28fa08082af1400c2975a +:1097f000a48082a70126400b00000000f4ff022491 +:109800000000c2a30000c28321e8c0030c00be8f89 +:109810001000bd270800e00300000000d0ffbd27b6 +:109820002c00bfaf2800beaf21f0a00321108000a4 +:109830003000c2a3010002242000c2a33000c29362 +:1098400005004010000000003000c3930100022416 +:109850000f006214000000003000c2932100c2a378 +:109860001000a0af1400a0af1800a0af01000424a6 +:109870006a0005242000c22721304000040007248c +:109880003555400f000000002526400b0000000069 +:10989000f1ff022421e8c0032c00bf8f2800be8ff7 +:1098a0003000bd270800e00300000000d0ffbd2706 +:1098b0002c00bfaf2800beaf21f0a0032000c0a342 +:1098c0001000a0af1400a0af1800a0af0100042446 +:1098d0006a0005242000c22721304000040007242c +:1098e0003555400f0000000021e8c0032c00bf8f59 +:1098f0002800be8f3000bd270800e00300000000f4 +:10990000d0ffbd272c00bfaf2800beaf21f0a003c1 +:109910003000c4af3400c5af3400c28fffff423007 +:109920002000c2a72000c2273400c38fffff63308e +:109930003000c48f1000a4af1400a3af02000324b2 +:109940001800a3af01000424a10005242130400029 +:10995000020007243555400f0000000021e8c00335 +:109960002c00bf8f2800be8f3000bd270800e00309 +:1099700000000000d0ffbd272c00bfaf2800beaf05 +:1099800021f0a0033400c5af2118c0003c00c7afd0 +:109990004000c28f3000c4a33800c3a32000c2a778 +:1099a0003c00c28f1400c2af3400c28f2000c397a6 +:1099b000060043a42000c2976a0040100000000087 +:1099c0003000c38300a0023c00190300400242247f +:1099d000211062000000428c620040100000000074 +:1099e0003000c38300a0023c00190300400242245f +:1099f0002110620004004294ffff423059004010e1 +:109a0000000000003000c38300a0023c00190300e6 +:109a100040024224211062000a004290ff004330bd +:109a2000010002244f006214000000002000c297d1 +:109a30001000c2a73000c38300a0023c001903003d +:109a4000400242242110620004004294ffff423091 +:109a50001000c39723106200ffff42301800c2a716 +:109a60001800c28708004018000000003000c383bf +:109a700000a0023c001903004002422421106200b1 +:109a8000040042941000c2a73000c38300a0023c2f +:109a90000019030040024224211062000000438ca0 +:109aa0001000c2971400c48f2128600021304000ac +:109ab00001000724c257400f000000002900401495 +:109ac000000000003000c38300a0023c0019030026 +:109ad00040024224211062000000438c3400c28ff7 +:109ae000000043ac1000c3873400c28f040043a4bd +:109af0003400c28f060043941000c2972310620006 +:109b0000ffff43303400c28f060043a43000c383fc +:109b100000a0023c00190300400242242110620010 +:109b2000040040a43000c38300a0023c00190300dd +:109b30004002422421106200000040ac5081828f1c +:109b400008004010000000005081828f3000c48364 +:109b50003800c393212860003400c68f09f8400004 +:109b60000000000021e8c0032c00bf8f2800be8f3a +:109b70003000bd270800e00300000000e0febd2724 +:109b80001c01bfaf1801beaf21f0a0032118800057 +:109b90002110a0002801c6af2001c3a32401c2a741 +:109ba0002001c39341000224190062140000000048 +:109bb0002c00c2272801c48f21284000040006245d +:109bc00021380000c257400f00000000020240147c +:109bd000000000002d00c2833000c2a35081828f9c +:109be000fd014010000000005081828f2c00c383d3 +:109bf000212060003000c3270100052421306000cf +:109c000009f8400000000000f628400b00000000aa +:109c10002001c393420002241900621400000000d6 +:109c20003400c2272801c48f2128400004000624e4 +:109c300021380000c257400f00000000e601401428 +:109c4000000000003500c2833800c2a35081828f1b +:109c5000e1014010000000005081828f3400c38376 +:109c6000212060003800c327020005242130600055 +:109c700009f8400000000000f628400b000000003a +:109c80002001c393430002244c0062140000000032 +:109c90003c00c2272801c48f212840000c00062464 +:109ca00021380000c257400f00000000ca014014d4 +:109cb000000000004500c2832b00400400000000ab +:109cc0004500c2830c00422827004010000000001d +:109cd0004500c2832118400000a0023c0019030087 +:109ce00040024224211062000b0040a04500c283c4 +:109cf0002118400000a0023c001903004002422449 +:109d000021106200010003240a0043a0b48082975e +:109d1000ffff423001004224ffff4230b48082a79f +:109d2000b4808297ffff423006004014000000001c +:109d3000b4808297ffff423001004224ffff42308f +:109d4000b48082a74500c28321204000b48082975e +:109d5000ffff433000a0023c0021040040024224e7 +:109d600021108200060043a44500c2834800c2a31c +:109d7000020002244c00c2a73e00c2974e00c2a7b8 +:109d80004000c28f5000c2af5081828f92014010bc +:109d9000000000005081828f4400c38321206000b6 +:109da0004800c327040005242130600009f8400062 +:109db00000000000f628400b000000002001c393c3 +:109dc0004400022409006210000000002001c39337 +:109dd0004b00022405006210000000002001c39324 +:109de0005300022462006214000000005c00c0af57 +:109df0006000c0af080002241800c2a72001c3936e +:109e0000530002240300621000000000040002243a +:109e10001800c2a75c00c3271800c2972801c48f8e +:109e2000212860002130400021380000c257400f37 +:109e30000000000040014014000000005c00c283ec +:109e400040014004000000005c00c2830c00422876 +:109e50003f01401000000000050002241a00c2a3c8 +:109e60005c00c2836400c2a35d00c2836500c2a31c +:109e70006400c2832118400000a0023c00190300c6 +:109e8000400242242110620008004294ffff423049 +:109e900003004010000000000a0002241a00c2a3c0 +:109ea0005d00c28315004014000000006400c283fe +:109eb000212040005e00c297f8ff4224ffff43309c +:109ec00000a0023c00210400400242242110820034 +:109ed000080043a46400c283212040006000c393b3 +:109ee00000a0023c00210400400242242110820014 +:109ef0000d0043a0cf27400b000000006400c28388 +:109f0000212040005e00c39300a0023c0021040019 +:109f100040024224211082000e0043a06400c2834c +:109f2000212040005f00c39300a0023c00210400f8 +:109f300040024224211082000f0043a05081828ff2 +:109f400006014010000000005081828f6400c3832e +:109f5000212060001a00c5936400c32721306000ef +:109f600009f8400000000000f628400b0000000047 +:109f70002001c3934a00022417006214000000006d +:109f8000b000c2272801c48f2128400068000624a1 +:109f900021380000c257400f000000000e0140149d +:109fa000000000001401c28f1401c2af4c81828fe7 +:109fb00009014010000000004c81828fb000c427ce +:109fc0001401c38f2128600009f840000000000040 +:109fd000f628400b000000002001c3934600022435 +:109fe00009006210000000002001c3934800022411 +:109ff00005006210000000002001c3934d00022400 +:10a000006f00621400000000060002241b00c2a3bf +:10a010002001c393480002240300621400000000e2 +:10a02000090002241b00c2a3100002242200c2a7c0 +:10a030006800c3272200c2972801c48f212860002e +:10a040002130400021380000c257400f00000000be +:10a05000c5004014000000007400c283c500400425 +:10a06000000000007400c2830c004228c4004010ad +:10a07000000000002400c0a77400c2932600c2a301 +:10a080007600c2972400c2a72600c38300a0023c2a +:10a090000019030040024224211062000c0040a07d +:10a0a0007000c2972800c2a77200c2972a00c2a7f8 +:10a0b0006a00c2978200c2a76c00c28f8400c2af40 +:10a0c0002600c38300a0023c001903004002422482 +:10a0d0002110620006004294ffff42302400c39723 +:10a0e0002a006214000000002800c28718004018ef +:10a0f000000000002800c3872401c2972a106200d4 +:10a1000013004010000000002a00c2972801c38fee +:10a11000211062002801c2af2800c2972200c2a706 +:10a120002600c4831b00c2932200c5977800c32772 +:10a130001000a5af21286000213040002801c78f02 +:10a140005d26400f00000000f628400b00000000d4 +:10a150002800c2977c00c2a77800c0af5081828fd0 +:10a160008a004010000000005081828f2600c483c6 +:10a170001b00c5937800c3272130600009f8400018 +:10a1800000000000f628400b000000002200c397ea +:10a190002401c2972b1062007f00401000000000d5 +:10a1a00021200000212800002130000001000724a8 +:10a1b000c257400f00000000f628400b00000000ce +:10a1c0002001c39345000224090062100000000032 +:10a1d0002001c39347000224050062100000000024 +:10a1e0002001c3934c0002243600621400000000da +:10a1f000070002241c00c2a32001c39347000224cd +:10a200000300621400000000080002241c00c2a326 +:10a210009400c2272801c48f21284000080006248a +:10a2200021380000c257400f000000005d004014bc +:10a23000000000009400c2835d00400400000000a4 +:10a240009400c2830c0042285c0040100000000013 +:10a250001e00c0a79400c2932000c2a39800c2971a +:10a260001e00c2a79600c2879000c2a72000c38329 +:10a2700000a0023c001903004002422421106200a9 +:10a2800006004294ffff42301e00c3974e00621446 +:10a29000000000005081828f4e004010000000003e +:10a2a0005081828f2000c4831c00c5939000c32777 +:10a2b0002130600009f8400000000000f628400b43 +:10a2c000000000002001c3935200022442006214e7 +:10a2d000000000009c00c2272801c48f21284000f4 +:10a2e0001400062401000724c257400f000000009c +:10a2f0003900401400000000a000c38fbc80828f92 +:10a300003500621400000000b880828f32004010d7 +:10a3100000000000b880828f9c00c48fa400c58f0d +:10a32000ac00c3932130600009f840000000000039 +:10a33000f628400b0000000000000000f628400b4b +:10a340000000000000000000f628400b00000000a4 +:10a3500000000000f628400b000000000000000094 +:10a36000f628400b0000000000000000f628400b1b +:10a370000000000000000000f628400b0000000074 +:10a3800000000000f628400b000000000000000064 +:10a39000f628400b0000000000000000f628400beb +:10a3a0000000000000000000f628400b0000000044 +:10a3b00000000000f628400b000000000000000034 +:10a3c000f628400b0000000000000000f628400bbb +:10a3d000000000000000000021e8c0031c01bf8f46 +:10a3e0001801be8f2001bd270800e0030000000017 +:10a3f000e8ffbd271400bfaf1000beaf21f0a003df +:10a40000b6808293ff0042300f004014000000002d +:10a4100000a0023c4002442421280000c000062481 +:10a4200011a1400f0000000002000424019d023c25 +:10a430007c9b45242d58400f0000000001000224a1 +:10a44000b68082a3b48080a721e8c0031400bf8f28 +:10a450001000be8f1800bd270800e00300000000b8 +:10a46000e8ffbd271400bfaf1000beaf21f0a0036e +:10a4700000a0023c4002442421280000c000062421 +:10a4800011a1400f00000000020004242128000058 +:10a490002d58400f00000000508180af4c8180afec +:10a4a000b68080a321e8c0031400bf8f1000be8fc8 +:10a4b0001800bd270800e00300000000f8ffbd27da +:10a4c0000400beaf21f0a0030800c4af0c00c5af6c +:10a4d0000800c28f508182af0c00c28f4c8182afc6 +:10a4e00021e8c0030400be8f0800bd270800e00378 +:10a4f00000000000f8ffbd270400beaf21f0a0035c +:10a500000800c4af0800c28f508182af21e8c003a9 +:10a510000400be8f0800bd270800e0030000000013 +:10a52000f8ffbd270400beaf21f0a0030800c4afb0 +:10a530000800c28f4c8182af21e8c0030400be8fa7 +:10a540000800bd270800e00300000000c0ffbd2791 +:10a550003c00bfaf3800beaf21f0a0032118a0001f +:10a560002110c0004000c4a74400c3a34800c2a3f8 +:10a57000ffff02242000c2a32400c0af4000c39705 +:10a5800002000224ba006214000000004400c393d9 +:10a59000010002244b006214000000002100c0a34f +:10a5a000ab29400b00000000c08082932800c2a3aa +:10a5b000c0808293ff0042300019020000a0023cdc +:10a5c00040024224211062002400c2afc080829366 +:10a5d000ff00423001004324070002241a006200f9 +:10a5e000f401400010100000ff004230c08082a340 +:10a5f0002400c28f0a004290ff004230280040141d +:10a60000000000002800c2932000c2a32400c48fd1 +:10a61000212800001000062411a1400f00000000b6 +:10a620004800c29376004010000000002000c29352 +:10a630003000c2a33000c2271000a0af1400a0afaa +:10a640001800a0af0200042450000524213040006f +:10a65000040007243555400f000000002400c28f7d +:10a66000010003240b0043a04800c393020002240e +:10a6700066006214000000002400c28f0b004290ac +:10a68000ff00433080ff022425106200ff004330aa +:10a690002400c28f0b0043a0042a400b00000000de +:10a6a0002100c293010042242100c2a32100c293d1 +:10a6b0000700422cbcff401400000000042a400b9d +:10a6c000000000004400c39302000224330062141f +:10a6d0000000000000a0023cb00242242c00c2afe7 +:10a6e0002100c0a3e129400b00000000c18082933b +:10a6f0002800c2a3c1808293ff00423000110200f3 +:10a700002c00c38f211062002400c2afc18082934d +:10a71000ff00423001004324c317030082170200e8 +:10a72000211862000300633023106200ff004230f2 +:10a73000c18082a32400c28f0a004290ff004230f1 +:10a740000d004014000000002800c29307004224be +:10a75000ff0042302000c2a32400c48f2128000043 +:10a760001000062411a1400f0000000000000000ae +:10a77000042a400b000000002100c2930100422483 +:10a780002100c2a32100c2930400422cd7ff401431 +:10a7900000000000042a400b000000004400c393a6 +:10a7a000030002241a006214000000004800c39352 +:10a7b00002000224160062140000000000a0023c07 +:10a7c000f00242242400c2af2400c28f0a0042904b +:10a7d000ff0042300e004014000000000b00022475 +:10a7e0002000c2a32400c48f2128000010000624ea +:10a7f00011a1400f00000000042a400b00000000df +:10a8000000000000042a400b0000000000000000cf +:10a810002000c28316004004000000002400c28f04 +:10a82000010003240a0043a0b4808297ffff423056 +:10a8300001004224ffff4230b48082a7b480829797 +:10a84000ffff42300600401400000000b4808297f1 +:10a85000ffff423001004224ffff4230b48082a754 +:10a86000b4808297ffff43302400c28f060043a4c8 +:10a870002000c28321e8c0033c00bf8f3800be8f98 +:10a880004000bd270800e00300000000c8ffbd270e +:10a890003400bfaf3000beaf21f0a003211880000c +:10a8a0003c00c5af2110c0003800c3a34000c2a3c4 +:10a8b000faff02242000c2a33c00c28f3b004010dc +:10a8c000000000003800c28338004004000000008f +:10a8d0003800c2830c004228340040100000000001 +:10a8e0003800c38300a0023c001903004002422448 +:10a8f000211062000a004290ff0043300100022450 +:10a900002a006214000000004000c293270040109b +:10a91000000000003800c2932c00c2a32400c2270c +:10a92000212040003c00c58f08000624349d400fc4 +:10a93000000000002400c2972400c2a72600c2978e +:10a940002600c2a72800c28f2800c2af3800c383e8 +:10a9500000a0023c001903004002422421106200c2 +:10a9600006004294ffff42302e00c2a72400c227f7 +:10a970001000a0af1400a0af1800a0af0200042484 +:10a9800041000524213040000c0007243555400fbc +:10a99000000000002000c2a32000c283030040107a +:10a9a00000000000f7ff02242000c2a32000c283a1 +:10a9b00021e8c0033400bf8f3000be8f3800bd27b0 +:10a9c0000800e00300000000d0ffbd272c00bfaf4f +:10a9d0002800beaf21f0a003211880002110a000a4 +:10a9e0003000c3a33400c2a3faff02242000c2a394 +:10a9f0003000c2832b004004000000003000c283fe +:10aa00000c00422827004010000000003000c383e3 +:10aa100000a0023c00190300400242242110620001 +:10aa20000a004290ff004330010002241d0062141e +:10aa3000000000003000c2932400c2a33400c2937f +:10aa40002500c2a33000c38300a0023c001903000c +:10aa5000400242242110620006004294ffff42306f +:10aa60002600c2a72400c2271000a0af1400a0af88 +:10aa70001800a0af02000424420005242130400049 +:10aa8000040007243555400f000000002000c2a339 +:10aa90002000c2830300401000000000f7ff0224e2 +:10aaa0002000c2a32000c28321e8c0032c00bf8f76 +:10aab0002800be8f3000bd270800e0030000000022 +:10aac000f0ffbd270c00beaf21f0a00321108000d5 +:10aad0001400c5af1800c6af1000c2a3faff0224cd +:10aae0000000c2a31000c283100040040000000058 +:10aaf0001000c2830c0042280c004010000000002f +:10ab00001000c38300a0023c00190300400242244d +:10ab1000211062000a004290ff004330010002242d +:10ab200002006214000000000000c0a30000c28305 +:10ab300021e8c0030c00be8f1000bd270800e00311 +:10ab400000000000c8ffbd273400bfaf3000beaf1b +:10ab500021f0a003211880003c00c5af2110c000e7 +:10ab60003800c3a34000c2a3faff02242000c2a3fe +:10ab70003800c2834d004004000000003800c2834a +:10ab80000c00422849004010000000003c00c28f29 +:10ab900046004010000000003800c38300a0023cc3 +:10aba0000019030040024224211062000a00429072 +:10abb000ff004330010002243c006214000000004a +:10abc0004000c293390040100000000044000224fd +:10abd0002100c2a33800c38300a0023c0019030077 +:10abe00040024224211062000b004290ff004230dc +:10abf00001004230ff0042300b0040100000000016 +:10ac00004b0002242100c2a33800c38300a0023cf1 +:10ac10000019030040024224211062000b00429000 +:10ac2000ff0042302d00c2a33800c2932c00c2a303 +:10ac30002400c227212040003c00c58f08000624c4 +:10ac4000349d400f000000003800c38300a0023c88 +:10ac500000190300400242242110620006004294c1 +:10ac6000ffff42302e00c2a72100c3932400c22759 +:10ac70001000a0af1400a0af1800a0af0200042481 +:10ac800021286000213040000c0007243555400f7a +:10ac9000000000002000c2a32000c2830300401077 +:10aca00000000000f7ff02242000c2a32000c2839e +:10acb00021e8c0033400bf8f3000be8f3800bd27ad +:10acc0000800e00300000000c8ffbd273400bfaf4c +:10acd0003000beaf21f0a003211080003800c2a3d5 +:10ace000faff02242000c2a33800c283610040049e +:10acf000000000003800c2830c0042285d004010b4 +:10ad0000000000003800c38300a0023c00190300cb +:10ad100040024224211062000a004290ff004330aa +:10ad20000100022453006214000000003800c383b5 +:10ad300000a0023c001903004002422421106200de +:10ad40000b004290ff00423001004230ff004230d1 +:10ad500048004010000000003800c38300a0023cff +:10ad60000019030040024224211062000b004290af +:10ad7000ff0042302014027c3e004104000000002d +:10ad80003800c38300a0023c0019030040024224a3 +:10ad90002110620008004294ffff4230350040104d +:10ada000000000002400c0af2800c0af2c00c0afde +:10adb0003800c4833800c38300a0023c001903009c +:10adc00040024224211062000b004290ff004230fa +:10add0007f004230ff00433000a0023c002104000d +:10ade00040024224211082000b0043a03800c3839c +:10adf00000a0023c0019030040024224211062001e +:10ae00000b004290ff0042302d00c2a33800c293d5 +:10ae10002c00c2a33800c38300a0023c0019030029 +:10ae2000400242242110620006004294ffff42309b +:10ae30002e00c2a72400c2271000a0af1400a0afac +:10ae40001800a0af02000424550005242130400062 +:10ae50000c0007243555400f000000002000c2a35d +:10ae60002000c2830300401000000000f7ff02240e +:10ae70002000c2a32000c28321e8c0033400bf8f9a +:10ae80003000be8f3800bd270800e003000000003e +:10ae9000c0ffbd273c00bfaf3800beaf21f0a0030c +:10aea0004400c5af2118c0002110e0004000c4a339 +:10aeb0004800c3a74c00c2a7faff02242000c2a783 +:10aec0004000c28362004004000000004000c283d2 +:10aed0000c0042285e004010000000004400c28fb9 +:10aee0005b004010000000004800c2977905422c2a +:10aef00057004010000000004000c38300a0023c47 +:10af00000019030040024224211062000a0042900e +:10af1000ff004330010002244d00621400000000d5 +:10af2000450002242400c2a3500002242200c2a72c +:10af30004000c2932800c2a34800c2972a00c2a7bb +:10af40004000c38300a0023c0019030040024224d9 +:10af50002110620006004294ffff42303400c2a775 +:10af60004000c28307004228030040140000000094 +:10af7000440002242200c2a74000c38300a0023c78 +:10af80000019030040024224211062000b0042908d +:10af9000ff00423001004230ff00423014004010f8 +:10afa000000000004000c38300a0023c0019030021 +:10afb00040024224211062000b004290ff00423008 +:10afc0002014027c0a004004000000004c0002240f +:10afd0002400c2a34000c38300a0023c0019030068 +:10afe0004002422421106200080042942200c2a7bd +:10aff0002400c39380ff022425106200ff0042302a +:10b00000211840002800c2274400c68f4800c59779 +:10b010002200c4971000a6af1400a5af1800a4af7b +:10b020000200042421286000213040001000072481 +:10b030003555400f000000002000c2a72000c28745 +:10b040000300401000000000f2ff02242000c2a70d +:10b050002000c28721e8c0033c00bf8f3800be8fac +:10b060004000bd270800e00300000000b8ffbd2736 +:10b070004400bfaf4000beaf21f0a00321408000dc +:10b080004c00c5af2120c0002118e0005c00c28f39 +:10b090004800c8a35000c4a75400c3a73800c2a3e7 +:10b0a000faff02242000c2a74800c3830b00022439 +:10b0b000040062140000000024060224322c400b1d +:10b0c00000000000780502242200c2a74800c283c5 +:10b0d00051004004000000004800c2830c004228d8 +:10b0e0004d004010000000004c00c28f4a0040108c +:10b0f000000000005000c3972200c2972b104300ad +:10b1000045004014000000004800c38300a0023c3a +:10b110000019030040024224211062000a004290fc +:10b12000ff004330010002243b00621400000000d5 +:10b130002800c227212040002128000010000624fa +:10b1400011a1400f000000004800c2932800c2a3d4 +:10b150005000c2972a00c2a74800c38300a0023c47 +:10b1600000190300400242242110620006004294ac +:10b17000ffff42303400c2a75800c28f0c004010bd +:10b18000000000005800c28f2400c2af2400c28f0c +:10b19000000042942c00c2a72400c28f02004294f7 +:10b1a0002e00c2a72400c28f0400428c3000c2af20 +:10b1b0002800c3274c00c58f5000c4974800c683a1 +:10b1c0000b0002240400c214000000002800022426 +:10b1d000772c400b00000000440002241000a5afb3 +:10b1e0001400a4af1800a2af02000424c700052475 +:10b1f00021306000100007243555400f000000008a +:10b200002000c2a72000c2870300401000000000f9 +:10b21000f2ff02242000c2a72000c28721e8c00359 +:10b220004400bf8f4000be8f4800bd270800e003e8 +:10b2300000000000c8ffbd273400bfaf3000beaf24 +:10b2400021f0a003211880003c00c5af2110c000f0 +:10b250004400c7af3800c3a34000c2a7faff0224ce +:10b260002000c2a73800c283730040040000000021 +:10b270003800c2830c0042286f004010000000001c +:10b280003c00c28f6c004010000000004000c297dc +:10b2900069004010000000003800c38300a0023c99 +:10b2a0000019030040024224211062000a0042906b +:10b2b000ff004330010002245f0062140000000020 +:10b2c0002000c0a73800c4833c00c38f00a0023c0c +:10b2d000002104004002422421108200000043acff +:10b2e0003800c38300a0023c00190300400242243e +:10b2f000211062004000c397040043a43800c383b8 +:10b3000000a0023c00190300400242242110620008 +:10b310000c004290ff004230470040140000000043 +:10b32000460002242200c2a33800c38300a0023cce +:10b33000001903004002422421106200010003248e +:10b340000c0043a03800c38300a0023c0019030096 +:10b3500040024224211062000b004290ff00423064 +:10b3600001004230ff0042300d004010000000009c +:10b370003800c38300a0023c0019030040024224ad +:10b38000211062000b004290ff0042302014027c2a +:10b3900003004004000000004d0002242200c2a36c +:10b3a0004400c28f0500401400000000ffff02248b +:10b3b0002400c2aff12c400b000000004400c28ffb +:10b3c0002400c2af3800c2932800c2a33800c38350 +:10b3d00000a0023c00190300400242242110620038 +:10b3e00006004294ffff42302a00c2a74000c297e5 +:10b3f0002c00c2a72200c3932400c2271000a0afd4 +:10b400001400a0af1800a0af02000424212860009f +:10b41000213040000c0007243555400f000000008b +:10b420002000c2a72000c2870300401000000000d7 +:10b43000f2ff02242000c2a72000c28721e8c00337 +:10b440003400bf8f3000be8f3800bd270800e003f6 +:10b4500000000000d0ffbd272c00bfaf2800beaf0a +:10b4600021f0a003211080003000c2a3faff0224c3 +:10b470002000c2a33000c28343004004000000004b +:10b480003000c2830c0042283f0040100000000042 +:10b490003000c38300a0023c001903004002422494 +:10b4a000211062000a004290ff0043300100022494 +:10b4b0003500621400000000490002242100c2a3ec +:10b4c0003000c2932400c2a33000c38300a0023c1a +:10b4d0000019030040024224211062000600429439 +:10b4e000ffff42302600c2a73000c38300a0023c09 +:10b4f0000019030040024224211062000b00429018 +:10b50000ff00423001004230ff0042300300401093 +:10b51000000000004e0002242100c2a32100c393ba +:10b520002400c2271000a0af1400a0af1800a0afe5 +:10b530000200042421286000213040000400072478 +:10b540003555400f000000002000c2a32000c28338 +:10b550000300401000000000f7ff02242000c2a3f7 +:10b560003000c2830019020000a0023c40024224c5 +:10b570002110620021204000212800001000062434 +:10b5800011a1400f000000002000c28321e8c00389 +:10b590002c00bf8f2800be8f3000bd270800e003bd +:10b5a00000000000c8ffbd273400bfaf3000beafb1 +:10b5b00021f0a003211880003c00c5af2110c0007d +:10b5c0004400c7af3800c3a34000c2a72000c0a7f3 +:10b5d0003800c28364004004000000003800c283c9 +:10b5e0000c00422860004010000000003c00c28fa8 +:10b5f0005d004010000000004000c2975a0040105b +:10b60000000000003800c38300a0023c00190300c2 +:10b6100040024224211062000a004290ff004330a1 +:10b620000100022450006214000000003800c383af +:10b6300000a0023c001903004002422421106200d5 +:10b640000a004290ff0042304f004010000000000e +:10b650002000c0a73800c4833c00c38f00a0023c78 +:10b66000002104004002422421108200000043ac6b +:10b670003800c38300a0023c0019030040024224aa +:10b68000211062004000c397040043a43800c38324 +:10b6900000a0023c00190300400242242110620075 +:10b6a0000c004290ff0042303300401400000000c4 +:10b6b0003800c38300a0023c00190300400242246a +:10b6c00021106200010003240c0043a04400c28f3b +:10b6d0000500401400000000ffff02242400c2af58 +:10b6e000bc2d400b000000004400c28f2400c2affc +:10b6f0003800c2932800c2a33800c38300a0023cd4 +:10b700000019030040024224211062000600429406 +:10b71000ffff42302a00c2a74000c2972c00c2a7f8 +:10b720002400c2271000a0af1400a0af1800a0afe3 +:10b730000200042448000524213040000c000724a6 +:10b740003555400f000000002000c2a72000c2872e +:10b750000c00401000000000f2ff02242000c2a7ed +:10b76000e22d400b00000000faff02242000c2a7d7 +:10b77000e22d400b0000000000000000e22d400b15 +:10b7800000000000000000002000c28721e8c00384 +:10b790003400bf8f3000be8f3800bd270800e003a3 +:10b7a00000000000d0ffbd272c00bfaf2800beafb7 +:10b7b00021f0a0033000c4affaff02242000c2a38e +:10b7c0003000c48f8e9d400f000000002100c2a3f6 +:10b7d0002100c2936500422c1500401000000000bb +:10b7e0003000c38f2100c293ffff4230010042248a +:10b7f000ffff42301000a0af1400a0af1800a0afb0 +:10b8000002000424ca0005242130600021384000d1 +:10b810003555400f000000002000c2a32000c28365 +:10b820000300401000000000f7ff02242000c2a324 +:10b830002000c28321e8c0032c00bf8f2800be8fe8 +:10b840003000bd270800e00300000000c8ffbd274e +:10b850003400bfaf3000beaf21f0a0032118a0001c +:10b860004000c6af2110e0003800c4a33c00c3a3d1 +:10b870004400c2a7faff02242000c2a33800c383f9 +:10b880000b00022427006214000000004400c3974c +:10b89000040002242300621400000000540002246b +:10b8a0002100c2a33c00c2932900c2a33800c29366 +:10b8b0002800c2a34000c28f0000428c2400c2af07 +:10b8c0003800c38300a0023c001903004002422458 +:10b8d0002110620006004294ffff42302a00c2a7f6 +:10b8e0002100c3932400c2271000a0af1400a0af12 +:10b8f0001800a0af0200042421286000213040007d +:10b90000080007243555400f000000002000c2a3a6 +:10b910002000c2830300401000000000f7ff022453 +:10b920002000c2a32000c28321e8c0033400bf8fdf +:10b930003000be8f3800bd270800e0030000000083 +:10b9400060ffbd279c00bfaf9800beaf21f0a003f1 +:10b950002118a000a800c6af2110e000a000c4a3d9 +:10b96000a400c3a3ac00c2a7faff02242000c2a314 +:10b97000a000c28307004228a7004010000000007a +:10b98000a000c38300a0023c00190300400242242f +:10b99000211062000b004290ff0042300100423053 +:10b9a000ff0042309c004010000000002100c0a3b6 +:10b9b0002000c0a3ac00c397040002241700621447 +:10b9c00000000000a400c3930100022405006214db +:10b9d00000000000020002242100c2a3872e400bb9 +:10b9e00000000000a400c3930300022405006214b9 +:10b9f00000000000100002242100c2a3872e400b8b +:10ba000000000000a400c393040002240300621499 +:10ba100000000000400002242100c2a32100c293c4 +:10ba20002f00401000000000a800c28f0000428cd0 +:10ba30002400c2af2400c28f130040100000000099 +:10ba4000a000c483a000c38300a0023c001903002f +:10ba500040024224211062000b004290ff0043305c +:10ba60002100c29325106200ff00433000a0023c79 +:10ba70000021040040024224211082000b0043a058 +:10ba8000062f400b00000000a000c483a000c38369 +:10ba900000a0023c00190300400242242110620071 +:10baa0000b004290ff004230201c027c2100c28328 +:10bab000271002002014027c241062002014027c53 +:10bac000ff00433000a0023c002104004002422459 +:10bad000211082000b0043a0062f400b0000000045 +:10bae000a400c393020002240500621400000000b9 +:10baf000ac00c2976400422c090040140000000012 +:10bb0000a400c393050002243e006214000000005c +:10bb1000ac00c2972100422c3a0040100000000007 +:10bb20002800c3276c000224212060002128000087 +:10bb30002130400011a1400f00000000a000c2937e +:10bb40002800c2a3a000c38300a0023c0019030088 +:10bb5000400242242110620006004294ffff42305e +:10bb60002a00c2a7a400c2932900c2a3ac00c297b6 +:10bb70002c00c2afac00c2972800c3270800632482 +:10bb800021206000a800c58f21304000349d400f67 +:10bb9000000000002800c2271000a0af1400a0afd2 +:10bba0001800a0af020004245100052421304000f9 +:10bbb0006c0007243555400f000000002000c2a390 +:10bbc0002000c383fdff0224120062140000000065 +:10bbd0002800c2271000a0af1400a0af1800a0af2b +:10bbe00002000424d1000524213040006c00072409 +:10bbf0003555400f000000002000c2a3062f400b67 +:10bc000000000000faff02242000c2a3062f400b10 +:10bc100000000000000000002000c28321e8c003f3 +:10bc20009c00bf8f9800be8fa000bd270800e003d6 +:10bc300000000000c0ffbd273c00bfaf3800beaf12 +:10bc400021f0a003214080002120a0002118c00085 +:10bc50004c00c7af5000c28f4000c8a34400c4a32b +:10bc60004800c3a33000c2a7faff02242000c2a3e9 +:10bc70004000c2835a004004000000004000c2831c +:10bc80000c00422856004010000000004c00c28ffb +:10bc900053004010000000004000c38300a0023c9d +:10bca0000019030040024224211062000a00429061 +:10bcb000ff0043300100022449006214000000002c +:10bcc0004400c393ff0002240c0062140000000033 +:10bcd0004000c4834800c3933000c297212860000d +:10bce0004c00c68f21384000132e400f000000008a +:10bcf0002000c2a3782f400b000000004400c39333 +:10bd0000020002240c006214000000004000c48302 +:10bd10004800c3933000c297212860004c00c68fb2 +:10bd200021384000502e400f000000002000c2a328 +:10bd3000782f400b000000004400c3930100022450 +:10bd400027006214000000003000c39704000224a2 +:10bd500023006214000000004f0002242100c2a34f +:10bd60004800c2932900c2a34000c2932800c2a386 +:10bd70004c00c28f0000428c2400c2af4000c3833d +:10bd800000a0023c0019030040024224211062007e +:10bd900006004294ffff42302a00c2a72100c3934d +:10bda0002400c2271000a0af1400a0af1800a0af5d +:10bdb00002000424212860002130400008000724ec +:10bdc0003555400f000000002000c2a32000c283b0 +:10bdd0000300401000000000f7ff02242000c2a36f +:10bde0002000c28321e8c0033c00bf8f3800be8f13 +:10bdf0004000bd270800e00300000000f8ffbd2759 +:10be00000400beaf21f0a0032118a0002110c00043 +:10be10001400c7af0800c4a30c00c3a31000c2a342 +:10be2000faff022421e8c0030400be8f0800bd27ea +:10be30000800e00300000000c8ffbd273400bfafca +:10be40003000beaf21f0a0033800c4af2110a00025 +:10be50004000c6af3c00c2a3f1ff02242000c2a3f1 +:10be60003800c28f1c004010000000004000c28f4c +:10be70001900401000000000010002242c00c2a79d +:10be80003800c28f2400c2afbc80828f01004224e0 +:10be9000bc8082afbc80828f2800c2af3c00c293be +:10bea0002e00c2a34000c28fb88082af2400c227f8 +:10beb0001000a0af1400a0af1800a0af020004242f +:10bec00052000524213040000c0007243555400f56 +:10bed000000000002000c2a32000c28321e8c003ac +:10bee0003400bf8f3000be8f3800bd270800e0034c +:10bef00000000000b0ffbd274c00bfaf4800beaf40 +:10bf000021f0a003211080005400c5af5000c2a34f +:10bf1000faff02241800c2a35000c2835c00400450 +:10bf2000000000005000c283070042285800401063 +:10bf3000000000005400c28f5500401000000000b7 +:10bf40005400c48f8e9d400f000000001900c2a352 +:10bf50001900c2934e004010000000001900c29367 +:10bf60001e00422c4a004010000000002400c0af18 +:10bf70002800c0af2c00c0af3000c0af3400c0af4d +:10bf80003800c0af3c00c0af4000c0af1900c29342 +:10bf9000030042242400c327211062001c00c2af0a +:10bfa0002000c0a32400c227030042241900c39329 +:10bfb000212040005400c58f21306000349d400f87 +:10bfc000000000001900c293010042241900c2a31e +:10bfd0001900c2932500c2a3200002242600c2a398 +:10bfe0000e30400b000000001c00c28fffff4224f7 +:10bff0001c00c2af1c00c28f00004390200002242e +:10c000000a006214000000002000c2931f004010cc +:10c01000000000001c00c28f2000c393000043a05a +:10c020002000c0a30e30400b000000002000c2938f +:10c03000010042242000c2a31900c2932b10020069 +:10c04000ff0042301900c393ffff63241900c3a30c +:10c05000e5ff4014000000005000c3832400c22705 +:10c06000200004241000a4af212060000200052459 +:10c0700005000624213840000d2f400f000000006d +:10c080001800c2a32430400b000000000000000094 +:10c090001800c28321e8c0034c00bf8f4800be8f48 +:10c0a0005000bd270800e00300000000f8ffbd2796 +:10c0b0000400beaf21f0a003211080000800c2a33d +:10c0c0000800c2830700422804004010000000005e +:10c0d0000800c2830400410400000000faff0224ab +:10c0e0005830400b000000000800c38300a0023c51 +:10c0f0000019030040024224211062000b0042900c +:10c10000ff004230010042300a00401000000000f1 +:10c110000800c38300a0023c00190300400242242f +:10c12000211062000a004290ff00423004004014d7 +:10c1300000000000faff02245830400b000000000d +:10c140000800c38300a0023c0019030040024224ff +:10c15000211062000d004290ff0042302014027c4a +:10c1600021e8c0030400be8f0800bd270800e003db +:10c1700000000000f8ffbd270400beaf21f0a003bf +:10c18000b6808293ff00423021e8c0030400be8fd6 +:10c190000800bd270800e00300000000f8ffbd27ed +:10c1a0000400beaf21f0a003211080000c00c5af39 +:10c1b0000800c2a30800c2830700422807004010fd +:10c1c000000000000800c2830400400400000000da +:10c1d0000c00c28f0400401400000000faff02248b +:10c1e0009a30400b000000000800c38300a0023c0e +:10c1f0000019030040024224211062000a0042900c +:10c20000ff0042300400401400000000faff022446 +:10c210009a30400b000000000800c38300a0023cdd +:10c220000019030040024224211062000e004290d7 +:10c23000ff004230211840000c00c28f000043acc8 +:10c240000800c38300a0023c0019030040024224fe +:10c25000211062000f004290ff0043300c00c28f9b +:10c26000040043a02110000021e8c0030400be8f99 +:10c270000800bd270800e00300000000e0ffbd2724 +:10c280001c00bfaf1800beaf21f0a003fa5c400f46 +:10c290000000000000a0023c4809442421280000be +:10c2a0002006062411a1400f000000001000c0afbe +:10c2b0002c31400b0000000000a0043c1000c28f95 +:10c2c000211840004011030021184000c010030055 +:10c2d00023104300c018020023186200480982247a +:10c2e00021106200080040ac1000c28f21184000ed +:10c2f0004011030021184000c01003002310430028 +:10c30000c0180200231862000800632400a0023c49 +:10c3100048094224211062000400442400a0033c88 +:10c320001000c28f48096524211840004011030005 +:10c3300021184000c010030023104300c018020061 +:10c34000231062002110a2000c0444ac1000c28f24 +:10c35000211840004011030021184000c0100300c4 +:10c3600023104300c0180200231862000800632451 +:10c3700000a0023c48094224211062000400442429 +:10c3800000a0053c1000c28f21184000401103009e +:10c3900021184000c010030023104300c018020001 +:10c3a000231862004809a22421106200100444ac42 +:10c3b0001000c28f211840004011030021184000d6 +:10c3c000c010030023104300c018020023186200ad +:10c3d0001004632400a0023c48094224211062009a +:10c3e0000400442400a0053c1000c28f2118400026 +:10c3f0004011030021184000c01003002310430027 +:10c40000c0180200231862004809a224211062000b +:10c41000180644ac00a0043c1000c28f2118400054 +:10c420004011030021184000c010030023104300f6 +:10c43000c0180200231862004809822421106200fb +:10c440001806448c00a0033c1000c28f48096524e4 +:10c45000211840004011030021184000c0100300c3 +:10c4600023104300c0180200231062002110a20014 +:10c47000140644ac00a0033c1000c28f4809642499 +:10c48000211840004011030021184000c010030093 +:10c4900023104300c0180200231062002110820004 +:10c4a0001c0640ac1000c28f010042241000c2af35 +:10c4b0001000c28f80ff40180000000000a0023c66 +:10c4c00001000324480943ac00a0023c480942246f +:10c4d00001000324040043ac00a0023c7c3d442442 +:10c4e00021280000b8a4400f0000000000a0023c7a +:10c4f0007c3d4424daa1400f000000002120000010 +:10c50000802505242130000021380000f831400f3b +:10c510000000000021e8c0031c00bf8f1800be8f80 +:10c520002000bd270800e00300000000e8ffbd2751 +:10c530001400bfaf1000beaf21f0a0031800c4afbd +:10c540001800c28f020042280400401400000000be +:10c5500021100000f231400b0000000000a0043c5c +:10c560001800c28f2118400040110300211840001c +:10c57000c010030023104300c018020023186200fb +:10c580004809822421106200080040ac1800c28fc4 +:10c59000211840004011030021184000c010030082 +:10c5a00023104300c018020023186200080063240f +:10c5b00000a0023c480942242110620004004424e7 +:10c5c00000a0033c1800c28f4809652421184000d0 +:10c5d0004011030021184000c01003002310430045 +:10c5e000c0180200231062002110a2000c0444ac09 +:10c5f0001800c28f2118400040110300211840008c +:10c60000c010030023104300c0180200231862006a +:10c610000800632400a0023c480942242110620063 +:10c620000400442400a0053c1800c28f21184000db +:10c630004011030021184000c010030023104300e4 +:10c64000c0180200231862004809a22421106200c9 +:10c65000100444ac1800c28f2118400040110300a0 +:10c6600021184000c010030023104300c01802002e +:10c67000231862001004632400a0023c48094224ed +:10c68000211062000400442400a0053c1800c28f61 +:10c69000211840004011030021184000c010030081 +:10c6a00023104300c0180200231862004809a22486 +:10c6b00021106200180644ac00a0043c1800c28f90 +:10c6c000211840004011030021184000c010030051 +:10c6d00023104300c0180200231862004809822476 +:10c6e000211062001806448c00a0033c1800c28f81 +:10c6f000480965242118400040110300211840001a +:10c70000c010030023104300c01802002310620071 +:10c710002110a200140644ac00a0033c1800c28ff4 +:10c7200048096424211840004011030021184000ea +:10c73000c010030023104300c01802002310620041 +:10c74000211082001c0640ac00a0023c4809438c2a +:10c75000010002241b0062140000000000a0033c42 +:10c760001800c28f480964242118400040110300ba +:10c7700021184000c010030023104300c01802001d +:10c7800023106200211082000400428c0600401039 +:10c790000000000001000324070043100000000017 +:10c7a000f131400b000000004d60400f0000000020 +:10c7b000f131400b000000008f60400f00000000ce +:10c7c000000000000100022421e8c0031400bf8f14 +:10c7d0001000be8f1800bd270800e0030000000015 +:10c7e000c8ffbd273400bfaf3000beaf21f0a003ab +:10c7f0003800c4af3c00c5af4000c6af4400c7af6f +:10c800003800c28f0400401c000000003800c28fb6 +:10c810000400410400000000050002246e32400bb9 +:10c820000000000000a0043c3800c28f2118400026 +:10c830004011030021184000c010030023104300e2 +:10c84000c0180200231862004809822421106200e7 +:10c850000000438c01000224560062140000000016 +:10c860004000c28f0f004004000000000200432877 +:10c8700006006014000000000200032406004310bc +:10c88000000000002932400b000000002000c0af73 +:10c890002932400b00000000010002242000c2af3a +:10c8a000000000004400c28f01000324090043106f +:10c8b00000000000020003240a00431000000000f2 +:10c8c0000b004014000000002400c0af3c32400bbd +:10c8d00000000000010002242400c2af3c32400be3 +:10c8e00000000000020002242400c2af000000008b +:10c8f00000a0033c3800c28f48096424211840007e +:10c900004011030021184000c01003002310430011 +:10c91000c018020023106200211082000400448c21 +:10c920003800c28f21184000401103002118400038 +:10c93000c010030023104300c01802002318620037 +:10c940000800632400a0023c480942242110620030 +:10c95000040046243800c28f211840004011030013 +:10c9600021184000c010030023104300c01802002b +:10c97000231862000704632400a0023c48094224f3 +:10c9800021106200040042243c00c38f1000a3afba +:10c990002000c38f1400a3af2400c38f1800a3afdf +:10c9a0003800c58f21384000715d400f0000000045 +:10c9b0002800c2af2800c28f21e8c0033400bf8f17 +:10c9c0003000be8f3800bd270800e00300000000e3 +:10c9d000e0ffbd271c00bfaf1800beaf21f0a003d1 +:10c9e0002000c4af2400c5af2800c6af2000c28f0e +:10c9f000211840004011030021184000c01003001e +:10ca000023104300c01802002318620000a0023c5b +:10ca100048094224211062001400c2af2000c28fd6 +:10ca200007004104000000002000c28f04004018ed +:10ca30000000000021100000c132400b0000000087 +:10ca40001000c0afac32400b000000001400c28fd9 +:10ca50001406428c2400c38f00006380000043a0b2 +:10ca6000010043241400c28f140643ac2400c28f7b +:10ca7000010042242400c2af1400c28f1406438c6c +:10ca80001400c28f130642242b10430005004010ef +:10ca9000000000001400c28f140443241400c28f4d +:10caa000140643ac1000c28f010042241000c2af34 +:10cab0001000c38f2800c28f2a106200e3ff4014c9 +:10cac000000000001400c28f1c06438c2800c28f97 +:10cad000211862001400c28f1c0643ac1400c28fe0 +:10cae0001c06428c00024228050040140000000091 +:10caf000039d023cb092442427a4400f0000000094 +:10cb00000100022421e8c0031c00bf8f1800be8f63 +:10cb10002000bd270800e00300000000f0ffbd2753 +:10cb20000c00beaf21f0a0031000c4af1000c28ff4 +:10cb3000211840004011030021184000c0100300dc +:10cb400023104300c01802002318620000a0023c1a +:10cb500048094224211062000000c2af0000c28fc9 +:10cb60001406438c0000c28f1806428c0400621425 +:10cb700000000000211000000033400b0000000006 +:10cb80000000c28f1806438c0000c28f1406428c2e +:10cb90002b10620009004010000000000000c28f4e +:10cba0001406428c211840000000c28f1806428ce7 +:10cbb000231062000033400b000000000000c28f11 +:10cbc00013064224211840000000c28f1806428c30 +:10cbd000231062000400c2af0000c28f1406428c12 +:10cbe000211840000000c28f140442242310620068 +:10cbf0000400c38f211062000400c2af0400c28f82 +:10cc000021e8c0030c00be8f1000bd270800e00320 +:10cc100000000000f0ffbd270c00beaf21f0a00314 +:10cc20001000c4af1400c5af1800c6af0400c0aff9 +:10cc300000a0043c1000c28f2118400040110300e6 +:10cc400021184000c010030023104300c018020048 +:10cc50002318620048098224211062001004448cc9 +:10cc600000a0033c1000c28f480965242118400031 +:10cc70004011030021184000c0100300231043009e +:10cc8000c0180200231062002110a2000c04428c84 +:10cc90002b1082007d0040100000000000a0043c2a +:10cca0001000c28f211840004011030021184000dd +:10ccb000c010030023104300c018020023186200b4 +:10ccc00048098224211062001004428c2120400077 +:10ccd0001000c28f211840004011030021184000ad +:10cce000c010030023104300c01802002318620084 +:10ccf0000800632400a0023c48094224211062007d +:10cd000004004224232082001000c28f211840001a +:10cd10004011030021184000c010030023104300fd +:10cd2000c0180200231862000704632400a0023c1c +:10cd300048094224211062000400422421284000b6 +:10cd400000a0033c1000c28f48096624211840004f +:10cd50004011030021184000c010030023104300bd +:10cd6000c0180200231062002110c2000c04428c83 +:10cd70002310a200211882001800c28f2a1062001e +:10cd8000010140100000000000a0043c1000c28f10 +:10cd9000211840004011030021184000c01003007a +:10cda00023104300c018020023186200480982249f +:10cdb00021106200080040ac1000c28f2118400012 +:10cdc0004011030021184000c0100300231043004d +:10cdd000c0180200231862000800632400a0023c6f +:10cde00048094224211062000400442400a0033cae +:10cdf0001000c28f4809652421184000401103002b +:10ce000021184000c010030023104300c018020086 +:10ce1000231062002110a2000c0444ac1000c28f49 +:10ce2000211840004011030021184000c0100300e9 +:10ce300023104300c0180200231862000800632476 +:10ce400000a0023c4809422421106200040044244e +:10ce500000a0053c1000c28f2118400040110300c3 +:10ce600021184000c010030023104300c018020026 +:10ce7000231862004809a22421106200100444ac67 +:10ce800004000224d134400b0000000000a0033c49 +:10ce90001000c28f4809642421184000401103008b +:10cea00021184000c010030023104300c0180200e6 +:10ceb00023106200211082000c04448c00a0053c69 +:10cec0001000c28f211840004011030021184000bb +:10ced000c010030023104300c01802002318620092 +:10cee0004809a224211062001004428c2b108200f9 +:10cef000600040100000000000a0043c1000c28f41 +:10cf0000211840004011030021184000c010030008 +:10cf100023104300c018020023186200480982242d +:10cf2000211062001004428c2120400000a0033c2c +:10cf30001000c28f480965242118400040110300e9 +:10cf400021184000c010030023104300c018020045 +:10cf5000231062002110a2000c04428c23188200ce +:10cf60001800c28f2a1062008700401000000000e5 +:10cf700000a0043c1000c28f2118400040110300a3 +:10cf800021184000c010030023104300c018020005 +:10cf9000231862004809822421106200080040ac76 +:10cfa0001000c28f211840004011030021184000da +:10cfb000c010030023104300c018020023186200b1 +:10cfc0000800632400a0023c4809422421106200aa +:10cfd0000400442400a0033c1000c28f48096524cb +:10cfe000211840004011030021184000c010030028 +:10cff00023104300c0180200231062002110a20079 +:10d000000c0444ac1000c28f2118400040110300f2 +:10d0100021184000c010030023104300c018020074 +:10d02000231862000800632400a0023c480942243f +:10d03000211062000400442400a0053c1000c28faf +:10d04000211840004011030021184000c0100300c7 +:10d0500023104300c0180200231862004809a224cc +:10d0600021106200100444ac04000224d134400baf +:10d07000000000001800c28f000442284200401443 +:10d080000000000000a0043c1000c28f21184000e6 +:10d090004011030021184000c0100300231043007a +:10d0a000c01802002318620048098224211062007f +:10d0b000080040ac1000c28f21184000401103004e +:10d0c00021184000c010030023104300c0180200c4 +:10d0d000231862000800632400a0023c480942248f +:10d0e000211062000400442400a0033c1000c28f01 +:10d0f0004809652421184000401103002118400010 +:10d10000c010030023104300c01802002310620067 +:10d110002110a2000c0444ac1000c28f2118400062 +:10d120004011030021184000c010030023104300e9 +:10d13000c0180200231862000800632400a0023c0b +:10d1400048094224211062000400442400a0053c48 +:10d150001000c28f21184000401103002118400028 +:10d16000c010030023104300c018020023186200ff +:10d170004809a22421106200100444ac04000224d7 +:10d18000d134400b000000000000c0afbe34400ba3 +:10d19000000000001000c28f211840004011030061 +:10d1a00021184000c010030023104300c0180200e3 +:10d1b000231862000804632400a0023c48094224aa +:10d1c000211062000400442400a0033c1000c28f20 +:10d1d000480965242118400040110300211840002f +:10d1e000c010030023104300c01802002310620087 +:10d1f0002110a2000c04428c1400c38f0000638035 +:10d20000000043a001004224000082ac1400c28f41 +:10d21000010042241400c2af00a0033c1000c28fe2 +:10d2200048096424211840004011030021184000df +:10d23000c010030023104300c01802002310620036 +:10d24000211082000c04448c1000c28f2118400071 +:10d250004011030021184000c010030023104300b8 +:10d26000c0180200231862000704632400a0023cd7 +:10d270004809422421106200040042242b1044007b +:10d280001a004010000000001000c28f211840005a +:10d290004011030021184000c01003002310430078 +:10d2a000c0180200231862000800632400a0023c9a +:10d2b00048094224211062000400442400a0033cd9 +:10d2c0001000c28f48096524211840004011030056 +:10d2d00021184000c010030023104300c0180200b2 +:10d2e000231062002110a2000c0444ac0000c28f85 +:10d2f000010042240000c2af0000c38f1800c28f9b +:10d300002a106200a3ff40140000000000a0043cab +:10d310001000c28f21184000401103002118400066 +:10d32000c010030023104300c0180200231862003d +:10d33000480982242110620001000324080043ac44 +:10d340000400c28f21e8c0030c00be8f1000bd276f +:10d350000800e00300000000f8ffbd270400beaf96 +:10d3600021f0a0030800c4af0c00c5af00a0043c2e +:10d370000800c28f2118400040110300211840000e +:10d38000c010030023104300c018020023186200dd +:10d3900048098224211062001004438c0c00c28fc3 +:10d3a000212062000800c28f2118400040110300b4 +:10d3b00021184000c010030023104300c0180200d1 +:10d3c000231862000800632400a0023c480942249c +:10d3d0002110620004004224000442242b10820029 +:10d3e0001d0040100000000000a0043c0800c28f97 +:10d3f000211840004011030021184000c010030014 +:10d4000023104300c0180200231862004809822438 +:10d41000211062001004438c0c00c28f2120620096 +:10d4200000a0053c0800c28f2118400040110300f5 +:10d4300021184000c010030023104300c018020050 +:10d44000231862004809a22421106200100444ac91 +:10d450005035400b0000000000a0043c0800c28fc3 +:10d46000211840004011030021184000c0100300a3 +:10d4700023104300c01802002318620048098224c8 +:10d48000211062001004428c212040000800c28f4d +:10d49000211840004011030021184000c010030073 +:10d4a00023104300c0180200231862000800632400 +:10d4b00000a0023c480942242110620004004224da +:10d4c00000044224231082000c00c38f211062004c +:10d4d0000c00c2af0800c28f2118400040110300a9 +:10d4e00021184000c010030023104300c0180200a0 +:10d4f000231862000800632400a0023c480942246b +:10d5000021106200040043240c00c28f212062001d +:10d5100000a0053c0800c28f211840004011030004 +:10d5200021184000c010030023104300c01802005f +:10d53000231862004809a22421106200100444aca0 +:10d5400000a0043c0800c28f2118400040110300d5 +:10d5500021184000c010030023104300c01802002f +:10d560002318620048098224211062001004448cb0 +:10d5700000a0033c0800c28f480965242118400020 +:10d580004011030021184000c01003002310430085 +:10d59000c0180200231062002110a2000c04428c6b +:10d5a000100082100000000000a0043c0800c28fa0 +:10d5b000211840004011030021184000c010030052 +:10d5c00023104300c0180200231862004809822477 +:10d5d0002110620001000324080043ac8a35400b8f +:10d5e0000000000000a0043c0800c28f2118400089 +:10d5f0004011030021184000c01003002310430015 +:10d60000c018020023186200480982242110620019 +:10d61000080040ac88bf033c6061628c01000424b8 +:10d620004408827c606162ac0100022421e8c003ee +:10d630000400be8f0800bd270800e00300000000c2 +:10d64000c0fdbd273c02bfaf3802beaf21f0a00332 +:10d650001800c0af125f400f000000001800c0affc +:10d660000e37400b0000000000a0043c1800c28fe1 +:10d67000211840004011030021184000c010030091 +:10d6800023104300c01802002318620048098224b6 +:10d69000211062000800428ccd0040100000000004 +:10d6a00000a0033c1800c28f4809642421184000e0 +:10d6b0004011030021184000c01003002310430054 +:10d6c000c018020023106200211082000c04428c5a +:10d6d0002c00c2af00a0043c1800c28f21184000eb +:10d6e0004011030021184000c01003002310430024 +:10d6f000c018020023186200480982242110620029 +:10d700001004438c2c00c28f2b10620012004010ba +:10d71000000000002c00c48f00a0053c1800c28f40 +:10d72000211840004011030021184000c0100300e0 +:10d7300023104300c0180200231862004809a224e5 +:10d74000211062001004428c231082002000c2af1e +:10d750000336400b000000001800c28f2118400063 +:10d760004011030021184000c010030023104300a3 +:10d77000c0180200231862000800632400a0023cc5 +:10d78000480942242110620004004224000442247b +:10d790002120400000a0053c1800c28f2118400045 +:10d7a0004011030021184000c01003002310430063 +:10d7b000c0180200231862004809a2242110620048 +:10d7c0001004428c232082002c00c58f1800c28fc9 +:10d7d000211840004011030021184000c010030030 +:10d7e00023104300c01802002318620008006324bd +:10d7f00000a0023c48094224211062000400422497 +:10d800002310a200211082002000c2af00a0043c1f +:10d810001800c28f21184000401103002118400059 +:10d82000c010030023104300c01802002318620038 +:10d8300048098224211062000000428c44004010fc +:10d840000000000000a0043c1800c28f2118400016 +:10d850004011030021184000c010030023104300b2 +:10d86000c0180200231862004809822421106200b7 +:10d87000080040ac00a0043c1800c28f21184000f2 +:10d880004011030021184000c01003002310430082 +:10d89000c018020023186200480982242110620087 +:10d8a0001004448c00a0033c1800c28f4809652472 +:10d8b000211840004011030021184000c01003004f +:10d8c00023104300c0180200231062002110a200a0 +:10d8d0000400468c1800c28f21184000401103003c +:10d8e00021184000c010030023104300c01802009c +:10d8f000231862000800632400a0023c4809422467 +:10d9000021106200040047241800c28f2118400033 +:10d910004011030021184000c010030023104300f1 +:10d92000c0180200231862000704632400a0023c10 +:10d930004809422421106200040042241000a2afd2 +:10d940002000c58ff95d400f000000001c00c2af31 +:10d950001c00c28f020003240a00431000000000d4 +:10d960000300432816006014000000000300032495 +:10d9700016004310000000000400032414004314a8 +:10d980000000000000a0043c1800c28f21184000d5 +:10d990004011030021184000c01003002310430071 +:10d9a000c018020023186200480982242110620076 +:10d9b00001000324080043ac7436400b0000000053 +:10d9c000000000007436400b000000000000000062 +:10d9d0001800c48fc732400f000000003000c2aff3 +:10d9e0003000c28f91004018000000002400c0af3a +:10d9f000d536400b000000001800c28f21184000ef +:10da00004011030021184000c01003002310430000 +:10da1000c0180200231862001806632400a0023c0c +:10da2000480942242120620000a0053c1800c28f52 +:10da3000211840004011030021184000c0100300cd +:10da400023104300c0180200231862004809a224d2 +:10da5000211062001806428c000045802400c38f0c +:10da60001800c6272118c3001c0065a0010042242d +:10da7000000082ac00a0043c1800c28f21184000b6 +:10da80004011030021184000c01003002310430080 +:10da9000c018020023186200480982242110620085 +:10daa0001806448c1800c28f211840004011030052 +:10dab00021184000c010030023104300c0180200ca +:10dac000231862000f06632400a0023c4809422488 +:10dad00021106200040042242b1044001a00401060 +:10dae000000000001800c28f211840004011030000 +:10daf00021184000c010030023104300c01802008a +:10db0000231862001004632400a0023c4809422448 +:10db1000211062000400442400a0053c1800c28fbc +:10db2000211840004011030021184000c0100300dc +:10db300023104300c0180200231862004809a224e1 +:10db400021106200180644ac2400c28f0100422458 +:10db50002400c2af2400c38f3000c28f2a1062009d +:10db6000a5ff40140000000000a0033c1800c28f75 +:10db70004809642421184000401103002118400086 +:10db8000c010030023104300c018020023106200dd +:10db9000211082001c06438c3000c28f23206200bb +:10dba00000a0033c1800c28f4809652421184000da +:10dbb0004011030021184000c0100300231043004f +:10dbc000c0180200231062002110a2001c0644ac01 +:10dbd0001800c28f15004014000000002800c0afdc +:10dbe0002800c0af0537400b000000002800c28f9e +:10dbf0001800c327211062001c0042802120400031 +:10dc0000f57b400f000000002800c28f0100422475 +:10dc10002800c2af2800c38f3000c28f2a106200d4 +:10dc2000f2ff401400000000000000001800c28f46 +:10dc3000010042241800c2af1800c28f8afe4018ab +:10dc4000000000000100022421e8c0033c02bf8f55 +:10dc50003802be8f4002bd270800e003000000002c +:10dc6000e0ffbd271c00bfaf1800beaf21f0a0032e +:10dc70002000c4af1000c0af2537400b00000000eb +:10dc80009035400f000000001000c28f01004224b8 +:10dc90001000c2af1000c38f2000c28f2b10620093 +:10dca000f7ff40140000000021e8c0031c00bf8ff4 +:10dcb0001800be8f2000bd270800e0030000000010 +:10dcc000e8ffbd271400bfaf1000beaf21f0a003d6 +:10dcd0001800c4af1800c28f0800401800000000f0 +:10dce000211000004f37400b000000009035400f1e +:10dcf000000000004037400b000000000000000062 +:10dd000000a0043c1800c28f2118400040110300fd +:10dd100021184000c010030023104300c018020067 +:10dd20002318620048098224211062000800428cf6 +:10dd3000eeff4014000000000100022421e8c003af +:10dd40001400bf8f1000be8f1800bd270800e0032d +:10dd500000000000e0ffbd271c00bfaf1800beaff1 +:10dd600021f0a0032000c4af2400c5af2400c28f5f +:10dd7000f08082af01000224fc8082af2400c28fb9 +:10dd8000ff0045302400c28f02120200ff00433022 +:10dd90002400c28f02140200ff0042302400c48f0e +:10dda000022604001000a4af029d043c28628424d3 +:10ddb000213060002138400038a4400f00000000ee +:10ddc000029d023c446244242000c58f38a4400fc9 +:10ddd0000000000021e8c0031c00bf8f1800be8fa8 +:10dde0002000bd270800e00300000000d0ffbd2791 +:10ddf0002c00bfaf2800beaf21f0a0032118800087 +:10de00002110a0003800c6af3000c3a33400c2a365 +:10de10003400c2930800432c9701601000000000fa +:10de200080180200019d023c3cde42242110620069 +:10de30000000428c080040000000000078e4009dd3 +:10de40005cde009d4cdf009d78e4009db8df009d06 +:10de500078e4009de0e1009d78e4009d3800c28fe9 +:10de60001000c2af1000c28f000042803100401489 +:10de700000000000408082833000c38308006214e9 +:10de80000000000040808283212040002128000003 +:10de9000722a400f000000001e39400b00000000f5 +:10dea000428082833000c3830800621400000000b7 +:10deb000428082832120400021280000722a400fe6 +:10dec000000000001e39400b0000000044808283e7 +:10ded0003000c38308006214000000004480828385 +:10dee0002120400021280000722a400f000000007d +:10def0001e39400b00000000468082833000c3833f +:10df000053016214000000004680828321204000fb +:10df100021280000722a400f00000000029d023cf0 +:10df20005862442427a4400f000000001e39400b13 +:10df300000000000029d023c7462442427a4400fac +:10df4000000000001e39400b000000003800c28fa6 +:10df50001400c2af1400c28f000042800c004010b9 +:10df6000000000003000c3831400c28f0000428014 +:10df7000029d043c806284242128600021304000fe +:10df800038a4400f000000001e39400b00000000c4 +:10df9000428082833000c38330016214000000009d +:10dfa00021200000010005241b93400f0000000009 +:10dfb0001e39400b000000003800c28f1800c2afad +:10dfc0001800c28f000042807d0040040000000065 +:10dfd000408082833000c38322006214000000006e +:10dfe00000a0023c701444242128000000040624f0 +:10dff00011a1400f000000001800c28f00004280f5 +:10e000003f8082a33f8082832120400000a0023c09 +:10e010007014452400040624213800008d2c400f84 +:10e0200000000000029d023ca46242242120400026 +:10e030005f0005240c3c400f00000000029d023ce4 +:10e040000463442427a4400f0000000001000424be +:10e05000010005241b93400f000000001e39400bf7 +:10e0600000000000428082833000c3831e006214df +:10e070000000000000a0023cac1c44242128000049 +:10e08000c800062411a1400f000000001800c28f34 +:10e0900000004280418082a3418082832120400091 +:10e0a00000a0023cac1c4524c80006242138000016 +:10e0b0008d2c400f00000000010004240100052405 +:10e0c0001b93400f00000000029d023c206342248d +:10e0d000212040000f000524ec3c400f0000000010 +:10e0e0001e39400b00000000448082833000c3834f +:10e0f000180062140000000000a0023c70104424cc +:10e10000212800000004062411a1400f0000000097 +:10e110001800c28f00004280438082a34380828324 +:10e120002120400000a0023c701045240004062479 +:10e13000213800008d2c400f00000000029d023ca1 +:10e140003063442427a4400f000000001e39400b18 +:10e1500000000000468082833000c383c200621446 +:10e160000000000000a0023c701844242128000098 +:10e170000004062411a1400f000000001800c28f07 +:10e1800000004280458082a3458082832120400098 +:10e1900000a0023c70184524000406242138000029 +:10e1a0008d2c400f00000000029d023c4c63442473 +:10e1b00027a4400f000000001e39400b00000000a3 +:10e1c0003000c283029d033c686364242128400020 +:10e1d00038a4400f000000001e39400b0000000072 +:10e1e0003800c28f1c00c2af1c00c28f0000428cde +:10e1f00051004010000000001c00c28f0400428447 +:10e200004d004018000000003f8082833000c3832f +:10e2100012006214000000003f8082832120400031 +:10e2200000a0023c7014452400040624213800009c +:10e230008d2c400f000000001c00c28f040042849f +:10e2400000a0033c70146424212840000d61400f9d +:10e2500000000000cb38400b0000000041808283aa +:10e260003000c3830b0062140000000041808283f1 +:10e270002120400000a0023cac1c4524c80006241c +:10e28000213800008d2c400f00000000cb38400bdf +:10e2900000000000438082833000c3830b006214bf +:10e2a00000000000438082832120400000a0023c47 +:10e2b0007010452400040624213800008d2c400fe6 +:10e2c00000000000cb38400b000000004580828336 +:10e2d0003000c38315006214000000004580828373 +:10e2e0002120400000a0023c7018452400040624b0 +:10e2f000213800008d2c400f00000000030040106a +:10e3000000000000010002242000c2a31c00c28ff4 +:10e310000000438c1c00c28f040042842120600056 +:10e3200021284000aa6c400f0000000000000000ff +:10e330001e39400b000000003f8082833000c38301 +:10e3400011006214000000003f8082832120400001 +:10e3500036a5400f00000000ffff02243f8082a38b +:10e36000029d023c8463442427a4400f0000000067 +:10e3700001000424212800001b93400f000000002e +:10e380001e39400b00000000418082833000c383af +:10e390000d006214000000004180828321204000b3 +:10e3a00036a5400f00000000ffff0224418082a339 +:10e3b00001000424212800001b93400f00000000ee +:10e3c0001e39400b00000000438082833000c3836d +:10e3d0000d00621400000000438082832120400071 +:10e3e00036a5400f00000000ffff0224438082a3f7 +:10e3f000029d023ca463442427a4400f00000000b7 +:10e400001e39400b00000000458082833000c3832a +:10e410001800621400000000458082832120400023 +:10e4200036a5400f00000000ffff0224458082a3b4 +:10e43000029d023cc063442427a4400f000000005a +:10e440006141400f000000001e39400b0000000039 +:10e45000000000001e39400b00000000000000001a +:10e460001e39400b00000000000000001e39400b68 +:10e47000000000000000000021e8c0032c00bf8f56 +:10e480002800be8f3000bd270800e0030000000018 +:10e49000f0ffbd270c00beaf21f0a0031000c4aff9 +:10e4a0001400c5af0000c2970500422c750040144f +:10e4b000000000000000c297ffff42241000c38f3d +:10e4c000211862001400c28f05004224000042900f +:10e4d0000f0042300a0042280a00401400000000e9 +:10e4e0001400c28f05004224000042900f00423009 +:10e4f000ff00423037004224ff0042304839400bd1 +:10e50000000000001400c28f050042240000429069 +:10e510000f004230ff00423030004224ff00423002 +:10e52000000062a00000c297feff42241000c38fcb +:10e53000211862001400c28f05004224000042909e +:10e5400002110200ff0042300f0042300a00422850 +:10e550000a004014000000001400c28f050042248d +:10e560000000429002110200ff00423037004224b6 +:10e57000ff0042306639400b000000001400c28fdb +:10e58000050042240000429002110200ff004230c8 +:10e5900030004224ff004230000062a00000c29719 +:10e5a000fcff42241000c38f211862001400c28fa8 +:10e5b00004004224000042900f0042300a0042282a +:10e5c0000a004014000000001400c28f040042241e +:10e5d000000042900f004230ff00423037004224da +:10e5e000ff0042308239400b000000001400c28f4f +:10e5f00004004224000042900f004230ff004230ed +:10e6000030004224ff004230000062a00000c297a8 +:10e61000fbff42241000c38f211862001400c28f38 +:10e62000040042240000429002110200ff00423028 +:10e630000f0042300a0042280a0040140000000087 +:10e640001400c28f04004224000042900211020014 +:10e65000ff00423037004224ff004230a039400b17 +:10e66000000000001400c28f040042240000429009 +:10e6700002110200ff00423030004224ff0042300d +:10e68000000062a021e8c0030c00be8f1000bd276f +:10e690000800e00300000000d0ffbd272c00bfaf42 +:10e6a0002800beaf2400b0af21f0a00321108000ed +:10e6b0003400c5af3000c2a33000c293320003243f +:10e6c0002e00431000000000330043285900601062 +:10e6d000000000000b000324300043100000000085 +:10e6e0002c00032456004314000000003400c28fa5 +:10e6f0001800c2af1800c28f00004390010002242e +:10e700000900621400000000029d023ce063442402 +:10e7100027a4400f0000000001000224088182a30a +:10e72000143a400b000000001800c28f0000429015 +:10e730004600401400000000029d023cf4634424a3 +:10e7400027a4400f00000000f88080af02000224e0 +:10e75000088182a3613b400f0000000021200000df +:10e76000212800001b93400f00000000ffff02243f +:10e77000748182af143a400b0000000001000224b3 +:10e78000f88082af00a0023c603e4424e92d400f97 +:10e7900000000000143a400b000000003400c28f5b +:10e7a0001c00c2af029d023c0864442427a4400f11 +:10e7b000000000001c00c28f63004290170040144c +:10e7c000000000001c00c28f218040001c00c28f8e +:10e7d000212040008e9d400f00000000ff004230cd +:10e7e000212840001c00c28f620042902118400086 +:10e7f0001c00c28f21004224ff0004241000a4af9b +:10e80000212000022130600021384000531f400fba +:10e8100000000000143a400b00000000029d023c82 +:10e820003064442427a4400f00000000143a400b39 +:10e830000000000000000000143a400b000000003f +:10e8400000000000143a400b00000000000000002f +:10e8500021e8c0032c00bf8f2800be8f2400b08f9a +:10e860003000bd270800e00300000000b0ffbd2716 +:10e870004c00bfaf4800beaf21f0a003008180afc5 +:10e8800005000424010005249876400f00000000d4 +:10e89000ffff0224748182af0565400f0000000075 +:10e8a00021184000010002244b0062140000000007 +:10e8b0004000c22721204000080005240c00062447 +:10e8c000b765400f0000000053004010000000003a +:10e8d0004000c2931800c2a34100c2931900c2a312 +:10e8e0004200c2931a00c2a34300c2931b00c2a3fa +:10e8f0004400c2931c00c2a34500c2931d00c2a3e2 +:10e900004600c2931e00c2a34700c2931f00c2a3c9 +:10e910001800c383ffff02240d00621400000000f2 +:10e920001900c383ffff02240900621400000000e5 +:10e930001a00c383ffff02240500621400000000d8 +:10e940001b00c383ffff02241100621000000000bf +:10e950001c00c383ffff02242f006214000000008c +:10e960001d00c383ffff02242b006214000000007f +:10e970001e00c383ffff0224270062140000000072 +:10e980001f00c383ffff0224230062140000000065 +:10e99000c0ff02241800c2a3a8ff02241900c2a3ca +:10e9a0001e0002241a00c2a37f0002241b00c2a37f +:10e9b000c0ff02241c00c2a3a8ff02241d00c2a3a2 +:10e9c0001e0002241e00c2a3010002241f00c2a3d5 +:10e9d000863a400b00000000c0ff02241800c2a3ca +:10e9e000a8ff02241900c2a31e0002241a00c2a319 +:10e9f0007f0002241b00c2a3c0ff02241c00c2a38c +:10ea0000a8ff02241d00c2a31e0002241e00c2a3f0 +:10ea1000010002241f00c2a300a0023c981c442451 +:10ea2000212800001400062411a1400f000000005e +:10ea30001b00c28300160200211840001a00c28386 +:10ea40000014020021204000ff00023c241082003c +:10ea5000251862001900c28300120200ffff423035 +:10ea6000251862001800c283ff004230251862009a +:10ea700000a0023c981c43ac00a0023c981c42241d +:10ea80000808033c08086334080043ac1f00c28335 +:10ea900000160200211840001e00c283001402006c +:10eaa00021204000ff00023c241082002518620053 +:10eab0001d00c28300120200ffff423025186200d1 +:10eac0001c00c283ff0042302518620000a0023cf7 +:10ead000981c4224040043ac00a0023c981c422431 +:10eae000ff00033cffff63340c0043ac2400c2274b +:10eaf00021204000212800001800062411a1400f09 +:10eb000000000000019d023c98e642242400c2afb0 +:10eb10002400c227212040005f19400f00000000a0 +:10eb20002000c2a32000c2830700401000000000a4 +:10eb3000048180af03000224088182a32110000019 +:10eb4000363b400b0000000001000224048182af2c +:10eb500002000224088182a3fc28400f000000006c +:10eb6000019d023cecdd4424019d023c54dd452422 +:10eb70002f29400f000000007881842770818527ad +:10eb8000f422400f000000007081829304004014c2 +:10eb900000000000388084271320400f0000000090 +:10eba000388084270f23400f0000000000a0023ca3 +:10ebb000503e422421204000388085272439400fd0 +:10ebc0000000000000a0023c083e44243880852755 +:10ebd0002439400f00000000ff0002241000a2af03 +:10ebe000029d023c4c6444241100052402000624ca +:10ebf000029d023c60644724531f400f0000000048 +:10ec00000500401000000000029d023c6c6444249a +:10ec100038a4400f000000003c00c2272120400023 +:10ec2000fb92400f0000000021200000010005249d +:10ec30000593400f0000000001000424010005249a +:10ec40000593400f00000000020004240100052489 +:10ec50000593400f00000000030004242128000059 +:10ec60000593400f00000000040004242128000048 +:10ec70000593400f00000000212000002128000023 +:10ec80001b93400f00000000010004242128000015 +:10ec90001b93400f00000000020004242128000004 +:10eca0001b93400f000000000300042421280000f3 +:10ecb0001b93400f000000000400042421280000e2 +:10ecc0001b93400f000000000500042410270524ba +:10ecd0009876400f0000000021e8c0034c00bf8f71 +:10ece0004800be8f5000bd270800e0030000000070 +:10ecf000e0ffbd271c00bfaf1800beaf21f0a0038e +:10ed0000613b400f000000001829400f0000000088 +:10ed10000020400f000000001000c227212040000a +:10ed20007619400f0000000088bf033c2061628c10 +:10ed30008410027c206162ac88bf033c2061628c3d +:10ed40000421027c206162ac048180aff88080af36 +:10ed500088bf033c2061628c010004248431827ce2 +:10ed6000206162ac088180a30100022421e8c00375 +:10ed70001c00bf8f1800be8f2000bd270800e003d5 +:10ed800000000000e8ffbd271400bfaf1000beafb9 +:10ed900021f0a003008180af4080828321204000c9 +:10eda00036a5400f000000003f808383ffff022450 +:10edb00005006210000000003f8082832120400097 +:10edc00036a5400f000000004480828321204000cf +:10edd00036a5400f0000000043808383ffff02241c +:10ede0000500621000000000438082832120400063 +:10edf00036a5400f000000004280828321204000a1 +:10ee000036a5400f0000000041808383ffff0224ed +:10ee10000500621000000000418082832120400034 +:10ee200036a5400f0000000046808283212040006c +:10ee300036a5400f0000000045808383ffff0224b9 +:10ee40000500621000000000458082832120400000 +:10ee500036a5400f0000000021e8c0031400bf8f5a +:10ee60001000be8f1800bd270800e003000000005e +:10ee7000f8ffbd270400beaf21f0a0030881828304 +:10ee800021e8c0030400be8f0800bd270800e0038e +:10ee900000000000e0ffbd271c00bfaf1800beafa0 +:10eea00021f0a0030481828f2b004010000000009d +:10eeb000088183830200022417006214000000000e +:10eec000f880828f14004014000000000500042424 +:10eed000ab75400f000000000f0040100000000064 +:10eee000ff0002241000a2af029d023c4c644424a7 +:10eef0001100052402000624029d023c60644724a0 +:10ef0000531f400f000000000500042410270524b3 +:10ef10009876400f00000000de19400f000000004e +:10ef2000f880828f0d004010000000000081828f69 +:10ef30000a00401400000000dd3b400f000000000c +:10ef4000bd3c400f0000000001000224008182afa0 +:10ef5000d73b400b000000000000000021e8c00388 +:10ef60001c00bf8f1800be8f2000bd270800e003e3 +:10ef700000000000d0ffbd272c00bfaf2800beafaf +:10ef800021f0a00302000424010005242130000028 +:10ef90005329400f00000000408082a35500022446 +:10efa0001000c2a7408082831a00400400000000c5 +:10efb000020002241400c2a71000c297001202002f +:10efc000201e027c1000c29702120200ffff423096 +:10efd0002016027c251062002016027cffff4230c2 +:10efe0001600c2a71800c0af4080828321184000dd +:10eff0001400c227212060002128400010000624b0 +:10f00000232a400f0000000001000224063c400bb0 +:10f01000000000002110000021e8c0032c00bf8f79 +:10f020002800be8f3000bd270800e003000000006c +:10f03000e8ffbd271400bfaf1000beaf21f0a00352 +:10f040001800c4af1c00c5af3f808383ffff0224bc +:10f0500013006210000000003f80828321184000ee +:10f060001c00c28fffff4230212060001800c58fb6 +:10f070002130400021380000a42b400f0000000088 +:10f080003f8082832120400000a0023c7014452470 +:10f0900000040624213800008d2c400f00000000e1 +:10f0a00021e8c0031400bf8f1000be8f1800bd27d9 +:10f0b0000800e00300000000e8ffbd271400bfaf18 +:10f0c0001000beaf21f0a003211080001800c2a3e1 +:10f0d0003f808383ffff02241000621000000000c5 +:10f0e0003f808283212040001800c52701000624ac +:10f0f00021380000a42b400f000000003f808283d5 +:10f100002120400000a0023c701445240004062485 +:10f11000213800008d2c400f0000000021e8c003c2 +:10f120001400bf8f1000be8f1800bd270800e00339 +:10f1300000000000d0ffbd272c00bfaf2800beafed +:10f1400021f0a00302000424010005242130000066 +:10f150005329400f00000000448082a3560002247f +:10f160001000c2a7448082831a00400400000000ff +:10f17000020002241400c2a71000c297001202006d +:10f18000201e027c1000c29702120200ffff4230d4 +:10f190002016027c251062002016027cffff423000 +:10f1a0001600c2a71800c0af448082832118400017 +:10f1b0001400c227212060002128400010000624ee +:10f1c000232a400f0000000001000224763c400b7f +:10f1d000000000002110000021e8c0032c00bf8fb8 +:10f1e0002800be8f3000bd270800e00300000000ab +:10f1f000e8ffbd271400bfaf1000beaf21f0a00391 +:10f200001800c4af1c00c5af43808383ffff0224f6 +:10f210001300621000000000438082832118400028 +:10f220001c00c28fffff4230212060001800c58ff4 +:10f230002130400021380000a42b400f00000000c6 +:10f24000438082832120400000a0023c70144524aa +:10f2500000040624213800008d2c400f000000001f +:10f2600021e8c0031400bf8f1000be8f1800bd2717 +:10f270000800e00300000000e8ffbd271400bfaf56 +:10f280001000beaf21f0a003211080001800c2a31f +:10f2900043808383ffff02241000621000000000ff +:10f2a00043808283212040001800c52701000624e6 +:10f2b00021380000a42b400f00000000438082830f +:10f2c0002120400000a0023c7014452400040624c4 +:10f2d000213800008d2c400f0000000021e8c00301 +:10f2e0001400bf8f1000be8f1800bd270800e00378 +:10f2f00000000000d0ffbd272c00bfaf2800beaf2c +:10f3000021f0a003020004240100052421300000a4 +:10f310005329400f00000000428082a357000224be +:10f320001000c2a7428082831a004004000000003f +:10f33000020002241400c2a71000c29700120200ab +:10f34000201e027c1000c29702120200ffff423012 +:10f350002016027c251062002016027cffff42303e +:10f360001600c2a71800c0af428082832118400057 +:10f370001400c2272120600021284000100006242c +:10f38000232a400f0000000001000224e63c400b4d +:10f39000000000002110000021e8c0032c00bf8ff6 +:10f3a0002800be8f3000bd270800e00300000000e9 +:10f3b000e8ffbd271400bfaf1000beaf21f0a003cf +:10f3c0001800c4af1c00c5af4180828321184000e3 +:10f3d0001c00c28fffff4230212060001800c58f43 +:10f3e0002130400021380000a42b400f0000000015 +:10f3f000418082832120400000a0023cac1c4524b7 +:10f40000c8000624213800008d2c400f00000000a9 +:10f4100021e8c0031400bf8f1000be8f1800bd2765 +:10f420000800e00300000000e8ffbd271400bfafa4 +:10f430001000beaf21f0a003211080001800c2a36d +:10f4400041808383ffff022410006210000000004f +:10f4500041808283212040001800c5270100062436 +:10f4600021380000a42b400f00000000418082835f +:10f470002120400000a0023cac1c4524c80006240a +:10f48000213800008d2c400f0000000021e8c0034f +:10f490001400bf8f1000be8f1800bd270800e003c6 +:10f4a00000000000f8ffbd270400beaf21f0a0035c +:10f4b00041808383ffff02240400621400000000e7 +:10f4c00021100000343d400b000000000100022428 +:10f4d00021e8c0030400be8f0800bd270800e00338 +:10f4e00000000000d0ffbd272c00bfaf2800beaf3a +:10f4f00021f0a003020004240100052421300000b3 +:10f500005329400f00000000468082a363000224bc +:10f510001000c2a7468082831a0040040000000049 +:10f52000020002241400c2a71000c29700120200b9 +:10f53000201e027c1000c29702120200ffff423020 +:10f540002016027c251062002016027cffff42304c +:10f550001600c2a71800c0af468082832118400061 +:10f560001400c2272120600021284000100006243a +:10f57000232a400f0000000001000224623d400bde +:10f58000000000002110000021e8c0032c00bf8f04 +:10f590002800be8f3000bd270800e00300000000f7 +:10f5a000e8ffbd271400bfaf1000beaf21f0a003dd +:10f5b000468082832120400036a5400f00000000d5 +:10f5c000ffff0224468082a345808383ffff02243d +:10f5d0000700621000000000458082832120400067 +:10f5e00036a5400f00000000ffff0224458082a3e3 +:10f5f00021e8c0031400bf8f1000be8f1800bd2784 +:10f600000800e00300000000e8ffbd271400bfafc2 +:10f610001000beaf21f0a0031800c4af1c00c5af9e +:10f6200045808283211840001c00c28fffff4230ba +:10f63000212060001800c58f2130400021380000d3 +:10f64000a42b400f00000000458082832120400051 +:10f6500000a0023cac1c4524c80006242138000050 +:10f660008d2c400f0000000021e8c0031400bf8f64 +:10f670001000be8f1800bd270800e0030000000046 +:10f68000e8ffbd271400bfaf1000beaf21f0a003fc +:10f69000211080001800c2a345808383ffff02244d +:10f6a000100062100000000045808283212040008d +:10f6b0001800c5270100062421380000a42b400fa4 +:10f6c00000000000458082832120400000a0023c11 +:10f6d000ac1c4524c8000624213800008d2c400fa6 +:10f6e0000000000021e8c0031400bf8f1000be8f8f +:10f6f0001800bd270800e00300000000f8ffbd2748 +:10f700000400beaf21f0a00345808383ffff0224e5 +:10f71000040062140000000021100000ca3d400bec +:10f72000000000000100022421e8c0030400be8f95 +:10f730000800bd270800e00300000000e8ffbd2727 +:10f740001400bfaf1000beaf21f0a0034a6b400f02 +:10f75000000000003a41400f000000009a42400fb4 +:10f760000000000021200000212800006496400fc6 +:10f77000000000000100022421e8c0031400bf8f34 +:10f780001000be8f1800bd270800e0030000000035 +:10f79000e8ffbd271400bfaf1000beaf21f0a003eb +:10f7a0002120000021280000b53e400f000000008d +:10f7b00021e8c0031400bf8f1000be8f1800bd27c2 +:10f7c0000800e00300000000e0ffbd271c00bfaf01 +:10f7d0001800beaf21f0a003211080002400c5afa7 +:10f7e0002000c2a3516d400f000000001000c2af06 +:10f7f0002400c28f0b00401400000000029d023c58 +:10f800009804442427a4400f0000000001000424b1 +:10f8100007000524b53e400f00000000953e400b58 +:10f82000000000002000c2831b00432c85006010f4 +:10f830000000000080180200019d023c50f84224a4 +:10f84000211062000000428c08004000000000000f +:10f8500050fa009d50fa009dbcf8009d50fa009da2 +:10f86000f0f8009d50fa009d50fa009d18f9009d97 +:10f8700050fa009d40f9009d50fa009d50fa009dfd +:10f880006cf9009d50fa009d84f9009d50fa009d8e +:10f89000acf9009d50fa009dd4f9009d50fa009dee +:10f8a00050fa009d50fa009d50fa009d50fa009dbc +:10f8b000f4f9009d50fa009d1cfa009d029d023c47 +:10f8c000c804442427a4400f000000001000c28f89 +:10f8d00001000324000043a00300042401000524c8 +:10f8e000de6c400f00000000953e400b0000000061 +:10f8f000029d023ce804442427a4400f00000000bd +:10f900000100042402000524b53e400f0000000061 +:10f91000953e400b00000000029d023c140544246b +:10f9200027a4400f00000000010004240300052468 +:10f93000b53e400f00000000953e400b0000000067 +:10f94000029d023c3405442427a4400f000000001f +:10f95000dc81828f2014027c212040002a6e400f1f +:10f9600000000000953e400b000000000100042450 +:10f9700004000524b53e400f00000000953e400bfa +:10f9800000000000029d023c5405442427a4400fbf +:10f99000000000000100042405000524b53e400fce +:10f9a00000000000953e400b00000000029d023c5c +:10f9b0007805442427a4400f00000000010004241f +:10f9c00006000524b53e400f00000000953e400ba8 +:10f9d00000000000029d023c9c05442427a4400f27 +:10f9e000000000000100042401000524b53e400f82 +:10f9f00000000000029d023cc005442427a4400fe3 +:10fa0000000000000100042408000524b53e400f5a +:10fa100000000000953e400b00000000029d023ceb +:10fa2000c005442427a4400f000000000100042466 +:10fa300009000524b53e400f00000000953e400b34 +:10fa40000000000000000000953e400b0000000098 +:10fa50000000000021e8c0031c00bf8f1800be8f0b +:10fa60002000bd270800e00300000000e8ffbd27dc +:10fa70001400bfaf1000beaf21f0a0032110800022 +:10fa80001c00c5af2000c6af1800c2a31800c28377 +:10fa9000029d033cf0056424212840001c00c68f11 +:10faa0002000c78f38a4400f00000000010004248c +:10fab00007000524b53e400f0000000021e8c00308 +:10fac0001400bf8f1000be8f1800bd270800e00390 +:10fad00000000000b8ffbd274400bfaf4000beaf2c +:10fae00021f0a0034800c4af4c00c5afdc81828f79 +:10faf0000600432c7602601000000000801802000f +:10fb0000019d023c18fb4224211062000000428c3f +:10fb1000080040000000000030fb009d94fb009da9 +:10fb2000e8fe009d6800019d7c03019d0404019d89 +:10fb30004800c28f010003240800431000000000a9 +:10fb40000200032410004310000000005302401480 +:10fb500000000000e33e400b000000004c00c28f9c +:10fb6000070040140000000001000224dc8182af85 +:10fb7000029d023c4006442427a4400f00000000e0 +:10fb8000e33e400b00000000000000003441400b49 +:10fb9000000000004800c28f010003240800431049 +:10fba0000000000002000324cc004310000000000d +:10fbb0003d02401400000000b83f400b0000000070 +:10fbc0004c00c28f0a00422cbc0040100000000014 +:10fbd0004c00c28f80180200019d023cf0fb4224c1 +:10fbe000211062000000428c08004000000000006c +:10fbf000bcfe009da4fc009d18fc009d4cfc009ddb +:10fc0000bcfe009dbcfe009dc4fc009dbcfe009d92 +:10fc10006cfd009dacfd009dfa41400f000000000e +:10fc2000050004246c6d400f000000000200022457 +:10fc3000dc8182af029d023c7006442427a4400f61 +:10fc400000000000b53f400b00000000c481828f1f +:10fc5000060040140000000002000424956d400fcf +:10fc600000000000273f400b0000000001000424ba +:10fc7000956d400f000000000b0004246c6d400fd8 +:10fc80000000000003000224dc8182af029d023ce0 +:10fc9000a406442427a4400f00000000b53f400bf9 +:10fca00000000000029d023cd806442427a4400f17 +:10fcb000000000003a41400f00000000b53f400b3b +:10fcc000000000009a42400f000000002118400090 +:10fcd000010002241c006214000000001100042432 +:10fce0006c6d400f00000000029d023c040744249c +:10fcf00027a4400f00000000010002242000c2a33e +:10fd0000a8ff02242100c2a32000c2272120400016 +:10fd100002000524213000007a67400f0000000037 +:10fd2000640004244e77400f000000003c3b400f6d +:10fd300000000000640004244e77400f0000000023 +:10fd400065a2400f0000000011000424816d400fe7 +:10fd500000000000029d023c3007442427a4400f0d +:10fd600000000000b53f400b000000009a42400f29 +:10fd70000000000021184000010002240600621467 +:10fd800000000000010004245c6e400f0000000031 +:10fd9000693f400b00000000212000005c6e400f16 +:10fda00000000000b53f400b000000002400c22707 +:10fdb00021204000ff0005241500062411a1400f5a +:10fdc000000000009a42400f00000000211840008f +:10fdd0000100022404006210000000002400c0a3ff +:10fde000a83f400b00000000010002242400c2a331 +:10fdf0002400c2270100432400a0023cb005428c2d +:10fe00002120600021284000a143400f0000000095 +:10fe10002400c2270500432400a0023cb005422470 +:10fe20000400428c2120600021284000a143400fa3 +:10fe3000000000002400c2270900432400a0023c67 +:10fe4000b00542240800428c212060002128400097 +:10fe5000a143400f000000002400c2270d004324ee +:10fe600000a0023cb00542240c00428c212060001e +:10fe700021284000a143400f000000002400c227b9 +:10fe80001100432400a0023cb00542241000428c23 +:10fe90002120600021284000a143400f0000000005 +:10fea0002400c2272120400015000524756e400f54 +:10feb00000000000b53f400b000000004c00c28f66 +:10fec000ff00423021204000816d400f0000000003 +:10fed00000000000b83f400b0000000000000000e0 +:10fee0003441400b000000004800c28f0100032491 +:10fef0004300431000000000020003245700431099 +:10ff0000000000006b0140140000000021200000f0 +:10ff10006d41400f000000001000c2af1000c28f02 +:10ff200001000324120043100000000002004328d7 +:10ff300005006010000000000b00401000000000f1 +:10ff4000fe3f400b00000000020003241500431098 +:10ff500000000000030003241d0043100000000007 +:10ff6000fe3f400b00000000fe3f400b0000000081 +:10ff7000029d023c6c07442427a4400f00000000af +:10ff8000060004246c6d400f0000000001000224f4 +:10ff9000dc8182af01000224c48182affe3f400bae +:10ffa00000000000029d023cb007442427a4400f3b +:10ffb0000000000006000424816d400f00000000d6 +:10ffc00001000224dc8182affe3f400b00000000f4 +:10ffd000029d023cf407442427a4400f00000000c7 +:10ffe00006000424816d400f00000000010002247f +:10fff000dc8182af000000001840400b00000000d0 +:020000041d01dc +:100000004c00c38f010002240c00621400000000a9 +:10001000010004246d41400f00000000029d023cdd +:100020003808442427a4400f000000003a41400f44 +:10003000000000001540400b000000004c00c28f83 +:10004000ff00423021204000816d400f0000000081 +:10005000000000001840400b0000000000000000fd +:100060003441400b000000004800c28f010003240f +:100070003f0043100000000002000324bc004310b6 +:10008000000000000e0140140000000021200000cc +:100090000742400f000000001400c2af1400c28fde +:1000a0000100032412004310000000000200432856 +:1000b00005006010000000000b0040100000000070 +:1000c0005a40400b000000000200032418004310b7 +:1000d0000000000003000324220043100000000081 +:1000e0005a40400b000000005a40400b0000000046 +:1000f000ec81828f0100042421284000ed6d400f27 +:1001000000000000ec81828f029d033c680864249b +:100110002128400038a4400f00000000ec81828fad +:1001200001004224ec8182af5a40400b00000000e5 +:10013000ec81828f0500042421284000ed6d400fe2 +:10014000000000003a41400f00000000029d023c08 +:100150009c08442427a4400f000000005a40400b94 +:100160000000000000000000dd40400b0000000027 +:100170004c00c28f04000324110043100000000053 +:100180000500432806006010000000000100032461 +:100190006900431000000000d940400b000000003f +:1001a000050003244500431000000000070003245d +:1001b0003500431000000000d940400b0000000053 +:1001c0001800c0af1c00c0af1c00c0af00a0023cb4 +:1001d000802f44247343400f000000001800c2af7a +:1001e00000a0023c842f44247343400f0000000011 +:1001f0001c00c2af00a0023c802f42240800422411 +:10020000c08182afec81828f211840001800c28f1c +:100210001100621000000000ec81828f04000424b1 +:1002200021284000ed6d400f00000000ec81828f1e +:10023000029d033ce00864241800c58f2130400073 +:1002400038a4400f000000006343400f000000008e +:10025000a040400b000000001c00c28fb88182af9c +:10026000010004240742400f00000000029d023cf0 +:10027000400944241800c58f38a4400f0000000036 +:10028000da40400b00000000ec81828f0200042461 +:1002900021284000ed6d400f00000000ec81828fae +:1002a000029d033c880964242128400038a4400fa3 +:1002b00000000000da40400b00000000029d023cfc +:1002c000d409442427a4400f000000009a42400fa4 +:1002d0000000000021184000010002240a006214fe +:1002e0000000000001000224dc8182af0100042430 +:1002f000436e400f0000000001000224e88182af3d +:10030000cc40400b00000000029d023c1c0a44242b +:1003100027a4400f0000000002000424436e400f99 +:10032000000000003a41400f00000000e88180af6b +:10033000da40400b00000000029d023c5c0a4424ad +:1003400027a4400f00000000020004240742400fd1 +:10035000000000003a41400f00000000da40400b6e +:100360000000000000000000dd40400b0000000025 +:10037000000000003441400b000000004800c28f24 +:1003800001000324080043100000000002000324c1 +:1003900019004310000000004c0040140000000051 +:1003a000ff40400b000000004c00c38f01000224fe +:1003b0000900621400000000029d023cd80644249b +:1003c00027a4400f000000003a41400f0000000049 +:1003d000fc40400b000000004c00c28fff00423088 +:1003e00021204000816d400f00000000000000004f +:1003f000ff40400b00000000000000003441400bb3 +:10040000000000004800c28f0100032408004310d0 +:100410000000000002000324190043100000000047 +:100420001a004010000000003441400b00000000a2 +:100430004c00c38f01000224090062140000000078 +:10044000029d023cd806442427a4400f000000006f +:100450003a41400f000000001e41400b0000000028 +:100460004c00c28fff00423021204000816d400fc0 +:1004700000000000000000002441400b00000000cc +:10048000000000002441400b0000000000000000bc +:10049000000000003441400b00000000000000009c +:1004a0003441400b00000000000000003441400bcc +:1004b00000000000000000003441400b000000007c +:1004c000000000003441400b00000000000000006c +:1004d00021e8c0034400bf8f4000be8f4800bd2705 +:1004e0000800e00300000000e8ffbd271400bfafd4 +:1004f0001000beaf21f0a003dc8180afe08180afaf +:10050000ec8180afe88180afec8180afe88180af83 +:10051000b88180affa41400f000000006343400ff4 +:1005200000000000683d400f0000000021e8c0030b +:100530001400bf8f1000be8f1800bd270800e00315 +:1005400000000000e8ffbd271400bfaf1000beafe1 +:1005500021f0a003393d400f0000000001000424f9 +:1005600021280000b53e400f0000000021e8c00334 +:100570001400bf8f1000be8f1800bd270800e003d5 +:1005800000000000e8ffbd271400bfaf1000beafa1 +:1005900021f0a0033a41400f0000000021e8c00311 +:1005a0001400bf8f1000be8f1800bd270800e003a5 +:1005b00000000000e8ffbd271400bfaf1000beaf71 +:1005c00021f0a0031800c4af1800c38f010002245b +:1005d0000600621400000000fa41400f0000000015 +:1005e00003000224f441400b00000000d081828f00 +:1005f0000500432c75006010000000008018020008 +:10060000019d023c18064224211062000000428c29 +:1006100008004000000000002c06019d9806019d86 +:10062000bc07019da407019db007019dd481828f65 +:1006300021204000212800006166400f00000000da +:100640000c00401400000000d481828f029d033c06 +:10065000a00a64242128400038a4400f00000000b4 +:1006600004000224d08182af02000224f441400b36 +:1006700000000000e48180af090004241900052473 +:100680009876400f0000000001000224d08182af64 +:10069000f341400b0000000009000424ab75400f3b +:1006a00000000000211840000100022446006214ee +:1006b000000000005165400f0000000021004014c0 +:1006c00000000000d481838f1f00023c0e006214e2 +:1006d00000000000d481838fe481828f029d043c5e +:1006e000cc0a8424212860002130400038a4400f27 +:1006f0000000000003000224d08182af0100022428 +:10070000f441400b00000000d481838fe481828f8c +:10071000029d043c0c0b8424212860002130400001 +:1007200038a4400f00000000d481838f0100023cf8 +:1007300021106200d48182afd08180aff341400ba1 +:1007400000000000e481828f280042280c00401441 +:1007500000000000e481828f029d033c440b64246e +:100760002128400038a4400f0000000004000224ab +:10077000d08182af02000224f441400b000000004f +:1007800009000424190005249876400f0000000099 +:10079000e481828f01004224e48182aff341400b67 +:1007a0000000000001000224f441400b00000000a2 +:1007b00002000224f441400b000000000000000091 +:1007c000f341400b00000000000000002110000079 +:1007d00021e8c0031400bf8f1000be8f1800bd2792 +:1007e0000800e00300000000f8ffbd270400beafd2 +:1007f00021f0a003d08180af1800023cd48182afe9 +:10080000e48180afc48180af21e8c0030400be8fc3 +:100810000800bd270800e00300000000e0ffbd273e +:100820001c00bfaf1800beaf21f0a0032000c4af72 +:10083000c881828f0600432c7b00601000000000fe +:1008400080180200019d023c5c08422421106200d5 +:100850000000428c08004000000000007408019d68 +:10086000a808019dcc09019d000a019de809019d90 +:10087000f409019d2000c28f6400401000000000b8 +:100880002000c38f010002246300621400000000f6 +:1008900001000224c88182afbc8180af211000001a +:1008a0008c42400b00000000c081828f3c0040144d +:1008b000000000006343400f00000000020002241b +:1008c0008c42400b00000000cc81828f2120400030 +:1008d00001004224cc8182afc081828f000043801e +:1008e00001004224c08182af21286000010006245b +:1008f0002567400f000000000a00401400000000bf +:10090000029d023c900b442427a4400f00000000ed +:1009100005000224c88182af020002248c42400bf1 +:10092000000000001000c0af4d42400b000000006e +:10093000000000005165400f000000000600401458 +:1009400000000000bc81828f01004224bc8182af84 +:100950006942400b000000001000c28fc90042280d +:1009600001004238ff0042301000c38f01006324b1 +:100970001000c3afeeff401000000000029d023cdb +:10098000cc0b442427a4400f0000000005000224e3 +:10099000c88182af020002248c42400b000000009c +:1009a00000000000bc81838fb881828f2a10620012 +:1009b000c5ff40140000000002000224c88182af7d +:1009c000211000008c42400b000000002000c28f6c +:1009d0001400401400000000c88180af0100022410 +:1009e0008c42400b00000000010002248c42400bae +:1009f00000000000020002248c42400b00000000b6 +:100a0000000000008a42400b0000000000000000cf +:100a10008a42400b00000000000000008a42400ba8 +:100a200000000000000000008c42400b00000000ad +:100a300021e8c0031c00bf8f1800be8f2000bd2717 +:100a40000800e00300000000f8ffbd270400beaf6f +:100a500021f0a00321e8c0030400be8f0800bd27d9 +:100a60000800e00300000000f0fcbd270c03bfaf4e +:100a70000803beaf21f0a0031800023c1000c2af73 +:100a8000ffff02241400c2af029d023c180c442454 +:100a900027a4400f000000001000c28f4800c327a9 +:100aa000212060001800052421304000b765400f68 +:100ab000000000004800c227212040007343400f7f +:100ac000000000002000c2af4800c22704004224fa +:100ad000212040007343400f000000002400c2affb +:100ae0004800c22708004224212040007343400fe1 +:100af000000000002800c2af4800c2270c004224ba +:100b0000212040007343400f000000002c00c2afc2 +:100b10004800c22710004224212040007343400fa8 +:100b2000000000003000c2af4800c2271400422479 +:100b3000212040007343400f000000003400c2af8a +:100b400000a0023c2400c38fb00543ac00a0023ccf +:100b5000b00542242800c38f040043ac00a0023c2f +:100b6000b00542242c00c38f080043ac00a0023c17 +:100b7000b00542243000c38f0c0043ac00a0023cff +:100b8000b00542243400c38f100043ac2000c38f53 +:100b9000adba023cefbe4234040062100000000017 +:100ba000211000005d43400b000000002800c28fb0 +:100bb0000400401400000000211000005d43400bc1 +:100bc000000000001000c28f180042241000c2afc5 +:100bd0001800c0af3800c0af3043400b0000000029 +:100be0001000c28f4800c327212060000c0005249c +:100bf00021304000b765400f000000004800c227c8 +:100c0000212040007343400f000000003c00c2afb1 +:100c10004800c22704004224212040007343400fb3 +:100c2000000000004000c2af4800c2270800422474 +:100c3000212040007343400f000000004400c2af79 +:100c40001000c28f0c0042241000c2af3c00c38fc2 +:100c5000adde023cefbe4234040062100000000032 +:100c6000211000005d43400b000000004000c28fd7 +:100c70000400401400000000211000005d43400b00 +:100c8000000000001800c28f010042241800c2af0b +:100c90001800c38f2800c28f0500621400000000f6 +:100ca000010002243800c2af3343400b00000000b3 +:100cb0004000c28f1000c38f211062001000c2af2d +:100cc0003800c28fc6ff4010000000001800023c30 +:100cd000180042341000c2af1c00c0af4d43400b9f +:100ce000000000000403c3271000c28f1000c48f4f +:100cf000010084241000c4af2120600001000524fd +:100d000021304000b765400f000000000403c2839b +:100d1000ff0042301400c48f212840006496400f29 +:100d2000000000001400c2af1c00c28f010042246a +:100d30001c00c2af1c00c38f2c00c28f2b1062009e +:100d4000e8ff4014000000001400c28f27100200ca +:100d50001400c2af1400c38f3400c28f04006214a9 +:100d600000000000010002245d43400b0000000071 +:100d70002110000021e8c0030c03bf8f0803be8fc1 +:100d80001003bd270800e00300000000f8ffbd27a6 +:100d90000400beaf21f0a003c88180af1800023c60 +:100da000cc8182afd88180afbc8180afc08180af61 +:100db000bc8180af0100022421e8c0030400be8f83 +:100dc0000800bd270800e00300000000f0ffbd2779 +:100dd0000c00beaf21f0a0031000c4af1000c28f02 +:100de0000400401400000000211000009c43400b50 +:100df000000000001000c28f000042900000c2af4f +:100e00000000c28f001202000000c2af1000c28fab +:100e100001004224000042900000c38f21106200b4 +:100e20000000c2af0000c28f001202000000c2af7b +:100e30001000c28f02004224000042900000c38fc5 +:100e4000211062000000c2af0000c28f0012020039 +:100e50000000c2af1000c28f030042240000429085 +:100e60000000c38f211062000000c2af0000c28fdb +:100e700021e8c0030c00be8f1000bd270800e0036e +:100e800000000000f8ffbd270400beaf21f0a00362 +:100e90000800c4af0c00c5af0800c28f04004014a6 +:100ea0000000000021100000cc43400b00000000b7 +:100eb0000800c28f030042240c00c38fff00633080 +:100ec000000043a00c00c28f021202000c00c2af4f +:100ed0000800c28f020042240c00c38fff00633061 +:100ee000000043a00c00c28f021202000c00c2af2f +:100ef0000800c28f010042240c00c38fff00633042 +:100f0000000043a00c00c28f021202000c00c2af0e +:100f10000c00c28fff0043300800c28f000043a0c6 +:100f20000c00c28f021202000c00c2af01000224aa +:100f300021e8c0030400be8f0800bd270800e003bd +:100f400000000000d8ffbd272400bfaf2000beafc7 +:100f500021f0a0032800c4af1000c0a32800c28f56 +:100f60001400c2afdf43400b00000000000000008f +:100f7000df43400b0000000000000000a014042428 +:100f80001400c58f558b400f000000001400c28f65 +:100f900011004010000000001800c0af1800c22768 +:100fa000a014042421284000458b400f00000000bd +:100fb0001000c2a31000c283ecff40140000000028 +:100fc0001800c38f1400c28febff621400000000f2 +:100fd000f743400b0000000000000000211000005b +:100fe00021e8c0032400bf8f2000be8f2800bd274a +:100ff0000800e00300000000e0ffbd271c00bfafb9 +:101000001800beaf21f0a0031000c0af01000424ff +:101010001000c22721284000458b400f000000002f +:101020001000c28f020042300a0040100000000091 +:101030001000c38ffdff0224241062001000c2af15 +:101040001000c28f0100042421284000558b400f5e +:101050000000000021e8c0031c00bf8f1800be8ff5 +:101060002000bd270800e00300000000e8ffbd27c6 +:101070001400bfaf1000beaf21f0a003060004248f +:10108000db000524558b400f0000000007000424fe +:1010900006000524558b400f000000000a000424c0 +:1010a0004494400f00000000801404242128000014 +:1010b000558b400f000000008414042421280000f8 +:1010c000558b400f000000000a0004244494400f98 +:1010d000000000000600042421280000558b400f6a +:1010e000000000000700042421280000558b400f59 +:1010f0000000000021e8c0031400bf8f1000be8f65 +:101100001800bd270800e00300000000e0ffbd2735 +:101110001c00bfaf1800beaf21f0a0031400c0af89 +:101120001000c0a31400c227081404242128400082 +:10113000458b400f000000001000c2a31000c283c6 +:101140000400401000000000faff02248144400b1c +:10115000000000001400c28f000142341400c2af2e +:101160001400c28f0814042421284000558b400f1e +:10117000000000001000c2a31000c2830400401051 +:1011800000000000faff02248144400b0000000030 +:101190001400c227001a042421284000458b400f68 +:1011a000000000001000c2a31000c2830400401021 +:1011b00000000000faff02248144400b0000000000 +:1011c0001400c38f0100023c251062001400c2af5e +:1011d0001400c28f001a042421284000558b400fb0 +:1011e000000000001000c2a31000c28304004010e1 +:1011f00000000000faff02248144400b00000000c0 +:101200002110000021e8c0031c00bf8f1800be8f12 +:101210002000bd270800e00300000000e0ffbd271c +:101220001c00bfaf1800beaf21f0a0031400c0af78 +:101230000c00023c0c00443421280000558b400f68 +:10124000000000001000c2a38c100424212800001c +:10125000558b400f00000000ff0043301000c29388 +:1012600021106200ff0042301000c2a30200023cc5 +:10127000ac07443421280000558b400f00000000cb +:10128000ff0043301000c29321106200ff00423083 +:101290001000c2a31400c227181104242128400002 +:1012a000458b400f00000000ff0043301000c29348 +:1012b00021106200ff0042301000c2a31000c28360 +:1012c0000300401000000000faff02241000c2a337 +:1012d0001400c28f010042341400c2af1400c28f48 +:1012e0001811042421284000558b400f00000000f5 +:1012f000ff0043301000c29321106200ff00423013 +:101300001000c2a31500023c14004434010005245f +:10131000558b400f000000001000c2a31400c2272c +:101320000014042421284000458b400f00000000d9 +:10133000ff0043301000c29321106200ff004230d2 +:101340001000c2a31400c28f000442300f004010ee +:10135000000000001400c38ffffb02242410620071 +:101360001400c2af1400c28f0014042421284000ce +:10137000558b400f00000000ff0043301000c29367 +:1013800021106200ff0042301000c2a31400c28f7f +:10139000000442341400c2af1400c28f00140424ad +:1013a00021284000558b400f00000000ff00433013 +:1013b0001000c29321106200ff0042301000c2a34f +:1013c000010004244494400f000000001000c28378 +:1013d00021e8c0031c00bf8f1800be8f2000bd276e +:1013e0000800e00300000000e0ffbd271c00bfafc5 +:1013f0001800beaf21f0a003a880828f79004014ae +:101400000000000000100424a8808527458b400fb1 +:10141000000000000500401000000000a88080af20 +:10142000211000007a45400b00000000f413042452 +:101430001000c22721284000458b400f000000000b +:101440000500401000000000a88080af21100000bf +:101450007a45400b00000000a880838f1000023cfa +:10146000a00242340a006214000000001000c38f82 +:101470000100022441006210000000001000023c44 +:10148000a1024234a88082af5f45400b00000000fb +:10149000a880838f1000023cb00242341300621413 +:1014a000000000001000c38f03000224330062100c +:1014b000000000001000c38f040002240600621424 +:1014c000000000001000023cb1024234a88082af4c +:1014d0005f45400b000000001000023cb2024234a5 +:1014e000a88082af5f45400b00000000a880838f7a +:1014f0001000023cf00042342000621400000000a2 +:101500003b00043ca8808527458b400f000000006d +:101510000500401000000000a88080af21100000ee +:101520007a45400b00000000a880838f3000023c09 +:10153000d000423411006214000000001000c38f7c +:101540000600022406006214000000003000023c85 +:10155000d1004234a88082af5f45400b00000000fc +:101560001000c38f02000224040062140000000077 +:101570003000023cd2004234a88082afa880838f22 +:10158000f000023c241862003000023c0c0062149f +:1015900000000000a880838ff0ff023cffff423470 +:1015a00024106200a88082afa880838f0400023cd0 +:1015b00025106200a88082af7945400b0000000032 +:1015c000a880838ff0ff023cffff423424106200aa +:1015d000a88082afa880838f0500023c251062009e +:1015e000a88082afa880828f21e8c0031c00bf8f33 +:1015f0001800be8f2000bd270800e0030000000097 +:10160000e0ffbd271c00bfaf1800beaf21f0a00354 +:10161000f41304241000c22721284000458b400ffa +:101620000000000002004010000000001000c0afe9 +:101630001000c28f21e8c0031c00bf8f1800be8fae +:101640002000bd270800e00300000000e8ffbd27e0 +:101650001400bfaf1000beaf21f0a003fa44400f4a +:1016600000000000ff0f4230b002422c0600401480 +:1016700000000000481e042484b7023cce694534b3 +:10168000558b400f0000000021e8c0031400bf8ffd +:101690001000be8f1800bd270800e0030000000006 +:1016a000e0ffbd271c00bfaf1800beaf21f0a003b4 +:1016b00028140424378b400f000000001000c2af34 +:1016c0001000c38ffeff0224241062001000c2af7e +:1016d000281404241000c58f558b400f0000000013 +:1016e0001000c28f010042341000c2af281404243d +:1016f0001000c58f558b400f0000000021e8c0038b +:101700001c00bf8f1800be8f2000bd270800e0031b +:1017100000000000e0ffbd271c00bfaf1800beaff7 +:1017200021f0a0031c140424378b400f000000009c +:101730001000c2af1000c28f040042341000c2afcc +:101740001c1404241000c58f558b400f00000000ae +:10175000a845400f0000000021e8c0031c00bf8f17 +:101760001800be8f2000bd270800e0030000000025 +:10177000e0ffbd271c00bfaf1800beaf21f0a003e3 +:101780001000c0a3e445400b000000000000000072 +:101790001400c2271400042421284000458b400f68 +:1017a000000000001000c2a31000c28339004014e2 +:1017b000000000001400c28f01004230f3ff40140b +:1017c000000000001400c22701000424212840006a +:1017d000458b400f000000001000c2a31000c28320 +:1017e0002f004014000000001400c28f020042309d +:1017f0000e004010000000001400c38ffdff022403 +:10180000241062001400c2af1400c28f010004242f +:1018100021284000558b400f000000001000c2a39b +:101820001000c28321004014000000001400c227f1 +:101830000e00042421284000458b400f00000000ca +:101840001000c2a31000c2831b004014000000005f +:101850001400c28f01004230ff00423017004010d8 +:10186000000000001400c38ffeff02242410620059 +:101870001400c2af1400c28f0e00042421284000bf +:10188000558b400f000000001000c2a32f46400bf4 +:1018900000000000000000002f46400b0000000088 +:1018a000000000002f46400b000000000000000078 +:1018b0002f46400b00000000000000001000c28313 +:1018c00021e8c0031c00bf8f1800be8f2000bd2779 +:1018d0000800e00300000000d8ffbd272400bfafd0 +:1018e0002000beaf21f0a0031000c0a31800c0afbd +:1018f0001c00c0af1400c0af1c00c227130004249a +:1019000021284000458b400f000000001800c2272e +:101910000e00042421284000458b400f00000000e9 +:101920001000c2a31000c283440040140000000055 +:101930001800c28f010042300b004014000000006c +:101940001800c28f010042340e00042421284000f8 +:10195000558b400f000000001000c2a31000c2838e +:1019600039004014000000001800c22701000424c0 +:1019700021284000458b400f000000001000c2a34a +:101980001000c28333004014000000001800c28f12 +:10199000020042300e004014000000001800c28f08 +:1019a000020042340100042421284000558b400fde +:1019b000000000001000c2a31000c28328004014e1 +:1019c000000000007446400b000000000000000012 +:1019d0001c00c2271300042421284000458b400f1f +:1019e000000000001000c2a31000c2831f004014ba +:1019f000000000001c00c28f040042301e00401492 +:101a000000000000020004244494400f0000000085 +:101a10001400c28f010042241400c2af1400c28f10 +:101a20000500422ce9ff401400000000fcff0224e6 +:101a30001000c2a39f46400b000000000000000001 +:101a40009f46400b00000000000000009f46400b36 +:101a500000000000000000009f46400b0000000056 +:101a6000000000009f46400b000000000000000046 +:101a70009f46400b00000000000000001000c283e1 +:101a800021e8c0032400bf8f2000be8f2800bd279f +:101a90000800e00300000000e0ffbd271c00bfaf0e +:101aa0001800beaf21f0a0031000c0a31400c0af07 +:101ab0003646400f000000001000c2a31000c28391 +:101ac00004004010000000001000c2830547400bd6 +:101ad000000000000b47400f000000001400c22768 +:101ae0001811042421284000458b400f00000000fd +:101af0001000c2a31000c2830300401000000000c9 +:101b0000faff02241000c2a31400c28f0100423465 +:101b10001400c2af1400c28f181104242128400001 +:101b2000558b400f000000001000c2a31400c22714 +:101b30000014042421284000458b400f00000000c1 +:101b4000ff0043301000c29321106200ff004230ba +:101b50001000c2a31400c28f0004423019004010cc +:101b6000000000001400c38ffffb02242410620059 +:101b70001400c2af1400c28f0014042421284000b6 +:101b8000558b400f00000000ff0043301000c2934f +:101b900021106200ff0042301000c2a31400c227cf +:101ba0000014042421284000458b400f0000000051 +:101bb000ff0043301000c29321106200ff0042304a +:101bc0001000c2a30c00023c0c0044342128000089 +:101bd000558b400f000000008c10042421280000c9 +:101be000558b400f000000000200023cac0744345b +:101bf00021280000558b400f000000000814042429 +:101c00001111023c00104534558b400f00000000bc +:101c10001000c28321e8c0031c00bf8f1800be8fd4 +:101c20002000bd270800e00300000000e0ffbd2702 +:101c30001c00bfaf1800beaf21f0a0031000c0a36e +:101c40000014042421280000558b400f00000000e0 +:101c5000ff0043301000c29321106200ff004230a9 +:101c60001000c2a3320004244494400f000000007e +:101c70001000c28321e8c0031c00bf8f1800be8f74 +:101c80002000bd270800e00300000000d8ffbd27aa +:101c90002400bfaf2000beaf21f0a00321108000c0 +:101ca0002800c2a31000c0a31400c0af1800c0af2a +:101cb0001c00c0af1400c0af14100424378b400fb9 +:101cc000000000001400c2af1400c28f0e004104d7 +:101cd000000000000200023cbc074434378b400f78 +:101ce000000000001400c2af1400c28f0100423097 +:101cf0001400c2af1400c28f1b004010000000008f +:101d00005f47400b00000000010004244494400f92 +:101d1000000000002e47400b0000000001000424da +:101d20004494400f000000000c00023c0c004434be +:101d3000378b400f000000001400c2af1800c28fa4 +:101d4000010042241800c2af1800c28fd107422cf4 +:101d50000500401400000000fbff02241000c2a395 +:101d60008747400b000000001400c38fad10023cf9 +:101d70009ed04234e9ff6214000000002800c393a3 +:101d80000200022409006214000000000200023c6c +:101d9000ac0744341c3c023c7dd54534558b400f88 +:101da000000000007147400b000000002800c393b2 +:101db00003000224030062140000000080000224db +:101dc0001c00c2affa44400f00000000ff0f433078 +:101dd000a003022408006214000000001c00c28f4f +:101de0000200423421204000d143400f0000000097 +:101df0008147400b000000001c00c48fd143400ffe +:101e0000000000000c00023c0c00443452ef023c85 +:101e1000612f4534558b400f000000001000c28335 +:101e200021e8c0032400bf8f2000be8f2800bd27fb +:101e30000800e00300000000d0ffbd272c00bfaf6a +:101e40002800beaf21f0a003211080003000c2a303 +:101e50001000c0a31800c0af1400c0af8c10022443 +:101e60001c00c2af5302023c362642342000c2afef +:101e70003000c3930200022422006214000000001c +:101e80000200023cac0742341c00c2af1c3c023cc6 +:101e90007dd542342000c2afc247400b0000000095 +:101ea000020004244494400f000000001c00c38f73 +:101eb0001800c2272120600021284000458b400fd8 +:101ec0000000000004004010000000002000c28f4d +:101ed0000100422c1800c2af1400c28f010042243e +:101ee0001400c2af1400c28fd107422c0600401468 +:101ef00000000000fbff02241000c2a3cf47400bec +:101f000000000000000000002000c38f1800c28ff6 +:101f1000e3ff6214000000002000c38f5302023c64 +:101f20003626423405006214000000008c100424a0 +:101f300021280000558b400f000000001000c283d4 +:101f400021e8c0032c00bf8f2800be8f3000bd27c2 +:101f50000800e00300000000e0ffbd271c00bfaf49 +:101f60001800beaf21f0a0031400c0af0a00022485 +:101f70001100c2a31400c227001404242128400029 +:101f8000458b400f000000001000c2a31400c38f57 +:101f9000fffb0224241062001400c2af1400c28fa1 +:101fa0000014042421284000558b400f000000003d +:101fb0001000c2a31000c283040040100000000003 +:101fc0001000c2831748400b000000001400c22715 +:101fd0000014042421284000458b400f000000001d +:101fe0001000c2a31000c2830400401000000000d3 +:101ff0001000c2831748400b000000001400c28f7d +:102000000004423013004010000000001400c38f91 +:10201000fffb0224241062001400c2af1400c28f20 +:102020000014042421284000558b400f00000000bc +:102030001000c2a31100c293ffff42241100c2a3eb +:102040001100c293e1ff4014000000001648400b4d +:1020500000000000000000001000c28321e8c0035f +:102060001c00bf8f1800be8f2000bd270800e003b2 +:1020700000000000e0ffbd271c00bfaf1800beaf8e +:1020800021f0a003211880002110a0002000c3a38c +:102090002400c2a31400c2270200033c08016434d8 +:1020a00021284000458b400f000000001000c2a313 +:1020b0001000c2831c004014000000002400c293e2 +:1020c00009004010000000002000c293010003241a +:1020d000041843001400c28f251062001400c2af20 +:1020e0004148400b000000002000c293010003247f +:1020f00004104300271802001400c28f241062004d +:102100001400c2af1400c28f0200033c0801643403 +:1021100021284000558b400f000000001000c2a392 +:102120004b48400b00000000000000001000c2837c +:1021300021e8c0031c00bf8f1800be8f2000bd2700 +:102140000800e00300000000e0ffbd271c00bfaf57 +:102150001800beaf21f0a003211880002110a000bc +:102160002000c3a32400c2a31400c2270200033c22 +:102170000001643421284000458b400f000000001e +:102180001000c2a31000c2831c0040140000000015 +:102190002400c29309004010000000002000c293f8 +:1021a00001000324041843001400c28f25106200ac +:1021b0001400c2af7648400b000000002000c2931c +:1021c0000100032404104300271802001400c28fea +:1021d000241062001400c2af1400c28f0200033c3e +:1021e0000001643421284000558b400f000000009e +:1021f0001000c2a38048400b000000000000000057 +:102200001000c28321e8c0031c00bf8f1800be8fde +:102210002000bd270800e00300000000e0ffbd270c +:102220001c00bfaf1800beaf21f0a003211080003a +:102230002400c5af2000c2a31400c2270200033c43 +:102240000401643421284000458b400f0000000049 +:102250001000c2a31000c2830b0040140000000055 +:102260001400c38f2000c29306104300ff004230c9 +:1022700001004230ff0043302400c28f000043a021 +:10228000a348400b00000000000000001000c283c3 +:1022900021e8c0031c00bf8f1800be8f2000bd279f +:1022a0000800e00300000000e0ffbd271c00bfaff6 +:1022b0001800beaf21f0a0032000c4af2110a00081 +:1022c0002400c2a31400c2272c1404242128400097 +:1022d000458b400f000000001000c2a31000c28315 +:1022e00017004014000000002400c29308004010b2 +:1022f000000000002000c28f271802001400c28fc7 +:10230000241062001400c2afc848400b0000000057 +:102310001400c38f2000c28f251062001400c2afca +:102320001400c28f2c14042421284000558b400f28 +:10233000000000001000c2a3d148400b00000000c4 +:10234000000000001000c28321e8c0031c00bf8f02 +:102350001800be8f2000bd270800e0030000000029 +:10236000d0ffbd272c00bfaf2800beaf21f0a003d7 +:102370003000c4af3400c5af2000c0af2400c0aff0 +:102380001400c2279c14042421284000458b400fd0 +:10239000000000001000c2a31000c28338004014e7 +:1023a000000000001400c38f0300023c25186200e7 +:1023b0002000c227212060002128400008000624b8 +:1023c000798b400f000000001000c2a31000c283f0 +:1023d0002e004014000000002000c28f1400c2af85 +:1023e0001400c38fffff023c241062000800401459 +:1023f000000000003000c48f2128000006000624e1 +:1024000011a1400f000000002449400b0000000013 +:102410001400c28f021402001400c2af1400c38f54 +:102420000300023c251862001800c227212060002a +:102430002128400006000624798b400f0000000090 +:102440001000c2a31800c2273000c48f212840000a +:1024500006000624349d400f000000003400c28fa7 +:1024600004004010000000003400c28f010003246b +:10247000000043a01000c2832a49400b0000000066 +:10248000000000002449400b000000000000000094 +:102490003400c28f03004010000000003400c28fdf +:1024a000000040a01000c28321e8c0032c00bf8fb1 +:1024b0002800be8f3000bd270800e00300000000a8 +:1024c000d0ffbd272c00bfaf2800beaf21f0a00376 +:1024d0003000c4af2000c0af2400c0af1400c2273a +:1024e0009c14042421284000458b400f000000006c +:1024f0001000c2a31000c283250040140000000099 +:102500001400c38f0300023c251862002000c2277c +:10251000212060002128400008000624798b400f0c +:10252000000000001000c2a31000c2831b00401472 +:10253000000000002000c28f1400c2af1400c28f40 +:10254000ffff42301400c2af1400c38f0300023cef +:10255000251862001800c2272120600021284000b1 +:1025600006000624798b400f000000001000c2a373 +:102570001800c2273000c48f21284000060006241e +:10258000349d400f000000006849400b000000002f +:10259000000000006849400b00000000000000003f +:1025a0001000c28321e8c0032c00bf8f2800be8f1b +:1025b0003000bd270800e00300000000e0ffbd2759 +:1025c0001c00bfaf1800beaf21f0a0032000c4afb5 +:1025d0002110a0002400c2a788bf033c2061628ca8 +:1025e0000400027c206162ac1000c0af8b49400b3c +:1025f0000000000048818293aa00042421284000a2 +:10260000dca2400f00000000211840002000c28f13 +:10261000000043a02000c28f010042242000c2af6e +:102620001000c28f010042241000c2af2400c397e3 +:102630001000c28f2a104300eeff4014000000007b +:1026400088bf033c2061628c010004240400827c6a +:10265000206162ac2110000021e8c0031c00bf8f84 +:102660001800be8f2000bd270800e0030000000016 +:10267000e0ffbd271c00bfaf1800beaf21f0a003d4 +:102680002000c4af2110a0002400c2a788bf033cd3 +:102690002061628c0400027c206162ac1000c0af3b +:1026a000b849400b000000002000c28f000042909b +:1026b000211840002000c28f010042242000c2af38 +:1026c000488182932120600021284000dca2400f35 +:1026d000000000001000c28f010042241000c2afb1 +:1026e0002400c3971000c28f2a104300eeff40144d +:1026f0000000000088bf033c2061628c01000424bc +:102700000400827c206162ac2110000021e8c0033b +:102710001c00bf8f1800be8f2000bd270800e003fb +:1027200000000000f8ffbd270400beaf21f0a003a9 +:10273000211880002110a0000800c3a30c00c2a330 +:102740000800c293401802000c00c29326186200d1 +:10275000029d023c507d4224211062000000429004 +:1027600021e8c0030400be8f0800bd270800e00375 +:1027700000000000e8ffbd271400bfaf1000beaf8f +:1027800021f0a003211080001c00c5af2000c6afbf +:102790001800c2a3f249400b000000001800c393c8 +:1027a0001c00c28f000042901c00c48f01008424d2 +:1027b0001c00c4af2120600021284000c949400fff +:1027c000000000001800c2a32000c28f2b100200de +:1027d000ff0042302000c38fffff63242000c3afff +:1027e000eeff4014000000001800c29321e8c0036f +:1027f0001400bf8f1000be8f1800bd270800e00333 +:1028000000000000c8ffbd273400bfaf3000beafde +:102810002c00b0af21f0a003211880003c00c5af10 +:102820004000c6af4400c7af4800c28f3800c3a302 +:102830002000c2a3050002241000c2a33800c293e6 +:102840001400c2a33800c2933dff42240d00432c64 +:102850009c0060100000000080180200019d023cf6 +:1028600074284224211062000000428c08004000bd +:1028700000000000c429019de428019dc42a019d97 +:10288000c42a019d5c29019d5c29019d4c2a019d62 +:10289000a828019dc42a019dc42a019dc42a019d26 +:1028a000c42a019d3429019d3c00c28f02140200fc +:1028b000ff0042301500c2a33c00c28f021202008a +:1028c000ff0042301600c2a33c00c28fff0042301e +:1028d0001700c2a3050002241000c2a3b44a400b93 +:1028e000000000003c00c28f02120200ff004230d4 +:1028f0001500c2a32000c293060040100000000093 +:102900001500c39380ff022425106200ff004230af +:102910001500c2a33c00c28fff0042301600c2a3c4 +:102920001700c0a3050002241000c2a3b44a400b44 +:1029300000000000ffff02241500c2a3ffff0224d5 +:102940001600c2a3ffff02241700c2a30500022441 +:102950001000c2a3b44a400b000000003c00c28f2c +:1029600002140200ff0042301500c2a33c00c28fd7 +:1029700002120200ff0042301600c2a33c00c28fc8 +:10298000ff0042301700c2a34400c28f02140200ad +:10299000ff0042301800c2a34400c28f021202009e +:1029a000ff0042301900c2a34400c28fff00423032 +:1029b0001a00c2a3080002241000c2a3b44a400bac +:1029c000000000003c00c28f02120200ff004230f3 +:1029d0001500c2a32000c2930600401000000000b2 +:1029e0001500c39380ff022425106200ff004230cf +:1029f0001500c2a33c00c28fff0042301600c2a3e4 +:102a00004000c28f02160200ff0042301700c2a32e +:102a10004000c28f02140200ff0042301800c2a31f +:102a20004000c28f02120200ff0042301900c2a310 +:102a30004000c28fff0042301a00c2a308000224e7 +:102a40001000c2a3b44a400b000000003c00c28f3b +:102a500002140200ff0042301500c2a33c00c28fe6 +:102a600002120200ff0042301600c2a33c00c28fd7 +:102a7000ff0042301700c2a34000c28f02160200be +:102a8000ff0042301800c2a34000c28f02140200af +:102a9000ff0042301900c2a34000c28f02120200a0 +:102aa000ff0042301a00c2a34000c28fff00423034 +:102ab0001b00c2a3090002241000c2a3b44a400ba9 +:102ac00000000000ffff0224d74a400b0000000076 +:102ad000b080829312004014000000001000c293e6 +:102ae000ffff50241000c293ffff42241400c327ad +:102af0007f0004242128600021304000dd49400f80 +:102b00000000000040100200ff0043301000c22708 +:102b100021105000040043a0cb4a400b00000000ed +:102b20001000c293ffff42241000c2a31000c29302 +:102b30001400c32721206000212840009c49400f39 +:102b4000000000000400401000000000ffff02240d +:102b5000d74a400b000000002110000021e8c0030c +:102b60003400bf8f3000be8f2c00b08f3800bd27df +:102b70000800e00300000000e0ffbd271c00bfaf1d +:102b80001800beaf21f0a003211080002000c2a3d6 +:102b90002000c393cf0002240b0062140000000049 +:102ba0001100c22721204000010005246f49400f79 +:102bb000000000000400401000000000ffff02249d +:102bc0002e4b400b000000000a0002241000c2a39c +:102bd0001100c22721204000010005246f49400f49 +:102be000000000000400401000000000ffff02246d +:102bf0002e4b400b000000001100c2932000c39335 +:102c000009006210000000001000c2832a100200b8 +:102c1000ff0042301000c393ffff63241000c3a3e2 +:102c2000ebff4014000000001000c28304004104c8 +:102c300000000000ffff02242e4b400b00000000ac +:102c40000a0002241000c2a31100c2272120400064 +:102c5000010005246f49400f0000000004004010ef +:102c600000000000ffff02242e4b400b000000007c +:102c70001100c29309004010000000001000c28340 +:102c80002a100200ff0042301000c393ffff6324ac +:102c90001000c3a3ecff4014000000001000c2832a +:102ca0000400410400000000ffff02242e4b400bf3 +:102cb000000000002110000021e8c0031c00bf8fad +:102cc0001800be8f2000bd270800e00300000000b0 +:102cd000e0ffbd271c00bfaf1800beaf21f0a0036e +:102ce000010004244494400f000000001000a0af35 +:102cf000cf000424212800002130000021380000ea +:102d0000014a400f00000000cf000424de4a400fbb +:102d100000000000010004244494400f0000000063 +:102d200021e8c0031c00bf8f1800be8f2000bd2704 +:102d30000800e00300000000d8ffbd272400bfaf5b +:102d40002000beaf21f0a0032800c4af2118a000ce +:102d50002110c0002c00c3a73000c2a31600c0a3de +:102d60001200c0a72c00c2970120422c0500401081 +:102d7000000000002c00c2971400c2a7634b400b58 +:102d800000000000002002241400c2a70a00022450 +:102d90001000c2a71a00c22721204000010005240c +:102da0006f49400f000000000500401000000000c7 +:102db000ffff02241600c2a3804b400b000000005e +:102dc0001a00c293f0004330f00002240b0062109e +:102dd000000000001000c2872b100200ff004230ec +:102de0001000c397ffff63241000c3a7e9ff40143e +:102df00000000000804b400b0000000000000000bd +:102e00001600c383ffff022435006210000000009b +:102e10001000c2870500401c00000000ffff0224d4 +:102e20001600c2a3b94b400b000000001200c2877d +:102e30002800c38f211862001400c297212060006f +:102e4000212840006f49400f00000000050040109d +:102e500000000000ffff02241600c2a3b94b400b84 +:102e6000000000003000c2930f004014000000007a +:102e7000b08082930c004014000000001800c227ac +:102e800021204000020005246f49400f000000008f +:102e90000500401000000000ffff02241600c2a33e +:102ea000b94b400b000000001200c3971400c297fa +:102eb00021106200ffff42301200c2a71400c29727 +:102ec0002c00c397231062002c00c2a72c00c297cd +:102ed000a4ff401400000000b94b400b00000000ac +:102ee000000000001600c28321e8c0032400bf8f49 +:102ef0002000be8f2800bd270800e003000000006e +:102f0000d8ffbd272400bfaf2000beaf21f0a00333 +:102f10002800c4af2110a0002c00c2a71000c0a739 +:102f20001400c0a31800c0a72c00c2970120422c97 +:102f300005004010000000002c00c2971200c2a73c +:102f4000d44b400b00000000002002241200c2a756 +:102f5000f0ff02241600c2a31000c2870d00401427 +:102f6000000000002c00c2970120422c05004010f8 +:102f700000000000030002241500c2a3ef4b400b29 +:102f800000000000010002241500c2a3ef4b400b1b +:102f9000000000002c00c2970120422c05004010c8 +:102fa00000000000030002241500c2a3ef4b400bf9 +:102fb00000000000020002241500c2a31600c39303 +:102fc0001500c29325106200ff0042301600c2a314 +:102fd0001600c22721204000010005249c49400f13 +:102fe000000000000500401000000000ffff022468 +:102ff0001400c2a3274c400b000000001000c28741 +:103000002800c38f211862001200c297212060009f +:10301000212840009c49400f00000000050040109e +:1030200000000000ffff02241400c2a3274c400b45 +:1030300000000000b08082930c00401400000000eb +:103040001800c22721204000020005249c49400f9f +:10305000000000000500401000000000ffff0224f7 +:103060001400c2a3274c400b000000001000c397bf +:103070001200c29721106200ffff42301000c2a769 +:103080002c00c3971200c297231062002c00c2a725 +:103090002c00c297a4ff4014000000001400c2835b +:1030a00021e8c0032400bf8f2000be8f2800bd2769 +:1030b0000800e00300000000d8ffbd272400bfafd8 +:1030c0002000beaf21f0a0032800c4af2c00c5af84 +:1030d000c9ff02241800c2a31900c0a32800c28f90 +:1030e0003100422c0500401000000000c3ff022404 +:1030f0001800c2a3010002241900c2a31800c29341 +:103100001900c3931000a3af212040002800c58ff1 +:103110002c00c68f04000724014a400f0000000065 +:103120000400401000000000ffff0224574c400b39 +:10313000000000001800c29321204000de4a400f2a +:10314000000000000400401000000000ffff022407 +:10315000574c400b000000002110000021e8c00384 +:103160002400bf8f2000be8f2800bd270800e00389 +:1031700000000000d8ffbd272400bfaf2000beaf75 +:1031800021f0a0032800c4af2c00c5af2110c0005f +:103190003000c2a73000c2971000a0afc7000424bf +:1031a0002800c58f2130000021384000014a400f1f +:1031b000000000000400401000000000ffff022497 +:1031c000ab4c400b00000000c7000424de4a400f57 +:1031d000000000000400401000000000ffff022477 +:1031e000ab4c400b000000003000c2972c00c48f95 +:1031f00021284000c04b400f000000000400401098 +:1032000000000000ffff0224ab4c400b0000000058 +:10321000b0808293050040140000000002000224e8 +:103220001800c2a38d4c400b0000000003000224d4 +:103230001800c2a31800c2931c00c32721206000fd +:10324000212840006f49400f00000000040040109a +:1032500000000000ffff0224ab4c400b0000000008 +:103260001800c293ffff42241800c32721106200f8 +:103270000400429009004014000000001800c293ae +:10328000feff42241800c32721106200040043906f +:10329000c30002240400621000000000ffff0224ab +:1032a000ab4c400b000000002110000021e8c003df +:1032b0002400bf8f2000be8f2800bd270800e00338 +:1032c00000000000d8ffbd272400bfaf2000beaf24 +:1032d00021f0a0032800c4af2c00c5afcaff022410 +:1032e0001800c2a31900c0a32800c28f0001422cfd +:1032f0000500401000000000c4ff02241800c2a313 +:10330000010002241900c2a31800c2931900c3933c +:103310001000a3af212040002800c58f21300000fd +:1033200004000724014a400f000000000400401080 +:1033300000000000ffff0224f34c400b00000000df +:103340001800c29321204000de4a400f0000000018 +:103350000400401000000000ffff0224f34c400b6b +:10336000000000001900c2931c00c3272120600048 +:1033700004000524213040004e4b400f00000000a7 +:103380000400401000000000ffff0224f34c400b3b +:10339000000000001c00c293211840001d00c293d1 +:1033a00000120200251862001e00c29300140200e1 +:1033b000251862001f00c293001602002518620043 +:1033c0002c00c28f000043ac2110000021e8c00394 +:1033d0002400bf8f2000be8f2800bd270800e00317 +:1033e00000000000e0ffbd271c00bfaf1800beaf0b +:1033f00021f0a0032000c4af2400c5af2110c000fd +:103400002800c2a72800c2971000a0afc80004245b +:103410002000c58f2130000021384000014a400fb4 +:10342000000000000400401000000000ffff022424 +:10343000224d400b00000000c8000424de4a400f6b +:10344000000000000400401000000000ffff022404 +:10345000224d400b000000002800c2972400c48fba +:1034600021284000213000004e4b400f000000009a +:103470000400401000000000ffff0224224d400b1a +:10348000000000002110000021e8c0031c00bf8fd5 +:103490001800be8f2000bd270800e00300000000d8 +:1034a000e0ffbd271c00bfaf1800beaf21f0a00396 +:1034b00024e80434d64d400f000000001000c2afd5 +:1034c0001000c38f8fff0224241062001000c2afcf +:1034d0001000c28f500042341000c2af24e8043400 +:1034e0001000c58f0b4e400f0000000021e8c00304 +:1034f0001c00bf8f1800be8f2000bd270800e0030e +:1035000000000000e0ffbd271c00bfaf1800beafe9 +:1035100021f0a0031000a0afcf0004242128000058 +:103520002130000021380000014a400f0000000057 +:10353000cf000424de4a400f0000000021100000ec +:1035400021e8c0031c00bf8f1800be8f2000bd27dc +:103550000800e00300000000f8ffbd270400beaf34 +:1035600021f0a00321e8c0030400be8f0800bd279e +:103570000800e00300000000d0ffbd272c00bfaf13 +:103580002800beaf21f0a0032000c0afc404023c5d +:1035900000b442341000c2afe400023cc0e1423447 +:1035a0001400c2af1400c28f401002001000c38f7d +:1035b0001b006200f401400010180000121000000f +:1035c0001800c2af1400c28f401002001000c38f59 +:1035d0001b006200f40140001010000004004010c5 +:1035e000000000001800c28f010042241800c2af82 +:1035f0001800c28f0101422c03004014000000009b +:10360000000102241800c2af1800c28f040040104d +:10361000000000001800c28fffff42241800c2af54 +:103620001800c28fff004230488182a3b08080a37f +:103630002000c22724e8043421284000e74d400f31 +:10364000000000000d0040100000000001000224f6 +:10365000b08082a32000c22724e80434212840003f +:10366000e74d400f00000000040040100000000083 +:10367000faff0224c64d400b00000000b080829388 +:1036800018004014000000002000c38ff3ff022444 +:10369000241062002000c2af2000c38f8fff0224dd +:1036a000241062002000c2af2000c28f50004234bc +:1036b0002000c2af2000c28f24e80434212840003b +:1036c0000b4e400f000000000400401000000000fe +:1036d000faff0224c64d400b000000000100022446 +:1036e000b08082a31c00c2270010042421284000bf +:1036f000e74d400f000000000400401000000000f3 +:10370000faff0224c64d400b00000000284d400f78 +:10371000000000002110000021e8c0032c00bf8f32 +:103720002800be8f3000bd270800e0030000000025 +:10373000f8ffbd270400beaf21f0a003b08080a336 +:103740002110000021e8c0030400be8f0800bd273f +:103750000800e00300000000e0ffbd271c00bfaf31 +:103760001800beaf21f0a0032000c4af2000c48f1a +:103770001000c22721284000e74d400f0000000044 +:103780001000c28f21e8c0031c00bf8f1800be8f3d +:103790002000bd270800e00300000000e0ffbd2777 +:1037a0001c00bfaf1800beaf21f0a0032000c4afc3 +:1037b0002400c5af0a0002241000c2a3fc4d400b38 +:1037c000000000002000c48f2400c58fb14c400fc2 +:1037d0000000000004004014000000002110000060 +:1037e000054e400b00000000344b400f000000006d +:1037f0001000c2932b100200ff0042301000c39350 +:10380000ffff63241000c3a3eeff4014000000007c +:10381000faff022421e8c0031c00bf8f1800be8fee +:103820002000bd270800e00300000000e0ffbd27e6 +:103830001c00bfaf1800beaf21f0a0032000c4af32 +:103840002400c5af0a0002241000c2a3204e400b82 +:10385000000000002000c48f2400c58f2e4c400fb4 +:1038600000000000040040140000000021100000cf +:10387000294e400b00000000344b400f00000000b8 +:103880001000c2932b100200ff0042301000c393bf +:10389000ffff63241000c3a3eeff401400000000ec +:1038a000faff022421e8c0031c00bf8f1800be8f5e +:1038b0002000bd270800e00300000000d8ffbd275e +:1038c0002400bfaf2000beaf21f0a0032800c4af8a +:1038d0002c00c5af2110c0003000c2a70a0002248e +:1038e0001000c2a31800c0a31900c0a33000c397e2 +:1038f00001000224070062140000000002000224fc +:103900003000c2a71800c2271400c2af5d4e400ba2 +:10391000000000002c00c28f1400c2af5d4e400baf +:10392000000000003000c2972800c48f1400c58f2b +:1039300021304000f94c400f000000000b00401403 +:10394000000000001800c2271400c38f0400621496 +:10395000000000001800c3932c00c28f000043a099 +:1039600021100000664e400b00000000344b400f59 +:10397000000000001000c2932b100200ff00423034 +:103980001000c393ffff63241000c3a3e5ff40149e +:1039900000000000faff022421e8c0032400bf8fca +:1039a0002000be8f2800bd270800e00300000000b3 +:1039b000e0ffbd271c00bfaf1800beaf21f0a00381 +:1039c0002000c4af2400c5af2110c0002800c2a74a +:1039d0000a0002241000c2a32800c3970100022499 +:1039e0001400621400000000020002242800c2a794 +:1039f0008e4e400b000000002800c2972000c48fac +:103a00002400c58f213040005d4c400f00000000b5 +:103a1000040040140000000021100000974e400bed +:103a200000000000344b400f000000008e4e400ba1 +:103a300000000000000000001000c2932b100200e4 +:103a4000ff0042301000c393ffff63241000c3a3a4 +:103a5000e9ff401400000000faff022421e8c0033f +:103a60001c00bf8f1800be8f2000bd270800e00398 +:043a70000000000052 +:020000040000fa +:020000041d01dc +:103a740098ffbd27211000004800b2af4400b1af49 +:103a84004000b0af6400bfaf6000beaf5c00b7af32 +:103a94005800b6af5400b5af5000b4af4c00b3af4c +:103aa400219080002188a0007000a6af3000a2af52 +:103ab40021800000000024826b0080101000a4a369 +:103ac4002500022438028214010033260200242631 +:103ad400ffff82802d0006242118000030000824f6 +:103ae400200007242b0009242c024610ffff9124f8 +:103af4002e0045282202a010000000003302475087 +:103b0400010063342f02495002006334029d053cd6 +:103b14004c7ca5242120a20002006630feff653003 +:103b2400010084900b18a60008006630fbff653086 +:103b340004008430270280100b18a60021a0000086 +:103b440040201400c0a0140021a0940001003126dc +:103b540021a08202029d073c000022824c7ce724c3 +:103b64002120e2000100849004008430f4ff8014da +:103b7400d0ff94262e0004241c0244500100312658 +:103b840000106334219800001000072400800624ec +:103b9400ff0044307900852c1000a2a33f00a0143c +:103ba400010031261000b52701001624040060121c +:103bb4002b10d4022b1076020bb062022b10d4020d +:103bc4000200405021a0000023a096020800773094 +:103bd4001300e016ffff1324ff4e400bffff942653 +:103be400e89d400f2128400227100200010003260f +:103bf4000b806200ffff9426f9ff93162000042433 +:103c0400094f400bffff1324e89d400f2128400279 +:103c140027100200010003260100b5260b80620074 +:103c2400ffffd626f8ffd3560000a482a2ffe0527d +:103c340000002482154f400bffff1324e89d400f22 +:103c44002128400227100200010003260b80620095 +:103c5400ffff9426f9ff9316200004240000248219 +:103c640097ff80141000a4a36400bf8f21100002ea +:103c74006000be8f5c00b78f5800b68f5400b58fbc +:103c84005000b48f4c00b38f4800b28f4400b18f02 +:103c94004000b08f0800e0036800bd27019d023c8e +:103ca400bc3c422480200400212044000000828c7b +:103cb40008004000000000006c3c019da83b019df1 +:103cc400a83b019da83b019da83b019da83b019dec +:103cd400a83b019da83b019da83b019da83b019ddc +:103ce400a83b019da83b019da83b019da83b019dcc +:103cf400a83b019da83b019da83b019da83b019dbc +:103d0400a83b019da83b019da83b019da83b019dab +:103d1400a83b019da83b019da83b019da83b019d9b +:103d2400a83b019da83b019da83b019da83b019d8b +:103d3400a83b019da83b019da83b019da83b019d7b +:103d4400a83b019da83b019da83b019da83b019d6b +:103d5400a83b019da83b019da83b019da83b019d5b +:103d6400a83b019da83b019da83b019da83b019d4b +:103d7400a83b019da83b019da83b019da83b019d3b +:103d8400a83b019da83b019da83b019da83b019d2b +:103d9400a83b019da83b019da83b019da83b019d1b +:103da400a83b019da83b019da83b019da83b019d0b +:103db400a83b019da83b019da83b019da83b019dfb +:103dc400a83b019da83b019da83b019da83b019deb +:103dd400a83b019da83b019da83b019da83b019ddb +:103de400a83b019da83b019da83b019da83b019dcb +:103df400a83b019da83b019da83b019da83b019dbb +:103e0400a83b019da83b019da83b019da83b019daa +:103e1400a83b019da83b019d8440019da83b019db9 +:103e2400a83b019da83b019da83b019da83b019d8a +:103e3400a83b019da83b019da83b019da83b019d7a +:103e4400a83b019dd842019da43e019da83b019d34 +:103e5400d042019da83b019da83b019da43e019d2c +:103e6400a83b019da83b019d6843019da83b019d82 +:103e7400a83b019d6043019d8440019da83b019d99 +:103e8400a83b019d2043019da83b019da03e019daf +:103e9400a83b019da83b019d8840019dc00063345f +:103ea400000762307b00401021f060000010653094 +:103eb40006000424100062303b0240100b98850079 +:103ec4007000a28f07004424f8ff0224241082000b +:103ed4000000448c0400458c080042243c00a3af3d +:103ee4003a9a400f7000a2af3c00a38f21a8400073 +:103ef4002120a002212800008da1400f3c00a3af87 +:103f0400040041043c00a38f0080023c26a8550015 +:103f140003007e342120a002212800008da1400f3f +:103f24001800a0aff402401421b000001900622a66 +:103f34003e0040100a00c22aff0077326e00e22ed3 +:103f4400320240140b00e22eeb51033c1f85633414 +:103f54001900e302039d063c10180000e48cc624fb +:103f6400421903001200622480100200211046004e +:103f74000000448c039d023c2880458c3c00a3af88 +:103f8400399b400f3800a6af3c00a38f3800a68fa2 +:103f940080200300001903002118830080280300f7 +:103fa400212865002328e502cccc033ccdcc633426 +:103fb400ff00a5301900a3002120400010280000b4 +:103fc4003c00a3afc2100500090042248010020087 +:103fd40021104600399b400f0000458c3c00a38f04 +:103fe400212040001900e3023800a68f10180000b9 +:103ff400c218030040100300c0180300211043003e +:104004002310e202ff0042308010020021304600fb +:10401400399b400f0000c58c2120a0028a95400fd7 +:104024002128400021a840000a00c22a11014010a2 +:10403400039d023c2120a0028da1400f21280000f5 +:10404400040140140000000046a2400f2120a002f9 +:10405400212040002128000079a0400f21b8400011 +:10406400212840008895400f2120a00221b0400063 +:1040740021a8e0021800a0af3351400b2118000022 +:1040840020006334800063340007623087ff4014eb +:1040940021f06000c0006230c80140142016037c87 +:1040a4002c03400410006230f80140107000a78f08 +:1040b4007000a58f0000a48c0400a524c31704007d +:1040c4007000a5af21a880000302400421f0400045 +:1040d40003006016c00077302598be020100732edd +:1040e40040000224c502e2124100e22a7c02401090 +:1040f400800002241600e0161000a28301000224ae +:104104004603c0131000a2a3029d043c907f8424a4 +:1041140002000724020002244a50400b1400082421 +:10412400213840000400858c2b30c5032c03c05477 +:104134001000a7a32603be500000858c0100422472 +:104144002014027cf6ff4814080084241000a2a363 +:104154002a2053005e0280102a2062022014137c5d +:104164001000a2a3050080120040643003006530f3 +:10417400ffff84260ba085000040643006008010f9 +:104184002a2054002a2074020200805021a000003a +:1041940023a093022a2054001602805004006230a7 +:1041a400231082022000a2af0400623014024010e7 +:1041b4002000a28f02006230d2024010010062305f +:1041c400010065302d0002242b0004240b2045003f +:1041d40021284002e89d400f3c00a3af27100200b5 +:1041e400010004263c00a38f0b8082002000a28fd4 +:1041f400c001401430000424080064303400a4af2b +:10420400ffff7326029d023cc0201300807f5624ca +:1042140021b0c4024010130040201e004100e52ad2 +:104224002000633080a013002800a4af219853001d +:104234002400a5afa750400b2c00a3af0e00e0163e +:104244001000a4830000c68e0400c78e2120a002a3 +:10425400818f400f2128c0032120400021286000c5 +:104264000a0006246a8e400f2138000030004224e0 +:104274002024027c1000a4a3e89d400f21284002c2 +:1042840027100200010003260b806200f8ffd626e7 +:10429400fcff9426fdff7326fdff0224c301621276 +:1042a40040000224b301e2122400a78fe3ffe014cc +:1042b400800002249d01e212c0000224e1ffe21208 +:1042c4001000a4839f50400b00000000a94f400b36 +:1042d400000463347000a78f100066300100e28090 +:1042e4000000e58c0400e4247601c0101000a2a3b1 +:1042f400750140501400a5a3ffff06247201465027 +:104304001400a5a31400a2a31500a5a3020016245b +:104314001400b527ec4e400b7000a4af7000a58fbd +:104324000000a48c0400a524a002801021a8800011 +:1043340000008280b20240507000a5af21b000009e +:104344000100d6262110960000004280fdff405453 +:104354000100d626ec4e400b7000a5afa94f400bd0 +:1043640040006334100062302120c0000a20e200c3 +:1043740025188300ffff6330e54e400b00002282c6 +:10438400e3fd4814029d053c0400633401008424c9 +:10439400ffff8280d6fd4614ffff9124080063349a +:1043a400e550400b01008424e89d400f2128400281 +:1043b400ffff0324bffd431021886002ae4e400b73 +:1043c40001001026e550400b01008424e550400b09 +:1043d400010084242a000424020144102e00042431 +:1043e400e7fd441421a000000100312600002282d0 +:1043f4002a000424e001441000406334029d053c7b +:104404004c7ca5242120a200010084900400843067 +:10441400dcfd80102198000040201300c098130098 +:10442400219893000100312621986202029d053ce7 +:10443400000022824c7ca5242120a200010084904b +:1044440004008430f4ff8014d0ff7326e44e400b44 +:104454001000072446a2400f2120a002fdfe4014b4 +:10446400212040000200c32afbfe60142128000022 +:10447400039d023c2c8042243000a48f8da1400f68 +:104484000000458cdf004004edffc326eeffc32689 +:104494001800a3af2024037ce094400f3c00a3af9a +:1044a400212840002120a002ae99400f3000a2af85 +:1044b40046a2400f212040003c00a38f21b84000b9 +:1044c40021a8400021b00000010004240a00e22ecb +:1044d400490240141000a4a3029d043c907f84244c +:1044e4002110000002000524020007243f51400b64 +:1044f400120009242138a0000400868c7601c0141f +:10450400020048240000868c2b30e6027201c0149d +:10451400010042240100e524202c057cf5ff491408 +:10452400080084241000a5a31400082423b88302df +:1045340023b8f30223b8e802ffffe2260bb85300c6 +:104544000300c433ffffe3260400c23345014010d7 +:104554000bb864000200c233e60140100100c2330c +:104564000100c4332d0002242b0003240a1064002c +:1045740021204000e89d400f21284002271002001e +:10458400010003260b8062000a00e05a0800de33b3 +:1045940030000424e89d400f212840022710020027 +:1045a40001000326fffff726f9ffe0160b806200e7 +:1045b4000800de332000beaf029d043c8451400b52 +:1045c400807f9424c0180300211883020000668ca5 +:1045d4000400678c2120a002818f400f2128000055 +:1045e40021204000212860000a0006246a8e400f22 +:1045f4002138000030004424e89d400f2128400267 +:1046040027100200010003260b8062001000a28321 +:10461400ffff4324201c037ceaff40141000a3a3e3 +:104624001800a28f0c0040181300622a30000424e2 +:10463400e89d400f212840021800a48f01000326a2 +:1046440027100200ffff84240b806200f7ff801c08 +:104654001800a4af1300622afc0040142014137c39 +:10466400120002241000a2a3eeff73262e000424dd +:10467400e89d400f21284002ffff0324020043105d +:104684001000b48301001026e094400f2120800222 +:1046940021204000399b400f2128c00246a2400f30 +:1046a4002120400021a84000ffff82262014027c24 +:1046b40021f00000230080121000a2a3029d053cfb +:1046c400807fb624c01002002110c2020000468c74 +:1046d4000400478c2120a002818f400f2128c003b1 +:1046e400212040000a000624213800006a8e400f71 +:1046f4002128600030004424e89d400f2128400216 +:104704001000b48327100200c01814002118c3023b +:104714000000668c0400678c2128c0030100032676 +:104724002120a0026a8e400f0b80620021a8400065 +:10473400ffff82262014027c21f06000e1ff801636 +:104744001000a2a30a0060122000a78f30000424e6 +:10475400e89d400f21284002271002000100032693 +:10476400ffff7326f9ff60160b8062002000a78ffd +:10477400d1fce05000002482cffce05a00002482e7 +:1047840020000424e89d400f212840022710020045 +:1047940001000326fffff726f9ffe0160b806200f5 +:1047a400af4e400b000024827000a48f0000958c53 +:1047b40004008424bd4f400b7000a4af5c0140048e +:1047c400100062303a0040107000a78f7000a58f6f +:1047d40021f000000000b58c0400a5243550400be6 +:1047e4007000a5af7000a48f7000a28f0100312665 +:1047f400040084240000548c00002282de4e400b0e +:104804007000a4af2651400b1800a3af5e014054c2 +:10481400039d023ccccc033ccdcc63341900e302b1 +:10482400039d063c10180000e48cc624c218030043 +:104834000900622480100200211046000000448c0c +:10484400039d023c2880458c3c00a3af399b400f5c +:104854003800a6af3c00a38f3800a68f4020030089 +:10486400c0180300211883002318e302ff006330fb +:1048740080180300213066000000c58c399b400f6e +:10488400212040000850400b2120a0020000e48cad +:104894000400e724c31704007000a7af21a8800018 +:1048a4000bfe410421f040003852400b23a80400c1 +:1048b40021f000000000f58c0400e7243550400b83 +:1048c4007000a7af1400a5a3010016241400b52797 +:1048d400ec4e400b7000a4af23a804002b2015005d +:1048e40023100200030063343550400b23f04400ce +:1048f4003000042421284002e89d400f3c00a3af6f +:104904002000a58f2710020001000426ffffa52424 +:104914002000a5af0b808200f5ffa0143c00a38ffc +:10492400080067308150400b3400a7af2c00a28fe1 +:104934001c004050029d053c029d043c587f83248a +:104944002800a78f27201400042087000610950252 +:10495400251082002000853206209e020b1085005f +:104964000f00423021106200000044809f50400b31 +:104974001000a4a32800a38f2710130004104300e1 +:1049840006207502252044002000633206107e02b2 +:104994000b20430007008430300084249f50400bd8 +:1049a4001000a4a35152400b6c7fa3243400a48fa5 +:1049b40041fc8050000024822000a58f3efca058ba +:1049c4000000248220000424e89d400f2128400296 +:1049d4002000a78f2710020001000326ffffe72411 +:1049e4002000a7aff7ffe0140b806200af4e400b2e +:1049f40000002482effd40142000a0af2000a28f0d +:104a04009c00401408006530080064303400a4aff2 +:104a140002006230930040100100623001006530f2 +:104a24002d0002242b0004240b20450021284002e1 +:104a3400e89d400f3c00a3af2710020001000426ac +:104a44000b8082008150400b3c00a38f1000a2a376 +:104a540006ff401423986202ffff0224d251400b48 +:104a64001000a2a30800c3330b0060142000a3affe +:104a74000a00e01a0200c23320000424e89d400f1b +:104a8400212840022710020001000326fffff72619 +:104a9400f9ffe0160b8062000200c233910040501f +:104aa4000100de330100c4332d0002242b00032453 +:104ab4000a10640021204000e89d400f2128400294 +:104ac40027100200010003266f51400b0b80620087 +:104ad4005a50400b0b9844004c51400b1000a5a3b6 +:104ae4002c00e212c000022484fde2121000a28312 +:104af4005650400b2a2053001800a52724a2400f2b +:104b04002120a0021800a28f6666043cffff422405 +:104b140040180200211062006766842418004400d3 +:104b2400c3170200102000008320040023b0820079 +:104b34000000c32affffc2260bb043002320160047 +:104b4400e094400f2024047c21204000399b400f36 +:104b54002128a0023000a2af039d023c2080458c96 +:104b64008da1400f3000a48f6a004104039d023cd4 +:104b7400cc4f400bffffd6267000a78f01003126d3 +:104b84000000f38c0400e72400002282e34e400b73 +:104b94007000a7af01000224a500c0131000a2a357 +:104ba400020002240200072400010424212800003a +:104bb400f552400b100008240031050000390400b0 +:104bc400253026012120e0002128c00021384000a2 +:104bd4002b30c5035efdc0541000a2a38200c51390 +:104be4002b30a4020100e2242014027cf2ff4814ba +:104bf400024f04005550400b1000a8a301000224ea +:104c04008100c0131000a2a30200082402000224a1 +:104c140040000424212800000f53400b15000724f2 +:104c2400c0300500c04004002530260121200001c9 +:104c34002128c000214040002b30c5036200c0542d +:104c44001000a8a35d00c5132b30a4020100422468 +:104c54002014027cf2ff4714424f04005550400bcd +:104c64001000a2a367fd4050ffff73268c52400b37 +:104c74002000042466ffa0143400a5af20000424ff +:104c840021284002e89d400f3c00a3af2000a78fdd +:104c94002710020001000426ffffe7242000a7af2d +:104ca4000b8082005affe0103c00a38f20000424f4 +:104cb40021284002e89d400f3c00a3af2000a78fad +:104cc4002710020001000426ffffe7242000a7affd +:104cd4000b808200e9ffe0143c00a38f8652400b56 +:104ce4000200623035fec053029d043caf52400bbb +:104cf4002000042424fe4010200004245e51400bb4 +:104d0400000000003afd40102000a28f7550400bb7 +:104d1400200004242480448c8da1400f3000a58ff2 +:104d2400010042280100c326cc4f400b0bb06200a7 +:104d34007000a28f07004424f8ff0224241082008c +:104d4400080044247000a4af0000558c3550400b7b +:104d540004005e8c7000a28f07004524f8ff022433 +:104d64002428a2000000a48c0400a28c0800a5241e +:104d74007000a5af21a88000d5fc410421f04000bb +:104d84003852400b23a80400e48c422480b8170056 +:104d940021b8e202039d023c0000e48e399b400fdf +:104da4002880458c0850400b2120a002029d153c10 +:104db400507fb526cd50400b2120a002a4ffc05047 +:104dc400010042241000a8a35550400b21100001fb +:104dd4002b28a502dafca050010042241000a7a34e +:104de4005550400b2110e0007fffc0500100e22429 +:104df4005550400b1000a2a34c51400b0100082455 +:104e0400ec4e400b21b000000800a22e7fff405062 +:104e1400020008245550400b010002240a00a22e6f +:104e2400bafc4010029d043c5550400b0100022482 +:104e34001000a22e5bff4050020002245550400b8c +:044e44000100022443 +:020000040000fa +:020000041d01dc +:104e4800e0ffbd271c00bfaf1800beaf21f0a003d4 +:104e58001000c0a300a0023c1c024224020040a093 +:104e6800fa44400f0000000021184000f0ff023c07 +:104e780000f04234241862003000023c080062143a +:104e880000000000a810042401000524558b400fe1 +:104e9800000000001000c2a3bf53400b0000000038 +:104ea8001400c2277010042421284000458b400fad +:104eb800000000001000c2a31000c2830c004014c0 +:104ec800000000001400c28f020042341400c2af78 +:104ed8001400c28f7010042421284000558b400f05 +:104ee800000000001000c2a3bf53400b00000000e8 +:104ef800000000001000c28321e8c0031c00bf8f1f +:104f08001800be8f2000bd270800e0030000000045 +:104f1800f8ffbd270400beaf21f0a00321188000d0 +:104f28002110a0001000c6af0800c3a30c00c2a740 +:104f380021e8c0030400be8f0800bd270800e00375 +:104f480000000000e0ffbd271c00bfaf1800beaf87 +:104f580021f0a0031000c0a300a0023c1c024224c0 +:104f680002004290ff0042300400401000000000a0 +:104f78001000c283ff53400b0000000000a0023c59 +:104f88001c02422401004290ff0042300c004014f1 +:104f98000000000000a0023c1c024290ff004230ca +:104fa80007004010000000003646400f00000000d7 +:104fb8001000c2a31000c2830c00401400000000bf +:104fc80000a0023c1c02422401004290ff00423033 +:104fd80001004224ff00433000a0023c1c0242248e +:104fe800010043a0fe53400b000000000000000039 +:104ff8001000c28321e8c0031c00bf8f1800be8fb9 +:105008002000bd270800e00300000000f8ffbd27ce +:105018000400beaf21f0a003211080000800c2a345 +:1050280000a0023c0800c3931c0243a021e8c0036f +:105038000400be8f0800bd270800e0030000000040 +:10504800f8ffbd270400beaf21f0a00300a0023c7a +:105058001c024290ff00423021e8c0030400be8fca +:105068000800bd270800e00300000000f8ffbd2786 +:105078000400beaf21f0a00300a0023c1c024224a1 +:1050880001004290ff0042300a004010000000007a +:1050980000a0023c1c02422401004290ff00423062 +:1050a800ffff4224ff00433000a0023c1c024224c0 +:1050b800010043a02110000021e8c0030400be8fb6 +:1050c8000800bd270800e00300000000e0ffbd273e +:1050d8001c00bfaf1800beaf21f0a0031000c0a392 +:1050e80000a0023c1c02422401004290ff00423012 +:1050f8000a0040100000000000a0023c1c024224ec +:1051080001004290ff004230ffff4224ff0043307d +:1051180000a0023c1c024224010043a000a0023c63 +:105128001c02422401004290ff0042300900401452 +:105138000000000000a0023c1c024290ff00423028 +:105148000400401000000000dc45400f0000000093 +:105158001000c2a31000c28321e8c0031c00bf8f47 +:105168001800be8f2000bd270800e00300000000e3 +:10517800e8ffbd271400bfaf1000beaf21f0a003a9 +:105188001800c4af00a0023c1c02442421280000df +:105198002400062411a1400f00000000030004248d +:1051a800019d023c184f45242d58400f0000000077 +:1051b8003554400f0000000021e8c0031400bf8fe1 +:1051c8001000be8f1800bd270800e0030000000093 +:1051d800e0ffbd271c00bfaf1800beaf21f0a00341 +:1051e8002000c4af1000c0a3d353400f000000003c +:1051f8001000c2a300a0023c1c0244242128000085 +:105208002400062411a1400f000000001000c283f2 +:1052180021e8c0031c00bf8f1800be8f2000bd27e7 +:105228000800e00300000000f0ffbd270c00beaf3f +:1052380021f0a003211080001000c2a7f3ff022470 +:105248000000c2a31000c29782130200ffff423081 +:10525800ff00423003004330020002240a006214b7 +:10526800000000001000c29702120200ffff423047 +:10527800ff0042303f004330010002240200621464 +:10528800000000000000c0a30000c28321e8c003a2 +:105298000c00be8f1000bd270800e00300000000ce +:1052a800e0ffbd271c00bfaf1800beaf21f0a00370 +:1052b8001000c0a31200c0a71200c227212040007e +:1052c800212800001283400f000000001000c2a334 +:1052d8001000c28339004014000000001200c29779 +:1052e800212040008c54400f000000001000c2a391 +:1052f8001000c28330004014000000001200c29762 +:10530800ff0042300600432c270060100000000018 +:1053180080180200019d023c34534224211062008f +:105328000000428c08004000000000004c53019d22 +:105338005c53019d6c53019d7c53019d8c53019dd1 +:105348009c53019d01000224848082a3f154400be8 +:105358000000000002000224848082a3f154400b64 +:105368000000000002000224848082a3f154400b54 +:105378000000000003000224848082a3f154400b43 +:10538800000000000a000224848082a3f154400b2c +:10539800000000000d000224848082a300000000a9 +:1053a800f154400b000000000d000224848082a309 +:1053b800f154400b00000000848080a31000c283d9 +:1053c80021e8c0031c00bf8f1800be8f2000bd2736 +:1053d8000800e00300000000f0ffbd270c00beaf8e +:1053e80021f0a003211880002110a0001000c3a301 +:1053f8001400c2a31000c29300120200201e027cf7 +:105408001400c2932016027c251062002016027c2c +:105418000200c2a70200c3976904022405006210b3 +:10542800000000000200c39768040224040062140c +:1054380000000000211000003055400b0000000063 +:10544800848082930400401400000000ffff0224bf +:105458003055400b00000000848082930000c2a3f6 +:105468002b55400b000000000000c39300a0023c35 +:10547800401803006c40422421106200000042944e +:105488000200c3970400621400000000ffff02241a +:105498003055400b000000000000c2930100422478 +:1054a8000000c2a30000c2930d00422ceeff40147e +:1054b800000000002110000021e8c0030c00be8f8e +:1054c8001000bd270800e00300000000c0ffbd2752 +:1054d8003c00bfaf3800beaf21f0a00321408000e0 +:1054e8004800c6af2120e0005400c38f5800c28f87 +:1054f8004000c8a34400c5a34c00c4a73000c3a7fc +:105508003400c2a7ffff02241000c2a33400c297d0 +:105518001400c2af4400c2937f004230ff00423003 +:105528001900c2a34000c2931800c2a308000224b5 +:105538001a00c2a74800c28f0e00401000000000e9 +:105548004c00c2973506422c27014010000000008d +:105558001a00c3974c00c29721106200ffff423027 +:105568001a00c2a74c00c2971400c38f2310620010 +:105578001400c2af5000c28f10004010000000009d +:105588003400c3973000c297211062003506422cc0 +:1055980018014010000000001a00c3971400c28fc1 +:1055a800ffff44303000c29721108200ffff4230d5 +:1055b80021106200ffff42301a00c2a71800c293f0 +:1055c800211840001900c2932120600021284000c2 +:1055d800f854400f000000001000c2a31000c2835e +:1055e80007014014000000001a00c2973d06422c33 +:1055f800dc00401000000000d353400f0000000002 +:105608001000c2a31000c283000140140000000073 +:105618002000c0af2400c0a71c00c0af4000c39347 +:105628001c00c28f251062001c00c2af4400c29348 +:10563800001a02001c00c28f251062001c00c2afb5 +:105648001a00c297001c02001c00c28f25106200bd +:105658001c00c2af1c00c28f8c10042421284000fb +:10566800558b400f000000001000c2a31000c28339 +:10567800c6004014000000001c00c0af1c00c28f10 +:10568800020042341c00c2af1c00c28f78100424f0 +:1056980021284000558b400f000000001000c2a3d5 +:1056a8001000c283bc00401400000000fa44400f00 +:1056b8000000000021184000f0ff023c00f04234d6 +:1056c800241862003000023c090062140000000047 +:1056d800ac10042401000524558b400f0000000085 +:1056e8001000c2a31000c283ae00401400000000e6 +:1056f8002000c0af2400c0a7ea55400b00000000fe +:105708001c00c2277810042421284000458b400f34 +:10571800000000001000c2a31000c283270040143c +:10572800000000002400c297ffff4230e803422c2b +:1057380005004014000000002400c297050004245e +:105748004494400f000000001c00c28f0200423049 +:105758000e004014000000002000c2271500033c82 +:105768000004643421284000458b400f00000000ed +:105778001000c2a31000c2831300401000000000f4 +:105788002000c0af7856400b000000002400c297ec +:10579800ffff423001004224ffff42302400c2a72d +:1057a8002400c297ffff42308813422cd4ff4014d4 +:1057b80000000000f555400b00000000000000004c +:1057c800f555400b00000000000000002000c28fcb +:1057d8005d004010000000002000c28f2800c2af0a +:1057e8001a00c2971a00c2a72800c38f1800c22740 +:1057f800212060002128400008000624d68b400f95 +:10580800000000001000c2a31000c283680040140a +:10581800000000002800c28f080042242800c2af00 +:105828004800c28f10004010000000002800c38ffd +:105838004c00c297212060004800c58f21304000ed +:10584800d68b400f000000001000c2a31000c283d6 +:105858005a004014000000004c00c3972800c28f73 +:10586800211062002800c2af5000c28f14004010ff +:10587800000000002800c38f1400c28f21106200ae +:105888002800c2af2800c38f3000c29721206000d3 +:105898005000c58f21304000d68b400f000000001b +:1058a8001000c2a31000c28347004014000000008b +:1058b8003000c3972800c28f211062002800c2afb1 +:1058c8002000c28f801002001c00c2af1c00c28fd3 +:1058d800020042341c00c2af1c00c28f6c100424aa +:1058e80021284000558b400f000000001000c2a383 +:1058f8001000c2833700401400000000fa44400f33 +:105908000000000021184000f0ff023c00f0423483 +:10591800241862003000023c1600621400000000e7 +:10592800b010042401000524558b400f000000002e +:105938001000c2a31000c2830e0040100000000037 +:105948007856400b000000003554400f000000005e +:105958001000c2a3fdff02241000c2a38656400b0c +:1059680000000000ffff02241000c2a38656400b6f +:10597800000000003554400f000000001000c2a3d2 +:105988001000c2838756400b000000000000000092 +:105998007856400b00000000000000007856400bcd +:1059a80000000000000000007856400b00000000d6 +:1059b800000000007856400b0000000000000000c6 +:1059c8007856400b00000000000000007856400b9d +:1059d80000000000000000001d54400f00000000ff +:1059e8008656400b00000000000000008656400b61 +:1059f80000000000000000008656400b0000000078 +:105a0800000000008656400b000000000000000067 +:105a18001000c28321e8c0033c00bf8f3800be8f4e +:105a28004000bd270800e00300000000d8ffbd27a4 +:105a38002400bfaf2000beaf21f0a0031000c0a318 +:105a48001400c2277010042421284000458b400f01 +:105a5800000000001000c2a31000c283120140140d +:105a6800000000001400c28f01004230ff004230e5 +:105a7800fc004010000000001400c227701004242d +:105a880021284000458b400f000000001000c2a3f1 +:105a98001000c283f7004014000000001400c38ff8 +:105aa800feff0224241062001400c2af1400c28f4b +:105ab8007010042421284000558b400f000000007e +:105ac8001000c2a31000c283ed00401400000000c3 +:105ad8001400c2277010042421284000458b400f71 +:105ae800000000001000c2a31000c283e7004014a9 +:105af8000000000000a0023c1c0242240100032414 +:105b0800020043a01400c28f82100200ffff42303f +:105b1800ff0f42301200c2a71200c297cd004010fa +:105b2800000000001c00c0af1c00c2278410042421 +:105b380021284000458b400f000000001000c2a340 +:105b48001000c283d4004014000000001c00c38f62 +:105b580000a0023c1c024224040043ac1200c3977c +:105b680000a0023c1c024224080043ac1c00c38f66 +:105b78001800c227212060002128400004000624c4 +:105b8800798b400f000000001000c2a31a00c297d2 +:105b9800ffff42301a00c2a71000c283c1004014a0 +:105ba800000000001a00c297ffff42301200c3979e +:105bb8000c006210000000001200c3971a00c29780 +:105bc800ffff423023106200050042280500401400 +:105bd80000000000faff02241000c2a3ac57400bdb +:105be800000000001800c293ff00433001000224a7 +:105bf800180062140000000000a0023c1c024224ad +:105c08000c00428c860040100000000000a0023cfe +:105c18001c0242240c00428c1900c393ff0063301d +:105c2800212060001a00c397ffff6330f8ff632448 +:105c3800ffff6330212860001c00c38f0800632425 +:105c48002130600009f84000000000008a57400b2e +:105c5800000000001800c293ff0043300200022435 +:105c6800180062140000000000a0023c1c0242243c +:105c78001000428c6a0040100000000000a0023ca6 +:105c88001c0242241000428c1900c393ff006330a9 +:105c9800212060001a00c397ffff6330f8ff6324d8 +:105ca800ffff6330212860001c00c38f08006324b5 +:105cb8002130600009f84000000000008a57400bbe +:105cc800000000001800c293ff00433004000224c3 +:105cd800180062140000000000a0023c1c024224cc +:105ce8001400428c4e0040100000000000a0023c4e +:105cf8001c0242241400428c1900c393ff00633035 +:105d0800212060001a00c397ffff6330f8ff632467 +:105d1800ffff6330212860001c00c38f0800632444 +:105d28002130600009f84000000000008a57400b4d +:105d3800000000001800c293ff0043300600022450 +:105d4800180062140000000000a0023c1c0242245b +:105d58001800428c320040100000000000a0023cf5 +:105d68001c0242241800428c1900c393ff006330c0 +:105d7800212060001a00c397ffff6330f8ff6324f7 +:105d8800ffff6330212860001c00c38f08006324d4 +:105d98002130600009f84000000000008a57400bdd +:105da800000000001800c293ff00433005000224e1 +:105db800180062140000000000a0023c1c024224eb +:105dc8002000428c160040100000000000a0023c99 +:105dd8001c0242242000428c1900c393ff00633048 +:105de800212060001a00c397ffff6330f8ff632487 +:105df800ffff6330212860001c00c38f0800632464 +:105e08002130600009f84000000000008a57400b6c +:105e180000000000faff0224ad57400b000000000c +:105e280000a0023c1c02422402004290ff004230c3 +:105e380005004010000000009253400f00000000d1 +:105e4800ad57400b0000000021100000ad57400b7b +:105e580000000000feff02241000c2a3ac57400b54 +:105e680000000000f4ff02241000c2a3ac57400b4e +:105e78000000000000000000ac57400b00000000cc +:105e880000000000ac57400b0000000000000000bc +:105e9800ac57400b0000000000000000ac57400b5e +:105ea80000000000000000001000c28321e8c003c9 +:105eb8002400bf8f2000be8f2800bd270800e00304 +:105ec80000000000e0ffbd271c00bfaf1800beaff8 +:105ed80021f0a0031000c0a38d56400f0000000061 +:105ee8001000c2a31000c28321e8c0031c00bf8faa +:105ef8001800be8f2000bd270800e0030000000046 +:105f0800e0ffbd271c00bfaf1800beaf21f0a00303 +:105f18002000c4af2400c5af2118c0002110e00044 +:105f28002800c3a72c00c2a31000c0a32000c28f62 +:105f380007004010000000002400c28f0400401039 +:105f4800000000002800c2970d0040140000000067 +:105f58002c00c29306004010000000009253400f2e +:105f6800000000001000c2a32658400b00000000eb +:105f7800f4ff02241000c2a32658400b00000000c2 +:105f88002800c39700a0023c1c0242240800428c4f +:105f98002b1043000500401000000000f4ff02240d +:105fa8001000c2a32658400b0000000000a0023ccd +:105fb8001c0242240400438c2000c28f2b10430093 +:105fc8000e004014000000002800c3972000c28f74 +:105fd8002118620000a0023c1c0242240400448ce8 +:105fe80000a0023c1c0242240800428c21108200be +:105ff8002b1043000500401000000000f4ff0224ad +:106008001000c2a32658400b000000002800c297c9 +:106018002000c48f2400c58f21304000798b400fa9 +:10602800000000001000c2a31000c2831700401433 +:10603800000000002c00c2930f0040140000000074 +:1060480000a0023c1c0242240400438c00a0023c35 +:106058001c0242240800428c211862002800c497c0 +:106068002000c28f21108200231062000400422cfd +:1060780007004010000000009253400f000000008d +:106088001000c2a32658400b0000000000000000ca +:106098001000c28321e8c0031c00bf8f1800be8f08 +:1060a8002000bd270800e00300000000f0ffbd2726 +:1060b8000c00beaf21f0a003211080001400c5af72 +:1060c8001000c2a30000c0a31000c2930700432c15 +:1060d800330060100000000080180200019d023c9f +:1060e800fc604224211062000000428c080040003d +:1060f80000000000a861019d3061019d1861019dab +:106108006061019d4861019d9061019d7861019ddb +:1061180000a0023c1c0242241400c38f100043acb0 +:106128006d58400b0000000000a0023c1c024224f5 +:106138001400c38f0c0043ac6d58400b00000000e6 +:1061480000a0023c1c0242241400c38f140043ac7c +:106158006d58400b0000000000a0023c1c024224c5 +:106168001400c38f1c0043ac6d58400b00000000a6 +:1061780000a0023c1c0242241400c38f180043ac48 +:106188006d58400b0000000000a0023c1c02422495 +:106198001400c38f200043ac6d58400b0000000072 +:1061a800f4ff02240000c2a3000000000000c28324 +:1061b80021e8c0030c00be8f1000bd270800e003d3 +:1061c80000000000d8ffbd272400bfaf2000beafed +:1061d80021f0a0032800c4af1000c0a305000224ca +:1061e8001400c2a30100023c080244340400052440 +:1061f800558b400f00000000ff0043301000c29391 +:1062080021106200ff0042301000c2a31400c293a4 +:106218000100033c0c02643421284000558b400fd8 +:1062280000000000ff0043301000c29321106200fc +:10623800ff0042301000c2a30100023c14024434a3 +:1062480001000524558b400f00000000ff0043307b +:106258001000c29321106200ff0042301000c2a358 +:106268000100023c1c02443484100524558b400f65 +:1062780000000000ff0043301000c29321106200ac +:10628800ff0042301000c2a30100023c0402443463 +:1062980081000524558b400f00000000ff004330ab +:1062a8001000c29321106200ff0042301000c2a308 +:1062b8001800c2270100033c18026434212840005a +:1062c800458b400f00000000ff0043301000c293d0 +:1062d80021106200ff0042301000c2a31000c283e8 +:1062e80007004014000000001800c38f01000224ba +:1062f800efff621400000000c358400b00000000cc +:10630800000000001000c2830600401400000000d6 +:1063180084100424378b400f00000000cc58400b39 +:1063280000000000211000001800c2af1800c28f42 +:10633800ff0043302800c28f000043a01000c28332 +:1063480021e8c0032400bf8f2000be8f2800bd278e +:106358000800e00300000000d8ffbd272400bfaffd +:106368002000beaf21f0a0032800c4af2c00c5afa9 +:106378003000c6af1c00c0af1000c0a30b00022441 +:106388001400c2a32c00c28f02140200ff00423086 +:106398001500c2a32c00c28f02120200ff00423077 +:1063a8001600c2a32c00c28fff0042301700c2a300 +:1063b800a5ff02241800c2a30100023c08024434cd +:1063c8003000c58f558b400f00000000ff004330a0 +:1063d8001000c29321106200ff0042301000c2a3d7 +:1063e8001400c293211840001500c2930012020045 +:1063f800251862001600c2930014020025186200d6 +:106408001700c29300160200251062000100033c29 +:106418000c02643421284000558b400f0000000016 +:10642800ff0043301000c29321106200ff00423089 +:106438001000c2a31800c2930100033c1002643488 +:1064480021284000558b400f00000000ff0043301a +:106458001000c29321106200ff0042301000c2a356 +:106468000100023c140244341f000524558b400fe0 +:1064780000000000ff0043301000c29321106200aa +:10648800ff0042301000c2a30100023c1c02443449 +:106498002800c58f558b400f00000000ff004330d7 +:1064a8001000c29321106200ff0042301000c2a306 +:1064b8000100023c0402443485000524558b400f3a +:1064c80000000000ff0043301000c293211062005a +:1064d800ff0042301000c2a31c00c2270100033c89 +:1064e8001802643421284000458b400f000000004a +:1064f800ff0043301000c29321106200ff004230b9 +:106508001000c2a31000c28307004014000000005e +:106518001c00c38f01000224efff6214000000007a +:106528004d59400b00000000000000001000c2831d +:1065380021e8c0032400bf8f2000be8f2800bd279c +:106548000800e00300000000d8ffbd272400bfaf0b +:106558002000beaf21f0a0032800c4af1800c0afd0 +:106568001000c0a3200002241400c2a32800c28f78 +:1065780002140200ff0042301500c2a32800c28f97 +:1065880002120200ff0042301600c2a32800c28f88 +:10659800ff0042301700c2a30100023c0802443445 +:1065a80021280000558b400f00000000ff004330f9 +:1065b8001000c29321106200ff0042301000c2a3f5 +:1065c8001400c293211840001500c2930012020063 +:1065d800251862001600c2930014020025186200f4 +:1065e8001700c29300160200251062000100033c48 +:1065f8000c02643421284000558b400f0000000035 +:10660800ff0043301000c29321106200ff004230a7 +:106618001000c2a30100023c140244340f000524f8 +:10662800558b400f00000000ff0043301000c2935c +:1066380021106200ff0042301000c2a30100023c9a +:106648001c02443421280000558b400f0000000034 +:10665800ff0043301000c29321106200ff00423057 +:106668001000c2a30100023c040244348400052443 +:10667800558b400f00000000ff0043301000c2930c +:1066880021106200ff0042301000c2a31800c22788 +:106698000100033c1802643421284000458b400f58 +:1066a80000000000ff0043301000c2932110620078 +:1066b800ff0042301000c2a31000c283070040143c +:1066c800000000001800c38f01000224efff6214cd +:1066d80000000000ba59400b000000000000000054 +:1066e8001000c28321e8c0032400bf8f2000be8fa2 +:1066f8002800bd270800e00300000000d8ffbd27e0 +:106708002400bfaf2000beaf21f0a0031800c0af27 +:106718001000c0a3060002241400c2a30100023c1a +:106728000802443421280000558b400f0000000067 +:10673800ff0043301000c29321106200ff00423076 +:106748001000c2a31400c2930100033c0c0264347d +:1067580021284000558b400f00000000ff00433007 +:106768001000c29321106200ff0042301000c2a343 +:106778000100023c1402443401000524558b400feb +:1067880000000000ff0043301000c2932110620097 +:10679800ff0042301000c2a30100023c1c02443436 +:1067a80021280000558b400f00000000ff004330f7 +:1067b8001000c29321106200ff0042301000c2a3f3 +:1067c8000100023c0402443481000524558b400f2b +:1067d80000000000ff0043301000c2932110620047 +:1067e800ff0042301000c2a31800c2270100033c7a +:1067f8001802643421284000458b400f0000000037 +:10680800ff0043301000c29321106200ff004230a5 +:106818001000c2a31000c28307004014000000004b +:106828001800c38f01000224efff6214000000006b +:10683800115a400b00000000000000001000c28345 +:1068480021e8c0032400bf8f2000be8f2800bd2789 +:106858000800e00300000000d8ffbd272400bfaff8 +:106868002000beaf21f0a0031800c0af1000c0a3e5 +:10687800040002241400c2a30100023c08024434ac +:1068880021280000558b400f00000000ff00433016 +:106898001000c29321106200ff0042301000c2a312 +:1068a8001400c2930100033c0c0264342128400008 +:1068b800558b400f00000000ff0043301000c293ca +:1068c80021106200ff0042301000c2a30100023c08 +:1068d8001402443401000524558b400f00000000c9 +:1068e800ff0043301000c29321106200ff004230c5 +:1068f8001000c2a30100023c1c02443421280000fd +:10690800558b400f00000000ff0043301000c29379 +:1069180021106200ff0042301000c2a30100023cb7 +:106928000402443481000524558b400f0000000008 +:10693800ff0043301000c29321106200ff00423074 +:106948001000c2a31800c2270100033c18026434d7 +:1069580021284000458b400f00000000ff00433015 +:106968001000c29321106200ff0042301000c2a341 +:106978001000c28307004014000000001800c38ff5 +:1069880001000224efff621400000000685a400b67 +:1069980000000000000000001000c28321e8c003ce +:1069a8002400bf8f2000be8f2800bd270800e00309 +:1069b80000000000d8ffbd272400bfaf2000beaff5 +:1069c80021f0a0032800c4af2c00c5af3000c6af2b +:1069d8001800c0af1000c0a3020002241400c2a314 +:1069e8002c00c28f02140200ff0042301500c2a31f +:1069f8002c00c28f02120200ff0042301600c2a310 +:106a08002c00c28fff0042301700c2a30100023cd5 +:106a18000802443421280000558b400f0000000074 +:106a2800ff0043301000c29321106200ff00423083 +:106a38001000c2a31400c293211840001500c2938d +:106a480000120200251862001600c293001402000a +:106a5800251862001700c293001602002510620074 +:106a68000100033c0c02643421284000558b400f80 +:106a780000000000ff0043301000c29321106200a4 +:106a8800ff0042301000c2a30100023c140244344b +:106a98000f000524558b400f00000000ff00433015 +:106aa8001000c29321106200ff0042301000c2a300 +:106ab8000100023c1c0244342800c58f558b400f4e +:106ac80000000000ff0043301000c2932110620054 +:106ad800ff0042301000c2a33000c28f0098427cf1 +:106ae80000120200840042340100033c04026434b2 +:106af80021284000558b400f00000000ff00433064 +:106b08001000c29321106200ff0042301000c2a39f +:106b18001800c2270100033c1802643421284000f1 +:106b2800458b400f00000000ff0043301000c29367 +:106b380021106200ff0042301000c2a31000c2837f +:106b480007004014000000001800c38f0100022451 +:106b5800efff621400000000db5a400b0000000049 +:106b6800000000001000c28321e8c0032400bf8f8a +:106b78002000be8f2800bd270800e00300000000a9 +:106b8800e0ffbd271c00bfaf1800beaf21f0a00377 +:106b98002000c4af2400c5af2800c6af1000c0a3b2 +:106ba8000d00043c2400c58f2800c68fd858400f1c +:106bb800000000001000c2a31000c28309004014a6 +:106bc800000000000d00043c2000c58f2800c68f7f +:106bd800798b400f000000001000c2a3fc5a400b44 +:106be80000000000000000001000c28321e8c0037c +:106bf8001c00bf8f1800be8f2000bd270800e003cf +:106c080000000000d0ffbd272c00bfaf2800beaf9a +:106c180021f0a0033000c4af3400c5af2110c0007c +:106c28003800c2a71000c0a33800c2970d00043c6a +:106c38003400c58f21304000d68b400f0000000083 +:106c4800ff0043301000c29321106200ff00423061 +:106c58001000c2a31400c0af1800c0af475b400bc0 +:106c680000000000c159400f000000002600401439 +:106c7800000000003800c2970d00043c3000c58faa +:106c8800213040006f5a400f000000001e004014e1 +:106c9800000000001c00c0af395b400b0000000082 +:106ca8002000c227212040007358400f0000000038 +:106cb80014004014000000002000c293010042307c +:106cc80006004014000000001800c28f0100422492 +:106cd8001800c2af445b400b000000001c00c28fcc +:106ce800010042241c00c2af1c00c38f50c30234f1 +:106cf8002a106200eaff401400000000445b400bc9 +:106d080000000000000000001400c28f01004224af +:106d18001400c2af1400c28f0400422805004010be +:106d2800000000001800c28f02004228cdff401466 +:106d380000000000185a400f000000001000c2a315 +:106d48001800c28f02004228030040100000000013 +:106d5800f4ff02241000c2a31000c28321e8c0037c +:106d68002c00bf8f2800be8f3000bd270800e0032d +:106d780000000000d8ffbd272400bfaf2000beaf31 +:106d880021f0a0031c00c0af1000c0af1400c0a3c6 +:106d98009fff02241800c2a30100023c08024434e9 +:106da80004000524558b400f00000000ff0043300d +:106db8001400c29321106200ff0042301400c2a3e5 +:106dc8001800c2930100033c0c02643421284000df +:106dd800558b400f00000000ff0043301400c293a1 +:106de80021106200ff0042301400c2a30100023cdf +:106df8001402443401000524558b400f00000000a4 +:106e0800ff0043301400c29321106200ff0042309b +:106e18001400c2a30100023c1c024434841005245f +:106e2800558b400f00000000ff0043301400c29350 +:106e380021106200ff0042301400c2a30100023c8e +:106e48000402443481000524558b400f00000000e3 +:106e5800ff0043301400c29321106200ff0042304b +:106e68001400c2a31c00c2270100033c18026434aa +:106e780021284000458b400f00000000ff004330f0 +:106e88001400c29321106200ff0042301400c2a314 +:106e98001400c28312004014000000001000c28fca +:106ea800010042241000c2af1000c28ff501422c2d +:106eb8000500401400000000fbff02241400c2a3d8 +:106ec800bb5b400b000000001c00c38f01000224c4 +:106ed800e4ff621400000000bb5b400b00000000f0 +:106ee800000000001400c2830600401400000000e7 +:106ef80084100424378b400f00000000c45b400b53 +:106f080000000000211000001c00c2af1c00c28f4e +:106f180021e8c0032400bf8f2000be8f2800bd27b2 +:106f28000800e00300000000e0ffbd271c00bfaf21 +:106f38001800beaf21f0a0032000c4af2400c5afe5 +:106f48002800c6af1000c0a32800c38f01800234f8 +:106f58002b1062001a004014000000002000c48fab +:106f68002400c58f00800634e25a400f000000005c +:106f78001000c2a31000c2831900401400000000d2 +:106f88002800c28f008042242800c2af2400c38f8b +:106f980000800234211062002400c2af2000c38f99 +:106fa80000800234211062002000c2af2800c38f85 +:106fb800018002342b106200e8ff4010000000003e +:106fc8002000c48f2400c58f2800c68fe25a400fc6 +:106fd800000000001000c2a3fb5b400b0000000093 +:106fe800000000001000c28321e8c0031c00bf8f0e +:106ff8001800be8f2000bd270800e0030000000035 +:10700800d8ffbd272400bfaf2000beaf21f0a003ea +:107018002800c4af2c00c5af3000c6af1000c0a315 +:10702800000102241400c2af2c00c38f1400c28fc9 +:107038001b006200f4014000101000001800c2afed +:107048003000c28f0500401400000000f4ff022445 +:107058001000c2a36e5c400b000000001800c28f35 +:107068004d004010000000001400c38f1800c28fac +:10707800231062001c00c2af3000c38f1c00c28ff7 +:107088002b10430005004010000000001c00c28fb8 +:10709800ffff42302b5c400b000000003000c28f25 +:1070a800ffff42302c00c48f2800c58f21304000dc +:1070b800035b400f000000000500401000000000c6 +:1070c800f4ff02241000c2a36e5c400b0000000015 +:1070d8003000c38f1c00c28f2b1062003300401495 +:1070e800000000002800c38f1c00c28f211062001e +:1070f8002800c2af2c00c38f1c00c28f2110620071 +:107108002c00c2af3000c38f1c00c28f2310620056 +:107118003000c2af685c400b000000001400c28f52 +:107128003000c38f3000c48f2b2044000a10640045 +:107138001c00c2af1c00c28fffff42302c00c48f5e +:107148002800c58f21304000035b400f000000007d +:107158000500401000000000f4ff02241000c2a344 +:107168006e5c400b000000002800c38f1c00c28f1b +:10717800211062002800c2af2c00c38f1c00c28ff0 +:10718800211062002c00c2af3000c38f1c00c28fd8 +:10719800231062003000c2af3000c28fdfff4014fe +:1071a800000000006e5c400b0000000000000000c2 +:1071b8001000c28321e8c0032400bf8f2000be8fc7 +:1071c8002800bd270800e00300000000d0ffbd270d +:1071d8002c00bfaf2800beaf21f0a0033000c4af21 +:1071e8003400c5af1000c0af2000c0a33000c28f6c +:1071f8001000c2afcc5c400b000000001800c0af0c +:107208001400c0afba5c400b00000000c159400f29 +:10721800000000002f004014000000002000c227da +:10722800212040007358400f00000000290040143e +:10723800000000001000c48f5459400f00000000e7 +:1072480024004014000000002000c2272120400034 +:107258007358400f000000001e004014000000009a +:107268001c00c0afac5c400b000000002000c2272f +:10727800212040007358400f000000001400401403 +:10728800000000002000c2930100423006004014b4 +:10729800000000001400c28f010042241400c2af95 +:1072a800b75c400b000000001c00c28f01004224a4 +:1072b8001c00c2af1c00c38f50c302342a106200e6 +:1072c800eaff401400000000b75c400b000000001b +:1072d800000000001800c28f010042241800c2af4d +:1072e8001800c28f0400422805004010000000006a +:1072f8001400c28f02004228c4ff4014000000009e +:107308001400c38f02000224040062100000000071 +:10731800f4ff0224d45c400b000000001000c28f70 +:10732800001042241000c2af3400c38f3000c28f57 +:10733800211862001000c28f2b104300afff4014c9 +:10734800000000002110000021e8c0032c00bf8fbe +:107358002800be8f3000bd270800e00300000000b1 +:10736800e0ffbd271c00bfaf1800beaf21f0a0038f +:107378001000c0af1400c0afc480828f1100401449 +:10738800000000005f5b400f000000001000c2af6b +:107398001000c38fffff02240a00621000000000e3 +:1073a8001000c28f02140200ff004230efff422497 +:1073b8001400c2af1400c28f01000324041043005c +:1073c800c48082afc480828f21e8c0031c00bf8fb5 +:1073d8001800be8f2000bd270800e0030000000051 +:1073e800f0ffbd270c00beaf21f0a00380bf033c17 +:1073f8000068628cc47b027c006862ac80bf023c7f +:10740800106840ac80bf033c1068628c8452027cd8 +:10741800106862ac88bf033c1011628c070004241a +:107428008420827c101162ac88bf033c1011628cee +:107438000408027c101162ac80bf033c1068628ca7 +:1074480001000424847b827c106862ac88bf033c02 +:107458004010628c8452027c401062ac88bf033cae +:107468007010628c8452027c701062ac80bf033c46 +:107478001068628c8439027c106862ac88bf033c57 +:107488004010628c444a027c401062ac88bf033cc6 +:107498007010628c01000424444a827c701062ac33 +:1074a80080bf033c1068628c010004240463827c62 +:1074b800106862ac80bf033c1068628c0100042431 +:1074c8008452827c106862ac80bf033c0068628c86 +:1074d800c47b027c006862ac0000c0af685d400bf2 +:1074e8000000000000a0023c0000c38f4019030008 +:1074f8000003422421106200000040ac00a0023cbe +:107508000000c38f401903000003422421106200c9 +:10751800080040ac00a0033c0000c28f00036324b5 +:1075280040110200211062000c0040ac00a0023c97 +:107538000000c38f40190300000342242110620099 +:10754800100040ac00a0033c0000c28f000363247d +:107558004011020021106200140040ac00a0023c5f +:107568000000c38f40190300000342242110620069 +:10757800180040ac00a0033c0000c28f0003632445 +:1075880040110200211062001c0040ac0000c28fb4 +:10759800010042240000c2af0000c28f020042284e +:1075a800d0ff40140000000021e8c0030c00be8f8b +:1075b8001000bd270800e00300000000f0ffbd2711 +:1075c8000c00beaf21f0a0031000c4af1400c5af7b +:1075d8001800c6af1c00c7af1000c28f03004228b6 +:1075e800040040140000000006000224f45d400b73 +:1075f800000000002000c28f80180200c404023c72 +:1076080000b442341a004300f4016000101800006e +:1076180012100000ffff42240400c2af0000c0aff8 +:107628002400c28f0900401000000000010003245c +:1076380007004314000000000000c28f010042341c +:107648000000c2af965d400b000000000000000083 +:1076580000a0033c1000c28f000363244011020005 +:10766800211062001400c38f1c0043ac2800c28f95 +:107678000100032406004310000000000200032458 +:107688000800431000000000af5d400b0000000040 +:107698000000c28f020042340000c2afaf5d400b51 +:1076a800000000000000c28f040042340000c2af96 +:1076b800000000001000c28f06004010000000000b +:1076c800010003241e00431000000000ec5d400b85 +:1076d8000000000088bf033c4061628cc418027c33 +:1076e800406162ac88bf033c6061628c0100042485 +:1076f800c418827c606162ac0000c38f80bf023c0a +:10770800006043ac80bf033c0060628c010004242d +:10771800c418827c006062ac0400c38f80bf023c46 +:10772800406043ac80bf033c0060628c01000424cd +:10773800c47b827c006062acec5d400b0000000002 +:1077480088bf033c4061628c4429027c406162ac82 +:1077580088bf033c6061628c010004244429827c58 +:10776800606162ac0000c38f80bf023c006843ac1c +:1077780080bf033c0068628c01000424c418827c2a +:10778800006862ac0400c38f80bf023c406843ac11 +:1077980080bf033c0068628c01000424c47b827ca7 +:1077a800006862ac0000000000a0023c1000c38f1b +:1077b8004019030000034224211062000100032441 +:1077c800180043ac0100022421e8c0030c00be8f5e +:1077d8001000bd270800e00300000000d0ffbd270f +:1077e8002c00bfaf2800beaf21f0a0033000c4af0b +:1077f8003400c5af3800c6af3c00c7af3800c28ff1 +:107808004019020000a0023c00034224211062003b +:107818002400c2af2400c28f1800428c0400401418 +:107828000000000003000224c85e400b00000000b6 +:107838002400c28f1400438c010002240400621447 +:107848000000000002000224c85e400b0000000097 +:107858003400c28f1000c2af1000c28f020042284d +:107868000300401400000000010002241000c2af11 +:107878002400c28f040043242400c28f000043acbc +:107888002400c28f0000428c1400c2af2400c28fb3 +:107898001000c38f080043ac1800c0af3f5e400b18 +:1078a800000000003000c28f000043801400c28f27 +:1078b800000043a01400c28f010042241400c2af8c +:1078c8003000c28f010042243000c2af3000c38fa5 +:1078d8004000c28f2b10430003004010000000003e +:1078e8003c00c28f3000c2af1800c28f0100422492 +:1078f8001800c2af1800c38f1000c28f2a10620090 +:10790800e8ff4014000000002400c28f0100032497 +:10791800140043ac3800c28f06004010000000007d +:10792800010003243a00431000000000c75e400b2a +:107938000000000088bf023c6010438c0010023c2d +:10794800241062000e004010000000002400c28fc6 +:107958001c00428c212040001000c58fd634400ff7 +:107968000000000080bf033c1060628c010004240a +:107978008452827c106062acc75e400b000000003d +:107988001c00c0af775e400b000000002400c28fcf +:107998000000428c000043802120600080bf033c2f +:1079a800206064ac010043242400c28f000043ac73 +:1079b8000000000080bf023c1060428c0001423091 +:1079c800fcff4010000000001c00c28f0100422490 +:1079d8001c00c2af1c00c38f1000c28f2a106200a7 +:1079e800eaff4014000000002400c28f140040acdd +:1079f8002400c28f1c00428c212040001000c58f3b +:107a0800d634400f00000000c75e400b00000000a5 +:107a180088bf023c7010428c000442300e004010b7 +:107a2800000000002400c28f1c00428c212040006e +:107a38001000c58fd634400f0000000080bf033c03 +:107a48001068628c010004248452827c106862ac45 +:107a5800c75e400b000000002000c0afb95e400bbd +:107a6800000000002400c28f0000428c0000438008 +:107a78002120600080bf033c206864ac01004324df +:107a88002400c28f000043ac0000000080bf023c0d +:107a98001068428c00014230fcff401000000000da +:107aa80088bf023c6061428c4000427cff0042304b +:107ab80027100200ff00423001004230ff0044302e +:107ac80088bf033c6061628c4408827c606162ac60 +:107ad8002000c28f010042242000c2af2000c38fc3 +:107ae8001000c28f2a106200deff40140000000060 +:107af8002400c28f140040ac2400c28f1c00428caa +:107b0800212040001000c58fd634400f000000002f +:107b1800000000000100022421e8c0032c00bf8ff0 +:107b28002800be8f3000bd270800e00300000000d9 +:107b3800f0ffbd270c00beaf21f0a0031000c4afba +:107b48001400c5af1800c6af88bf023c7010428c45 +:107b58000400c2af88bf033c7010628c8452027c60 +:107b6800701062ac0000c0affb5e400b000000006c +:107b780088bf023c6061428c4000427cff0042307a +:107b880027100200ff00423001004230ff0044305d +:107b980088bf033c6061628c4408827c606162ac8f +:107ba8001000c28f000042802118400080bf023cb4 +:107bb800206843ac1000c28f010042241000c2affd +:107bc8000000000080bf023c1068428c0001423077 +:107bd800fcff4010000000000000c28f010042249a +:107be8000000c2af0000c38f1400c28f2a106200c9 +:107bf800dfff40140000000088bf033c6061628c16 +:107c0800010004244408827c606162ac88bf033ca4 +:107c18004010628c8452027c401062ac0400c38f16 +:107c280088bf023c701043ac0100022421e8c00365 +:107c38000c00be8f1000bd270800e0030000000004 +:107c4800f8ffbd270400beaf21f0a00321e8c00360 +:107c58000400be8f0800bd270800e00300000000f4 +:107c680000e85d4100701a4000601b40c8ffbd2756 +:107c78003400bbaf44781b7c001c7b3700609b4002 +:107c88002400bfaf2000beaf121000002c00a2af2e +:107c9800101800002800a3af21f0a00300a0023ca8 +:107ca800000342241400c2af88bf023c3010438c4a +:107cb8000010023c241062002e004010000000005a +:107cc80088bf023c6010438c0010023c2410620004 +:107cd800280040100000000088bf033c3010628c70 +:107ce80004e7027c301062ac1400c28f0800428c9a +:107cf800090040140000000080bf033c1060628c43 +:107d08008452027c106062ac1400c28f140040ac34 +:107d18005f5f400b000000001400c28f0000428c1f +:107d2800000043802120600080bf033c206064acd9 +:107d3800010043241400c28f000043ac1400c28f1a +:107d48000800428cffff43241400c28f080043ac94 +:107d580080bf023c1060428c000242300500401493 +:107d6800000000001400c28f0800428ceaff401493 +:107d78000000000088bf023c3010438c0008023c21 +:107d880024106200390040100000000088bf023c47 +:107d98006010438c0008023c24106200330040103d +:107da8000000000088bf033c3010628cc4de027cf7 +:107db800301062ac80bf023c1060428c020042303e +:107dc8000f0040100000000080bf033c1060628c70 +:107dd8004408027c106062ac88bf033c3010628c9f +:107de800c4de027c301062ac039d023cfc92442449 +:107df80027a4400f000000009d5f400b000000001a +:107e08001000c0af905f400b0000000080bf023c34 +:107e18003060428c1800c2a31000c38f548182279f +:107e2800211062001800c393000043a01000c28f05 +:107e3800010042241000c2af80bf023c1060428c97 +:107e480001004230f1ff4014000000001400c28f0e +:107e58001c00438c54818227212060002128400087 +:107e68001000c68f7432400f0000000021e8c003e4 +:107e78002c00a28f130040002800a38f110060007f +:107e88002400bf8f2000be8f3400bb8f3800bd2771 +:107e980000e8dd4100609b401800004200e85d41b9 +:107ea80000701a4000601b40c8ffbd273400bbaffc +:107eb80044781b7c001c7b3700609b402400bfafcc +:107ec8002000beaf121000002c00a2af1018000056 +:107ed8002800a3af21f0a00300a0023c2003422405 +:107ee8001400c2af88bf023c4010428c00044230ec +:107ef800390040100000000088bf023c7010428c1e +:107f080000044230340040100000000088bf033ce9 +:107f18004010628c8452027c401062ac1400c28f04 +:107f28000800428c090040140000000080bf033c98 +:107f38001068628c8452027c106862ac1400c28f94 +:107f4800140040acf85f400b000000001400c28f22 +:107f58000000428c000043802120600080bf033c69 +:107f6800206864ac010043241400c28f000043acb5 +:107f78001400c28f0800428cffff43241400c28ff4 +:107f8800080043ac88bf023c6061428c4000427ce0 +:107f9800ff00423027100200ff004230010042304b +:107fa800ff00443088bf033c6061628c4408827cd7 +:107fb800606162ac80bf023c1068428c00024230b3 +:107fc80005004014000000001400c28f0800428c15 +:107fd800deff40140000000088bf023c4010428cc5 +:107fe80000024230450040100000000088bf023cfb +:107ff8007010428c00024230400040100000000027 +:1080080088bf033c4010628c444a027c401062ac3a +:1080180080bf023c1068428c020042300f004010c2 +:108028000000000080bf033c1068628c4408027c9a +:10803800106862ac88bf033c4010628c444a027ce2 +:10804800401062ac039d023c0893442427a4400fcf +:10805800000000004160400b000000001000c0afad +:108068003360400b0000000080bf023c3068428c47 +:108078001800c2a31000c38f558182272110620007 +:108088001800c393000043a01000c28f01004224cf +:108098001000c2af88bf023c6060428c0001427c85 +:1080a800ff00423027100200ff004230010042303a +:1080b800ff00443088bf033c6060628c0421827cee +:1080c800606062ac80bf023c1068428c01004230a4 +:1080d800e5ff4014000000001400c28f1c00438c10 +:1080e8005481822701004224212060002128400079 +:1080f8001000c68f7432400f0000000021e8c00352 +:108108002c00a28f130040002800a38f11006000ec +:108118002400bf8f2000be8f3400bb8f3800bd27de +:1081280000e8dd4100609b4018000042f8ffbd27d1 +:108138000400beaf21f0a00380bf033c0060628c46 +:10814800c47b027c006062ac80bf033c1060628c20 +:108158008452027c106062ac88bf033c6010628c61 +:1081680004e7027c601062ac88bf033c3010628c6c +:1081780004e7027c301062ac88bf033c6010628c5c +:108188000100042404e7827c601062ac88bf033cd1 +:108198006010628cc4de027c601062ac88bf033c55 +:1081a8006010628cc4de027c601062ac88bf033c45 +:1081b8003010628cc4de027c301062ac88bf033c95 +:1081c8006010628c01000424c4de827c601062ac02 +:1081d80080bf033c1060628c010004240463827c2d +:1081e800106062ac00a0023c00a0033c04036324be +:1081f800000343ac00a0023c000342240c0040ac46 +:1082080000a0023c00034224140040ac80bf033ca1 +:108218000060628c01000424c47b827c006062ac34 +:1082280021e8c0030400be8f0800bd270800e00352 +:1082380000000000f8ffbd270400beaf21f0a00336 +:1082480080bf033c0068628cc47b027c006862ac1f +:1082580080bf033c1068628c8452027c106862ac58 +:1082680088bf033c7010628c8452027c701062ac30 +:1082780088bf033c4010628c8452027c401062ac80 +:1082880088bf033c7010628c8452027c701062ac10 +:1082980088bf033c7010628c444a027c701062ac48 +:1082a80088bf033c4010628c01000424444a827c4d +:1082b800401062ac88bf033c7010628c010004243b +:1082c800444a827c701062ac80bf033c1068628ca8 +:1082d800010004240463827c106862ac00a0023ca4 +:1082e8000003422400a0033c24036324200043ac81 +:1082f80000a0023c000342242c0040ac00a0023c39 +:1083080000034224340040ac80bf033c0068628c08 +:1083180001000424c47b827c006862ac21e8c003ad +:108328000400be8f0800bd270800e003000000001d +:10833800f8ffbd270400beaf21f0a00321e8c00369 +:108348000400be8f0800bd270800e00300000000fd +:10835800e8ffbd271400bfaf1000beaf21f0a00397 +:1083680000a0023c1c0842245c8182af00a0023cb1 +:108378001c084424212800002c01062411a1400fc8 +:108388000000000000a0023cf00644242128000060 +:108398002c01062411a1400f0000000000a0023c9f +:1083a800c4054424212800002c01062411a1400ff3 +:1083b80000000000608180af21e8c0031400bf8f77 +:1083c8001000be8f1800bd270800e0030000000061 +:1083d800e8ffbd271400bfaf1000beaf21f0a00317 +:1083e8006081828f0a004010000000000100032411 +:1083f8000800431400000000608180af3c3b400f40 +:1084080000000000000000000761400b00000000b1 +:108418000000000021e8c0031400bf8f1000be8fc9 +:108428001800bd270800e00300000000e0ffbd279a +:108438001c00bfaf1800beaf21f0a0032000c4afde +:108448002400c5af2000c28f1500401000000000b6 +:108458001000c0af1000c0af2561400b0000000045 +:108468002000c28f000042902000c38f01006324c7 +:108478002000c3af212040003061400f0000000001 +:108488001000c28f010042241000c2af1000c38f39 +:108498002400c28f2a106200f1ff4014000000007f +:1084a80021e8c0031c00bf8f1800be8f2000bd2725 +:1084b8000800e00300000000e8ffbd271400bfaf7c +:1084c8001000beaf21f0a003211080001800c2a345 +:1084d8001800c3930d0002241d0062140000000060 +:1084e800029d023c1c3544244364400f00000000f8 +:1084f80000a0023c1c0842240000428009004010f1 +:108508000000000000a0023cf006442400a0023c49 +:108518001c084524a89b400f000000008461400f00 +:108528000000000000a0023c1c0842245c8182afcd +:1085380000a0023c1c084424212800002c01062429 +:1085480011a1400f000000007e61400b00000000f8 +:108558001800c39308000224050062100000000000 +:108568001800c3937f000224110062140000000069 +:108578001800c283212040005864400f000000000a +:108588005c81838f00a0023c1c0842241800621002 +:10859800000000005c81828fffff42245c8182af73 +:1085a8005c81828f000040a07e61400b00000000cb +:1085b8001800c283212040005864400f00000000ca +:1085c8005c81838f00a0023c480942242b10620082 +:1085d80007004010000000005c81828f1800c383f0 +:1085e800000043a05c81828f010042245c8182af3d +:1085f80021e8c0031400bf8f1000be8f1800bd27ec +:108608000800e00300000000b8febd274401bfaf2a +:108618004001beaf21f0a0032000c2272120400066 +:10862800212800001e00062411a1400f00000000b0 +:108638004000c22721204000212800001e000624f7 +:1086480011a1400f000000006000c2272120400057 +:10865800212800001e00062411a1400f0000000080 +:108668008000c22721204000212800001e00062487 +:1086780011a1400f00000000a000c22721204000e7 +:10868800212800001e00062411a1400f0000000050 +:108698004000c2276000c3271000a3af8000c32793 +:1086a8001400a3afa000c3271800a3af00a0033c89 +:1086b8001c086424029d033c203565242000c32740 +:1086c80021306000213840008ca3400f00000000da +:1086d8002000c22721204000029d023c303545245d +:1086e80004000624a1a2400f00000000120040145c +:1086f8000000000000a0023c04314224648182afe3 +:1087080000a0023c04314224212040008e9d400fed +:108718000000000000a0033c04316424212840002c +:108728000c3c400f000000006481828f288082afdb +:108738003d64400b000000002000c22721204000bb +:10874800029d023c3835452405000624a1a2400fad +:108758000000000037004014000000004000c2275d +:10876800000042800700401400000000029d023c07 +:10877800403544244364400f000000003d64400b32 +:10878800000000004000c22721204000029d023c5a +:108798007c35452402000624a1a2400f00000000f9 +:1087a8000900401400000000029d023c803544246a +:1087b8004364400f00000000c097400f0000000015 +:1087c8000962400b000000004000c2272120400041 +:1087d800029d023ca035452403000624a1a2400fb7 +:1087e800000000000900401400000000029d023c47 +:1087f800a43544244364400f00000000d497400f80 +:10880800000000000962400b00000000029d023ccd +:10881800c43544244364400f00000000029d023c1c +:10882800043644244364400f000000003d64400bbc +:10883800000000002000c22721204000029d023cc9 +:108848000836452404000624a1a2400f00000000b9 +:1088580080004014000000004000c2270000428051 +:108868000700401400000000029d023c103644241a +:108878004364400f000000003d64400b000000000e +:108888004000c22721204000029d023c7c3545243f +:1088980002000624a1a2400f0000000015004014a9 +:1088a800000000009c3b400f000000002118400021 +:1088b800010002240900621000000000029d023c31 +:1088c8004c3644244364400f000000001b3a400f1c +:1088d800000000009162400b00000000029d023c75 +:1088e800643644244364400f000000009162400b4a +:1088f800000000004000c22721204000029d023ce9 +:10890800a035452403000624a1a2400f0000000062 +:1089180013004014000000009c3b400f00000000c2 +:108928000900401000000000029d023c80364424eb +:108938004364400f0000000001000224608182af00 +:108948009162400b00000000029d023ca8364424be +:108958004364400f000000009162400b00000000db +:108968004000c22721204000029d023cd436452405 +:1089780006000624a1a2400f000000002f004014aa +:10898800000000009c3b400f000000000500432c45 +:108998002a0060100000000080180200029d023cbe +:1089a800bc894224211062000000428c080040006b +:1089b80000000000d089019de889019d008a019d81 +:1089c800188a019d308a019d029d023cdc364424b0 +:1089d8004364400f000000009162400b000000005b +:1089e800029d023cf03644244364400f000000001e +:1089f8009162400b00000000029d023c00374424b5 +:108a08004364400f000000009162400b000000002a +:108a1800029d023c143744244364400f00000000c8 +:108a28009162400b00000000029d023c2037442464 +:108a38004364400f0000000000000000029d023c5b +:108a4800043644244364400f000000003d64400b9a +:108a5800000000002000c22721204000029d023ca7 +:108a68003837452407000624a1a2400f0000000063 +:108a780091004014000000004000c227000042801e +:108a88002d00401400000000fe8c400f0000000084 +:108a9800c000c32721206000029d033c40376524a5 +:108aa8002130400012a3400f00000000029d023c4c +:108ab800443744244364400f00000000c000c2272c +:108ac800212040004364400f00000000029d023c4a +:108ad800043644244364400f00000000188d400f02 +:108ae80000000000d000c32721206000029d033c45 +:108af800583765242130400012a3400f00000000c1 +:108b0800029d023c5c3744244364400f000000008f +:108b1800d000c227212040004364400f000000001d +:108b2800029d023c783744244364400f0000000053 +:108b38003d64400b000000004000c2272120400097 +:108b4800029d023c7c37452407000624a1a2400f61 +:108b5800000000001800401400000000fe8c400fc8 +:108b680000000000e000c32721206000029d033cb4 +:108b7800403765242130400012a3400f0000000058 +:108b8800029d023c443744244364400f0000000027 +:108b9800e000c227212040004364400f000000008d +:108ba800029d023c043644244364400f0000000048 +:108bb8002a63400b000000004000c227212040002b +:108bc800029d023c8437452407000624a1a2400fd9 +:108bd800000000001800401400000000188d400f2d +:108be80000000000f000c32721206000029d033c24 +:108bf800583765242130400012a3400f00000000c0 +:108c0800029d023c5c3744244364400f000000008e +:108c1800f000c227212040004364400f00000000fc +:108c2800029d023c783744244364400f0000000052 +:108c38002a63400b000000004000c22721204000aa +:108c4800029d023c8c37452403000624a1a2400f54 +:108c5800000000001200401400000000238d400fa7 +:108c6800000000000001c32721206000029d033c92 +:108c7800583765242130400012a3400f000000003f +:108c8800029d023c903744244364400f00000000da +:108c9800029d023ca03744244364400f00000000ba +:108ca800029d023c043644244364400f0000000047 +:108cb8003d64400b000000002000c2272120400036 +:108cc800029d023cd436452406000624a1a2400f8a +:108cd80000000000a200401400000000029d023cb9 +:108ce800a43744244364400f00000000e897400f75 +:108cf800000000000700401400000000029d023c34 +:108d0800b83744244364400f000000005763400b09 +:108d180000000000e897400f000000002118400004 +:108d2800010002240700621400000000029d023cba +:108d3800d43744244364400f000000005763400bbd +:108d480000000000029d023cf03744244364400fb9 +:108d5800000000009c3b400f0000000001000324bd +:108d680016004310000000000200432805006010b0 +:108d7800000000000b004010000000008363400b5f +:108d8800000000000200032412004310000000004d +:108d98000300032415004310000000008363400b08 +:108da80000000000029d023c103844244364400f38 +:108db800000000008863400b00000000029d023c98 +:108dc8002c3844244364400f000000008863400ba3 +:108dd80000000000029d023c443844244364400fd4 +:108de800000000008863400b00000000029d023c68 +:108df800603844244364400f000000008863400b3f +:108e080000000000029d023c843844244364400f63 +:108e180000000000000000001001c22721204000cf +:108e2800212800000f00062411a1400f00000000b7 +:108e3800fe8c400f000000001001c32721206000b5 +:108e4800029d033c9c3865242130400012a3400f4a +:108e580000000000029d023c443744244364400f54 +:108e6800000000001001c227212040004364400f89 +:108e780000000000029d023ca43844244364400fd3 +:108e8800000000002001c227212040002128000006 +:108e98000f00062411a1400f00000000188d400f9c +:108ea800000000002001c32721206000029d033c30 +:108eb800a83865242130400012a3400f00000000ac +:108ec800029d023c5c3744244364400f00000000cc +:108ed8002001c227212040004364400f0000000009 +:108ee800640004244e77400f000000003001c227c0 +:108ef80021204000212800000f00062411a1400f66 +:108f080000000000238d400f000000003001c3273f +:108f180021206000029d033cb038652421304000c8 +:108f280012a3400f00000000029d023c9037442429 +:108f38004364400f000000003001c2272120400098 +:108f48004364400f00000000029d023c04364424a4 +:108f58004364400f000000003d64400b0000000027 +:108f68002000c22721204000029d023cb838452439 +:108f78000a000624a1a2400f000000004a00401485 +:108f8800000000004000c227000042800700401493 +:108f980000000000029d023cc43844244364400f92 +:108fa800000000003d64400b000000004000c227a4 +:108fb80021204000029d023c043945240500062476 +:108fc800a1a2400f000000000900401400000000aa +:108fd8005141400f00000000029d023c0c3944241e +:108fe8004364400f000000003d64400b0000000097 +:108ff8004000c22721204000029d023c243945241c +:1090080004000624a1a2400f00000000090040143b +:1090180000000000029d023c2c3944244364400fa8 +:10902800000000006141400f000000003d64400b5b +:10903800000000004000c22721204000029d023ca1 +:10904800d436452406000624a1a2400f00000000e3 +:109058002600401400000000bf3d400f0000000043 +:109068000700401000000000029d023c48394424db +:109078004364400f000000003d64400b0000000006 +:10908800bf3d400f00000000180040100000000025 +:10909800029d023c683944244364400f00000000ec +:1090a8003d64400b000000002000c2272120400042 +:1090b8008e9d400f000000002000c3272120600083 +:1090c800029d033c8c39652421304000a1a2400f49 +:1090d800000000000500401000000000029d023c56 +:1090e800943944244364400f0000000021e8c00381 +:1090f8004401bf8f4001be8f4801bd270800e0032f +:1091080000000000e0ffbd271c00bfaf1800beaf85 +:109118001400b0af21f0a0032000c4af2000d08f0e +:109128002000c48f8e9d400f000000002120000207 +:10913800212840000c3c400f0000000021e8c0033b +:109148001c00bf8f1800be8f1400b08f2000bd27f1 +:109158000800e00300000000e8ffbd271400bfafcf +:109168001000beaf21f0a003211080001800c2a398 +:109178001800c293212040002e3c400f0000000040 +:1091880021e8c0031400bf8f1000be8f1800bd2750 +:109198000800e00300000000f8ffbd270400beaf90 +:1091a80021f0a00321e8c0030400be8f0800bd27fa +:1091b8000800e00300000000e0ffbd271c00beaf70 +:1091c80021f0a00388bf033c2061628c01000424c5 +:1091d800c418827c206162acc404023c00b44234ee +:1091e8000000c2af7d01023c407842340400c2afa7 +:1091f8000400c28f401002000000c38f1b006200f1 +:10920800f401400010180000121000000800c2af5e +:109218000400c28f401002000000c38f1b006200d0 +:10922800f40140001010000004004010000000008d +:109238000800c28f010042240800c2af0800c28f94 +:109248000101422c03004014000000000001022428 +:109258000800c2af0800c28f0400401000000000e0 +:109268000800c28fffff42240800c2af0800c28f67 +:10927800ff004230ad8182a3c404023c00b44234f2 +:109288000c00c2af1602023cc00e42341000c2af3e +:109298001000c28f401002000c00c38f1b00620038 +:1092a800f401400010180000121000001400c2afb2 +:1092b8001000c28f401002000c00c38f1b00620018 +:1092c800f4014000101000000400401000000000ed +:1092d8001400c28f010042241400c2af1400c28fd0 +:1092e8000101422c03004014000000000001022488 +:1092f8001400c2af1400c28f040040100000000028 +:109308001400c28fffff42241400c2af1400c28fa2 +:10931800ff004230ac8182a3b08180af21e8c00356 +:109328001c00be8f2000bd270800e00300000000dd +:10933800e8ffbd271400bfaf1000beaf21f0a003a7 +:109348006865400f00000000211840000100022459 +:1093580022006214000000000e65400f00000000ab +:1093680088bf033c2061628cc418027c206162ac17 +:10937800ac8182930100042421284000dca2400f24 +:1093880000000000ac8182932120000021284000c9 +:10939800dca2400f0000000088bf033c2061628c03 +:1093a80001000424c418827c206162ac01000424fa +:1093b8002765400f0000000001000224b08182af41 +:1093c800039d023cb882442427a4400f00000000fb +:1093d80001000224ff64400b00000000b08180af50 +:1093e800039d023cd082442427a4400f00000000c3 +:1093f8002110000021e8c0031400bf8f1000be8fa9 +:109408001800bd270800e00300000000f8ffbd2792 +:109418000400beaf21f0a003b081828f21e8c00311 +:109428000400be8f0800bd270800e003000000000c +:10943800e8ffbd271400bfaf1000beaf21f0a003a6 +:1094480088bf033c2061628cc418027c206162ac36 +:10945800ac8182930600042421284000dca2400f3e +:109468000000000088bf033c2061628c01000424d6 +:10947800c418827c206162ac0100022421e8c00388 +:109488001400bf8f1000be8f1800bd270800e0032e +:1094980000000000e0ffbd271c00bfaf1800beaff2 +:1094a80021f0a0032000c4af88bf033c2061628c78 +:1094b800c418027c206162acad818293050004244b +:1094c80021284000dca2400f000000001000c2a3c9 +:1094d800ad8182932120000021284000dca2400faa +:1094e800000000001000c2a388bf033c2061628c0a +:1094f80001000424c418827c206162ac2000c28f61 +:1095080007004010000000001000c293039d033cb8 +:10951800f08264242128400038a4400f0000000095 +:109528001000c29321e8c0031c00bf8f1800be8f33 +:109538002000bd270800e00300000000e0ffbd2771 +:109548001c00bfaf1800beaf21f0a003212000000f +:109558002765400f000000001000c2a31000c2934e +:1095680001004230ff0042300400401000000000bb +:10957800010002246265400b000000002110000079 +:1095880021e8c0031c00bf8f1800be8f2000bd2734 +:109598000800e00300000000e0ffbd271c00bfaf8b +:1095a8001800beaf21f0a00388bf033c2061628c85 +:1095b800c418027c206162acad81829390000424bf +:1095c80021284000dca2400f00000000ad818293fa +:1095d8002120000021284000dca2400f00000000ec +:1095e800ad8182932120000021284000dca2400f99 +:1095f80000000000ad818293212000002128400056 +:10960800dca2400f00000000ad8182932120000001 +:1096180021284000dca2400f000000001000c2a377 +:10962800ad8182932120000021284000dca2400f58 +:10963800000000001100c2a388bf033c2061628cb7 +:1096480001000424c418827c206162ac1000c3931a +:10965800bf00022405006214000000001100c3933b +:10966800410002240c006210000000001000c393a7 +:109678001100c293039d043c1083842421286000b8 +:109688002130400038a4400f0000000021100000e5 +:10969800b165400b000000001000c3931100c29395 +:1096a800039d043c4c838424212860002130400021 +:1096b80038a4400f000000000100022421e8c00384 +:1096c8001c00bf8f1800be8f2000bd270800e003d4 +:1096d80000000000e0ffbd271c00bfaf1800beafb0 +:1096e80021f0a0032000c4af2400c5af2800c6aff6 +:1096f8002800c38f2400c28f21106200ffff43247b +:109708002000023c2a1062000400401400000000ff +:10971800211000001166400b0000000088bf033cc8 +:109728002061628cc418027c206162acad81829396 +:109738000b00042421284000dca2400f0000000098 +:109748002800c38fff00023c2410620003140200ab +:10975800ff00423021184000ac8182932120600034 +:1097680021284000dca2400f000000002800c28f22 +:1097780000ff423003120200ff004230211840006f +:10978800ac8182932120600021284000dca2400f98 +:10979800000000002800c28fff004230211840005e +:1097a800ac8182932120600021284000dca2400f78 +:1097b80000000000ac818293212000002128400095 +:1097c800dca2400f000000001000c0af0666400b8e +:1097d80000000000ac818293de00042421284000b0 +:1097e800dca2400f000000001400c2a32000c28fba +:1097f8001400c393000043a02000c28f010042243c +:109808002000c2af1000c28f010042241000c2af76 +:109818001000c38f2400c28f2a106200edff40148d +:109828000000000088bf033c2061628c0100042412 +:10983800c418827c206162ac0100022421e8c003c4 +:109848001c00bf8f1800be8f2000bd270800e00352 +:1098580000000000e8ffbd271400bfaf1000beaf36 +:1098680021f0a0031800c4af1800c28fff0f4230c8 +:109878000400401000000000211000005b66400b4f +:10988800000000000e65400f0000000088bf033c88 +:109898002061628cc418027c206162acac81829326 +:1098a8002000042421284000dca2400f0000000012 +:1098b8001800c38fff00023c24106200031402004a +:1098c800ff00423021184000ac81829321206000c3 +:1098d80021284000dca2400f000000001800c28fc1 +:1098e80000ff423003120200ff00423021184000fe +:1098f800ac8182932120600021284000dca2400f27 +:10990800000000001800c28fff00423021184000fc +:10991800ac8182932120600021284000dca2400f06 +:109928000000000088bf033c2061628c0100042411 +:10993800c418827c206162ac1800c28f01004224e6 +:109948001800c2af000000005165400f0000000081 +:109958002118400001000224fbff621000000000f3 +:109968000100022421e8c0031400bf8f1000be8f3d +:109978001800bd270800e00300000000e8ffbd272d +:109988001400bfaf1000beaf21f0a0031800c4af91 +:109998001c00c5af1800c28fffff42300400401002 +:1099a8000000000021100000b066400b000000001d +:1099b8001800c38fffff0234211862002000023c08 +:1099c8002a1062000400401400000000211000006a +:1099d800b066400b000000000e65400f000000005c +:1099e80088bf033c2061628cc418027c206162ac91 +:1099f800ac818293d800042421284000dca2400fc7 +:109a0800000000001800c38fff00023c2410620011 +:109a180003140200ff00423021184000ac818293f9 +:109a28002120600021284000dca2400f0000000037 +:109a38001800c28f00ff423003120200ff004230bc +:109a480021184000ac818293212060002128400029 +:109a5800dca2400f000000001800c28fff00423057 +:109a680021184000ac818293212060002128400009 +:109a7800dca2400f0000000088bf033c2061628c1c +:109a880001000424c418827c206162ac1c00c28fcf +:109a98000800401000000000000000005165400f61 +:109aa800000000002118400001000224fbff6210a2 +:109ab800000000000100022421e8c0031400bf8f49 +:109ac8001000be8f1800bd270800e003000000004a +:109ad800d8ffbd272400bfaf2000beaf21f0a003f0 +:109ae8002800c4af2c00c5af2800c28fff0f42303a +:109af8000400401000000000211000001f67400b08 +:109b0800000000002c00c38f01000224040062142e +:109b1800000000002800c48f1766400f00000000f6 +:109b280000a0023c8c1d42241000c2af1400c0af3c +:109b38001a67400b000000001000c28f000042901e +:109b48001800c2a30e65400f000000002800c38f54 +:109b5800ff00023c24106200031402001900c2a393 +:109b68002800c28f00ff4230031202001a00c2a36d +:109b78002800c28f1b00c2a31c00c0af88bf033cd3 +:109b88002061628cc418027c206162acac81829333 +:109b98000200042421284000dca2400f000000003d +:109ba8001900c29321184000ac81829321206000e3 +:109bb80021284000dca2400f000000001a00c293d8 +:109bc80021184000ac8182932120600021284000a8 +:109bd800dca2400f000000001b00c29321184000c7 +:109be800ac8182932120600021284000dca2400f34 +:109bf800000000001800c393ac818293212060000c +:109c080021284000dca2400f0000000088bf033c70 +:109c18002061628c01000424c418827c206162ac3b +:109c28001000c28f010042241000c2af2800c28f6a +:109c3800010042242800c2af000000005165400f17 +:109c4800000000002118400001000224fbff621000 +:109c5800000000001400c28f010042241400c2afab +:109c68001400c28f00104228b3ff40140000000007 +:109c78000100022421e8c0032400bf8f2000be8f0a +:109c88002800bd270800e00300000000e8ffbd270a +:109c98001400bfaf1000beaf21f0a0031800c4af7e +:109ca8002110a0002000c6af1c00c2a31800c38f5b +:109cb8002000023c2b106200040040140000000049 +:109cc800211000007467400b000000000e65400f73 +:109cd8000000000088bf033c2061628cc418027c2d +:109ce800206162acac8182930200042421284000e8 +:109cf800dca2400f000000001800c38fff00023ce8 +:109d08002410620002140200ff00423021184000b3 +:109d1800ac8182932120600021284000dca2400f02 +:109d2800000000001800c28f00ff4230021202003b +:109d3800ff00423021184000ac818293212060004e +:109d480021284000dca2400f000000001800c28f4c +:109d5800ff00423021184000ac818293212060002e +:109d680021284000dca2400f000000001c00c29324 +:109d780021184000ac8182932120600021284000f6 +:109d8800dca2400f0000000088bf033c2061628c09 +:109d980001000424c418827c206162ac2000c28fb8 +:109da8000800401000000000000000005165400f4e +:109db800000000002118400001000224fbff62108f +:109dc800000000000100022421e8c0031400bf8f36 +:109dd8001000be8f1800bd270800e0030000000037 +:109de800c8ffbd273400bfaf3000beaf21f0a003cd +:109df8003800c4af3c00c5af4000c6af1c00c0afc0 +:109e08004000c38f3c00c28f211062002000c2af07 +:109e18004000c28f1000c2af3800c28f1400c2af1a +:109e28002000c38f2000023c2a1062004c0040141e +:109e38000000000021100000de67400b0000000059 +:109e48001000c28fff0f4324000044280b10640049 +:109e580003130200001302002400c2af00a0023c5a +:109e68008c1d4424001005242400c68fb765400fbc +:109e780000000000211840000100022404006210c4 +:109e88000000000021100000de67400b0000000009 +:109e980000a0023c8c1d43241000c48f2400c28ff4 +:109ea80023108200211062001800c2af2800c0af42 +:109eb800d767400b000000001400c28f00004380e9 +:109ec8001800c28f000043a01800c28f010042246e +:109ed8001800c2af1400c28f010042241400c2afa0 +:109ee8001000c28f010042241000c2af1000c38fbf +:109ef8002000c28f0b006214000000000100022441 +:109f08002800c2af010002241c00c2af2400c48f85 +:109f180001000524b666400f00000000da67400b18 +:109f2800000000001000c28fff0f423009004014eb +:109f380000000000010002242800c2af2400c48fe2 +:109f480001000524b666400f00000000da67400be8 +:109f5800000000002800c28fd7ff4010000000005a +:109f68001c00c28fb6ff4010000000000100022450 +:109f780021e8c0033400bf8f3000be8f3800bd27f2 +:109f88000800e0030000000060ffbd279c00bfaf91 +:109f98009800beaf21f0a003211880002110a00076 +:109fa800a800c6afa000c3a3a400c2a71100c0a305 +:109fb800a000c29306000324200043100000000004 +:109fc80007000324330043100000000001000324ad +:109fd800aa004314000000002800c227a800c48f6c +:109fe800212840007000062421380000c257400f85 +:109ff800000000001100c2a31100c2838f004014aa +:10a00800000000008c80828f8f004010000000004c +:10a01800a800c28f70004224908082af8c80828f0b +:10a028002800c327010004242128600009f8400003 +:10a0380000000000a168400b000000001c00c227bf +:10a04800a800c48f212840000400062421380000fd +:10a05800c257400f000000001100c2a31100c283c4 +:10a068007c004014000000008c80828f7c0040102f +:10a07800000000008c80828f1c00c3270600042487 +:10a088002128600009f8400000000000a168400b8a +:10a0980000000000010002241000c2a32000c22713 +:10a0a800a800c48f21284000080006242138000099 +:10a0b800c257400f000000001100c2a31100c28364 +:10a0c80051004014000000002400c2971200c2a7eb +:10a0d8002600c2971400c2a72200c2971600c2a782 +:10a0e8002000c2971800c2af1200c29703004014a4 +:10a0f8000000000001000224108082af1200c39704 +:10a108001400c297211862001600c297020062105c +:10a11800000000001000c0a31800c28f0100032433 +:10a128002c004310000000000100432c09006014bb +:10a1380000000000020003240e004310000000008d +:10a14800030003240f004310000000006f68400b59 +:10a15800000000001080838f010002242000621498 +:10a16800000000001800c28f108082af8468400b86 +:10a17800000000001800c28f108082af8468400b76 +:10a18800000000001080838f020002241700621074 +:10a19800000000001080838f040002241600621063 +:10a1a800000000001800c28f108082af8468400b46 +:10a1b800000000001080838f02000224110062104a +:10a1c8000000000004000224108082af8468400b65 +:10a1d80000000000000000008468400b0000000040 +:10a1e800000000008468400b000000000000000030 +:10a1f8008468400b00000000000000008468400be9 +:10a2080000000000000000001000c293170040107a +:10a21800000000008c80828f1700401000000000b2 +:10a228008c80828f070004241080852709f840005d +:10a2380000000000a168400b0000000000000000c2 +:10a24800a168400b0000000000000000a168400b5e +:10a258000000000000000000a168400b00000000a2 +:10a2680000000000a168400b000000000000000092 +:10a27800a168400b000000000000000021e8c003b6 +:10a288009c00bf8f9800be8fa000bd270800e00388 +:10a2980000000000e0ffbd271c00bfaf1800beafe4 +:10a2a80021f0a0032000c4af1000c0a32000c28f7b +:10a2b8008c8082af908080af04000224108082af2f +:10a2c80005000424029d023c909f45242d58400f10 +:10a2d800000000001000c2a31000c28321e8c003e0 +:10a2e8001c00bf8f1800be8f2000bd270800e003a8 +:10a2f80000000000d0ffbd272c00bfaf2800beaf74 +:10a3080021f0a0033000c4af3400c5af2110c00055 +:10a318003800c2a72000c0a33000c28f3800c397fe +:10a328003400c48f1000a4af1400a3af700003243e +:10a338001800a3af05000424820005242130400042 +:10a34800700007243555400f000000002000c2a30c +:10a358002000c28321e8c0032c00bf8f2800be8fd5 +:10a368003000bd270800e00300000000b8ffbd274b +:10a378004400bfaf4000beaf21f0a0034800c4af07 +:10a388004c00c5af2000c0a34c00c28f0106422c70 +:10a3980023004010000000004800c28f2800c2af10 +:10a3a8002800c28fc86e0324000043a44c00c28f4b +:10a3b8000300422482100200ffff43302800c28fae +:10a3c800020043a42800c28f040040a44c00c28f9e +:10a3d8000300422482100200ffff43302800c28f8e +:10a3e800060043a44c00c28fffff42304800c38fd1 +:10a3f8001000a3af1400a2af1800a0af05000424fa +:10a408008400052421300000213800003555400f14 +:10a41800000000002000c2a3a869400b0000000053 +:10a428002400c0af2c00c0af4800c38f2400c28fe7 +:10a43800211062003400c327212060002128400039 +:10a4480008000624349d400f000000004c00c38f14 +:10a458002400c28f23106200000503240105442c48 +:10a468000a1064002c00c2af4800c38f2400c28fba +:10a47800211062003000c2af3000c28fc86e0324c2 +:10a48800000043a44c00c28f030042248210020043 +:10a49800ffff43303000c28f020043a42400c28f64 +:10a4a8000300422482100200ffff43303000c28fb5 +:10a4b800040043a42c00c28f03004224821002002f +:10a4c800ffff43303000c28f060043a44800c38f0b +:10a4d8002400c28f211862002c00c28fffff423077 +:10a4e8001000a3af1400a2af1800a0af0500042409 +:10a4f8008400052421300000213800003555400f24 +:10a50800000000002000c2a34800c38f2400c28faf +:10a51800211862003400c227212060002128400051 +:10a5280008000624349d400f000000002400c38f5b +:10a538002c00c28f211062002400c2afa369400b17 +:10a54800000000002400c28ff8ff42244800c38f97 +:10a55800211062003400c327212060002128400018 +:10a5680008000624349d400f000000004c00c38ff3 +:10a578002400c28f23106200000503240105442c27 +:10a588000a1064002c00c2af2c00c28f03004324c1 +:10a59800fcff0224241062002c00c2af2400c28fea +:10a5a800f8ff42244800c38f211062003000c2af78 +:10a5b8003000c28fc86e0324000043a44c00c28f31 +:10a5c8000300422482100200ffff43303000c28f94 +:10a5d800020043a42400c28f030042248210020018 +:10a5e800ffff43303000c28f040043a42c00c28f09 +:10a5f8000300422482100200ffff43303000c28f64 +:10a60800060043a42400c28ff8ff42244800c38fe9 +:10a61800211862002c00c28fffff4230080042243c +:10a62800ffff42301000a3af1400a2af1800a0af84 +:10a63800050004248400052421300000213800008e +:10a648003555400f000000002000c2a32400c28f2f +:10a65800f8ff42244800c38f211862003400c22743 +:10a66800212060002128400008000624349d400f66 +:10a67800000000002400c38f2c00c28f211062004c +:10a688002400c2af2400c38f4c00c28f2b1062007d +:10a69800acff4014000000002000c28321e8c00382 +:10a6a8004400bf8f4000be8f4800bd270800e0036c +:10a6b80000000000e0ffbd271c00bfaf1800beafc0 +:10a6c80021f0a0032000c4af2400c5af2800c6af06 +:10a6d8002c00c7aff4ff02241000c2a39080828f21 +:10a6e8000400401400000000f4ff0224b66a400b86 +:10a6f800000000002000c28f100040100000000081 +:10a708002400c28f0d004010000000002800c28ff6 +:10a718000a004010000000002c00c28f0700401003 +:10a72800000000003000c28f04004010000000004c +:10a738003400c28f0500401400000000f1ff02241d +:10a748001000c2a3af6a400b000000009080838f06 +:10a758001600c2272120600021284000020006249c +:10a7680021380000c257400f00000000b20040141a +:10a77800000000001600c29700120200201e027c92 +:10a788001600c29702120200ffff42302016027c18 +:10a79800251062002016027cffff4230211840007d +:10a7a8002000c28f000043ac9080828f02004224b8 +:10a7b800908082af9080838f1600c227212060008e +:10a7c800212840000200062421380000c257400f0b +:10a7d800000000009b004014000000001600c29713 +:10a7e80000120200201e027c1600c297021202000c +:10a7f800ffff42302016027c251062002016027ce2 +:10a80800ffff42301600c2a71600c2972100422c53 +:10a818008f004010000000001600c3973400c28f5c +:10a82800400043a49080828f02004224908082af2f +:10a838009080838f1200c2272120600021284000c9 +:10a848000200062421380000c257400f0000000013 +:10a8580082004014000000001200c297001202009b +:10a86800201e027c1200c29702120200ffff423033 +:10a878002016027c251062002016027cffff423061 +:10a888001200c2a72800c28f000043941200c2978a +:10a898002b10620074004014000000001200c397df +:10a8a8002800c28f000043a49080828f02004224b7 +:10a8b800908082af9080838f1400c227212060008f +:10a8c800212840000200062421380000c257400f0a +:10a8d8000000000067004014000000001400c29748 +:10a8e80000120200201e027c1400c297021202000d +:10a8f800ffff42302016027c251062002016027ce1 +:10a90800ffff42301400c2a73000c28f00004394fa +:10a918001400c2972b106200590040140000000078 +:10a928001400c3973000c28f000043a49080828f28 +:10a9380002004224908082af9080848f3400c38fbd +:10a948001600c297212860002130400021380000fd +:10a95800c257400f000000004c00401400000000e7 +:10a968001600c297211840009080828f2110620043 +:10a97800908082af9080848f3400c28f200043245f +:10a988001600c297212860002130400021380000bd +:10a99800c257400f000000003f00401400000000b4 +:10a9a8001600c297211840009080828f2110620003 +:10a9b800908082af9080838f1200c2972120600020 +:10a9c8002400c58f2130400021380000c257400fb5 +:10a9d8000000000033004014000000001200c2977d +:10a9e800211840009080828f21106200908082aff1 +:10a9f8009080838f1400c297212060002c00c58f9f +:10aa08002130400021380000c257400f00000000ec +:10aa180027004014000000001400c29721184000cd +:10aa28009080828f21106200908082af21100000f8 +:10aa3800b66a400b0000000000000000af6a400b3f +:10aa48000000000000000000af6a400b000000009a +:10aa580000000000af6a400b00000000000000008a +:10aa6800af6a400b0000000000000000af6a400b16 +:10aa78000000000000000000af6a400b000000006a +:10aa880000000000af6a400b00000000000000005a +:10aa9800af6a400b0000000000000000af6a400be6 +:10aaa8000000000000000000af6a400b000000003a +:10aab80000000000212000002128000021300000b3 +:10aac80001000724c257400f000000001000c28395 +:10aad80021e8c0031c00bf8f1800be8f2000bd27cf +:10aae8000800e00300000000d8ffbd272400bfaf26 +:10aaf8002000beaf21f0a0032800c4af2c00c5afd2 +:10ab08003000c6af3400c7af200002241800c2a727 +:10ab1800400002241a00c2a72800c28f1a00c327c7 +:10ab28001000a3af3400c38f1400a3af212040004e +:10ab38002c00c58f1800c227213040003000c78f75 +:10ab4800af69400f0000000021e8c0032400bf8f58 +:10ab58002000be8f2800bd270800e0030000000089 +:10ab6800e0ffbd271c00bfaf1800beaf21f0a00357 +:10ab78002000c4af2110a0002400c2a7f4ff0224c3 +:10ab88001000c2a39080828f0400401400000000cf +:10ab9800f4ff0224056b400b000000002000c28f68 +:10aba8000500401400000000f1ff02241000c2a3b9 +:10abb800fe6a400b000000009080838f2400c2973b +:10abc800212060002000c58f21304000213800007e +:10abd800c257400f000000000400401400000000ad +:10abe80021100000056b400b000000000000000071 +:10abf8002120000021280000213000000100072446 +:10ac0800c257400f000000001000c28321e8c003b3 +:10ac18001c00bf8f1800be8f2000bd270800e0036e +:10ac280000000000e8ffbd271400bfaf1000beaf52 +:10ac380021f0a0032120000021280000213000007d +:10ac480001000724c257400f0000000021e8c0039c +:10ac58001400bf8f1000be8f1800bd270800e00346 +:10ac680000000000e8ffbd271400bfaf1000beaf12 +:10ac780021f0a0030b6b400f0000000021e8c00387 +:10ac88001400bf8f1000be8f1800bd270800e00316 +:10ac980000000000f8ffbd270400beaf21f0a003ac +:10aca800908080af21e8c0030400be8f0800bd2754 +:10acb8000800e00300000000d0ffbd272c00bfaf54 +:10acc8002800beaf21f0a0033000c4af2000c0a30d +:10acd8003000c28f2400c2af2400c2271000a0afea +:10ace8001400a0af1800a0af050004240500052437 +:10acf80021304000040007243555400f00000000b3 +:10ad08002000c2a32000c28321e8c0032c00bf8f0b +:10ad18002800be8f3000bd270800e00300000000b7 +:10ad2800e8ffbd271400bfaf1000beaf21f0a0039d +:10ad3800c96c400f0000000021e8c0031400bf8f59 +:10ad48001000be8f1800bd270800e00300000000b7 +:10ad5800e8ffbd271400bfaf1000beaf21f0a0036d +:10ad6800211080001800c2a3708082930f00432c2a +:10ad78003f0160100000000080180200029d023ca4 +:10ad88009cad4224211062000000428c0800400063 +:10ad980000000000d8ad019d00ae019d68ae019d88 +:10ada800d0ae019d38af019da4af019dd8af019de4 +:10adb8000cb0019d54b0019d9cb0019d20b1019d36 +:10adc80080b1019d98b1019dc4b1019df0b1019d73 +:10add800248180af2c8180af348180a3308180af03 +:10ade80001000224708082a3ffff02246c8082afde +:10adf800a46c400b000000002081828f001202002a +:10ae0800208182af1800c3932081828f21106200b5 +:10ae1800208182af6c80838f1800c293212060004c +:10ae2800212840006496400f000000006c8082af2b +:10ae38001800c393de00022405006214000000001d +:10ae480002000224708082a3a46c400b0000000062 +:10ae5800c96c400f00000000a46c400b000000000b +:10ae68002081828f00120200208182af1800c393d4 +:10ae78002081828f21106200208182af6c80838fb5 +:10ae88001800c29321206000212840006496400fda +:10ae9800000000006c8082af1800c393ad0002244c +:10aea800050062140000000003000224708082a3e1 +:10aeb800a46c400b00000000c96c400f00000000ab +:10aec800a46c400b000000002081828f0012020059 +:10aed800208182af1800c3932081828f21106200e5 +:10aee800208182af6c80838f1800c293212060007c +:10aef800212840006496400f000000006c8082af5b +:10af08001800c393be00022405006214000000006c +:10af180004000224708082a3a46c400b000000008f +:10af2800c96c400f00000000a46c400b000000003a +:10af38002081828f00120200208182af1800c39303 +:10af48002081828f21106200208182af6c80838fe4 +:10af58001800c29321206000212840006496400f09 +:10af6800000000006c8082af2081838fadde023c40 +:10af7800efbe42340500621000000000c96c400fab +:10af880000000000a46c400b000000000500022433 +:10af9800708082a3a46c400b000000001800c293cc +:10afa800348182a306000224708082a36c80838f80 +:10afb8001800c29321206000212840006496400fa9 +:10afc800000000006c8082afa46c400b0000000001 +:10afd8001800c293248182af07000224708082a3e4 +:10afe8006c80838f1800c2932120600021284000c4 +:10aff8006496400f000000006c8082afa46c400b88 +:10b00800000000002481828f00120200248182af98 +:10b018001800c3932481828f21106200248182af9b +:10b028006c80838f1800c293212060002128400083 +:10b038006496400f000000006c8082af0800022474 +:10b04800708082a3a46c400b000000002481828fd2 +:10b0580000120200248182af1800c3932481828fda +:10b0680021106200248182af6c80838f1800c29304 +:10b0780021206000212840006496400f0000000055 +:10b088006c8082af09000224708082a3a46c400bfc +:10b09800000000002481828f00120200248182af08 +:10b0a8001800c3932481828f21106200248182af0b +:10b0b8006c80838f1800c2932120600021284000f3 +:10b0c8006496400f000000006c8082af2481828f5c +:10b0d8009f00422c0500401400000000c96c400f7e +:10b0e80000000000a46c400b000000002481828f47 +:10b0f80005004014000000000b000224708082a3a9 +:10b10800a46c400b000000000a000224708082a397 +:10b11800a46c400b00000000f481828f1800c393d8 +:10b12800000043a0f481828f01004224f48182afa1 +:10b138002881828f01004224288182af6c80838f0e +:10b148001800c29321206000212840006496400f17 +:10b15800000000006c8082af2881838f2481828f59 +:10b1680048006214000000000b000224708082a3d3 +:10b17800a46c400b000000001800c293308182af1d +:10b188000c000224708082a3a46c400b0000000015 +:10b198003081828f00120200308182af1800c39381 +:10b1a8003081828f21106200308182af0d0002242d +:10b1b800708082a3a46c400b000000003081828f55 +:10b1c80000120200308182af1800c3933081828f51 +:10b1d80021106200308182af0e000224708082a3a9 +:10b1e800a46c400b000000003081828f0012020026 +:10b1f800308182af1800c3933081828f21106200a2 +:10b20800308182af6c80828f271002006c8082af01 +:10b218003081838f6c80828f0b00621000000000e9 +:10b22800348182932014027c2120400021280000d0 +:10b23800f23d400f00000000c96c400f0000000004 +:10b24800a46c400b00000000348182932014027c1f +:10b258002120400001000524f23d400f00000000bd +:10b26800c96c400f00000000a46c400b00000000f7 +:10b27800c96c400f0000000000000000a46c400be7 +:10b28800000000000000000021e8c0031400bf8f88 +:10b298001000be8f1800bd270800e0030000000062 +:10b2a800e0ffbd271c00bfaf1800beaf21f0a00310 +:10b2b8002000c4af2400c5af1000c0afbe6c400b67 +:10b2c800000000002000c28f000042902000c38fc1 +:10b2d800010063242000c3af21204000566b400fbb +:10b2e800000000001000c28f010042241000c2af0d +:10b2f8001000c38f2400c28f2a106200f1ff40148f +:10b308000000000021e8c0031c00bf8f1800be8f9a +:10b318002000bd270800e00300000000f8ffbd275b +:10b328000400beaf21f0a003248180af208180af4c +:10b338002c8180af348180a3308180af010002244a +:10b34800708082a3288180afffff02246c8082afc7 +:10b3580000a0023c802f4224f48182af21e8c00380 +:10b368000400be8f0800bd270800e00300000000ad +:10b37800d8ffbd272400bfaf2000beaf21f0a00337 +:10b38800211080002c00c5af2800c2a300a0023cf9 +:10b39800deff0324802f43a000a0023c802f42241c +:10b3a800adff0324010043a000a0023c802f4224eb +:10b3b800beff0324020043a000a0023c802f4224c9 +:10b3c800efff0324030043a000a0023c802f422487 +:10b3d8002800c393040043a02c00c28f0316020068 +:10b3e8001000c2a31000c39300a0023c802f422487 +:10b3f800050043a02c00c28f031402001000c2a352 +:10b408001000c39300a0023c802f4224060043a0f2 +:10b418002c00c28f031202001000c2a31000c393b5 +:10b4280000a0023c802f4224070043a02c00c28fba +:10b438001000c2a31000c39300a0023c802f422436 +:10b44800080043a0ffff02241400c2af2c00c28fe3 +:10b458000900422400a0033c802f642421284000d6 +:10b468002696400f000000001400c2af7480838f3e +:10b478002c00c28f211062001800c2af1400c28fc6 +:10b48800021602001000c2a31000c3931800c28f56 +:10b49800000043a01800c28f010042241800c2af68 +:10b4a8001400c28f021402001000c2a31000c3933c +:10b4b8001800c28f000043a01800c28f0100422468 +:10b4c8001800c2af1400c28f021202001000c2a3fb +:10b4d8001000c3931800c28f000043a01800c28f49 +:10b4e800010042241800c2af1400c28f1000c2a38a +:10b4f8001000c3931800c28f000043a01800c28f29 +:10b50800010042241800c2af2c00c28f0d00422453 +:10b5180000a0033c802f642421284000823d400f76 +:10b528000000000021e8c0032400bf8f2000be8f68 +:10b538002800bd270800e00300000000f8ffbd2731 +:10b548000400beaf21f0a0037480828f21e8c003fd +:10b558000400be8f0800bd270800e00300000000bb +:10b56800e8ffbd271400bfaf1000beaf21f0a00355 +:10b57800516d400f0000000001000324000043a0ab +:10b588000300042401000524de6c400f00000000c5 +:10b5980021e8c0031400bf8f1000be8f1800bd271c +:10b5a8000800e00300000000e8ffbd271400bfaf5b +:10b5b8001000beaf21f0a003211080001800c2a324 +:10b5c800516d400f0000000001000324000043a05b +:10b5d8001800c2932120400001000524de6c400fb2 +:10b5e8000000000021e8c0031400bf8f1000be8fc8 +:10b5f8001800bd270800e00300000000e8ffbd2791 +:10b608001400bfaf1000beaf21f0a00321108000ce +:10b618001800c2a3516d400f00000000000040a0b8 +:10b628001800c2932120400001000524de6c400f61 +:10b638000000000021e8c0031400bf8f1000be8f77 +:10b648001800bd270800e00300000000d8ffbd2750 +:10b658002400bfaf2000beaf21f0a003211080005e +:10b668002800c2a3960002241000c2af516d400ffb +:10b67800000000001400c2af1400c28f2800c3935a +:10b68800000043a01400c28f010042241400c2af7e +:10b698002800c38301000224260062140000000071 +:10b6a8001000c28f031602001800c2a31400c28f34 +:10b6b8001800c393000043a01400c28f0100422465 +:10b6c8001400c2af1000c28f031402001800c2a3f6 +:10b6d8001400c28f1800c393000043a01400c28f47 +:10b6e800010042241400c2af1000c28f03120200ee +:10b6f8001800c2a31400c28f1800c393000043a00f +:10b708001400c28f010042241400c2af1000c28f7f +:10b718001800c2a31400c28f1800c393000043a0ee +:10b728001400c28f010042241400c2afe36d400b25 +:10b73800000000001400c28f000040a01400c28f57 +:10b74800010042241400c2af1400c28f000040a0c0 +:10b758001400c28f010042241400c2af1400c28f2b +:10b76800000040a01400c28f010042241400c2afa0 +:10b778001400c28f000040a01400c28f01004224b0 +:10b788001400c2af0800042405000524de6c400f35 +:10b798000000000021e8c0032400bf8f2000be8ff6 +:10b7a8002800bd270800e00300000000e0ffbd27d7 +:10b7b8001c00bfaf1800beaf21f0a003211080000d +:10b7c8002400c5af2000c2a3516d400f0000000047 +:10b7d8001000c2af1000c28f2000c393000043a026 +:10b7e8001000c28f010042241000c2af2400c28f93 +:10b7f800031602001400c2a31000c28f1400c393e2 +:10b80800000043a01000c28f010042241000c2af04 +:10b818002400c28f031402001400c2a31000c28fb8 +:10b828001400c393000043a01000c28f01004224fb +:10b838001000c2af2400c28f031202001400c2a37a +:10b848001000c28f1400c393000043a01000c28fe1 +:10b85800010042241000c2af2400c28f1400c2a30a +:10b868001000c28f1400c393000043a01000c28fc1 +:10b87800010042241000c2af0d0004240500052475 +:10b88800de6c400f0000000021e8c0031c00bf8fe1 +:10b898001800be8f2000bd270800e003000000004c +:10b8a800e0ffbd271c00bfaf1800beaf21f0a0030a +:10b8b800211080002000c2a3516d400f000000003d +:10b8c8001000c2af1000c28f2000c393000043a035 +:10b8d8001000c28f010042241000c2af0a000424e5 +:10b8e80001000524de6c400f0000000021e8c003c1 +:10b8f8001c00bf8f1800be8f2000bd270800e00382 +:10b9080000000000e0ffbd271c00bfaf1800beaf5d +:10b9180021f0a003211080002000c2a3516d400f28 +:10b92800000000001000c2af1000c28f2000c393b7 +:10b93800000043a01000c28f010042241000c2afd3 +:10b948000f00042401000524de6c400f00000000f5 +:10b9580021e8c0031c00bf8f1800be8f2000bd2740 +:10b968000800e00300000000e0ffbd271c00bfaf97 +:10b978001800beaf21f0a003211080002000c2a350 +:10b98800516d400f000000001000c2af1000c28fc0 +:10b998002000c393000043a01000c28f010042247e +:10b9a8001000c2af1900042401000524de6c400f0a +:10b9b8000000000021e8c0031c00bf8f1800be8fe4 +:10b9c8002000bd270800e00300000000e0ffbd27bd +:10b9d8001c00bfaf1800beaf21f0a0032000c4af09 +:10b9e8002400c5af516d400f000000001000c2af29 +:10b9f8001400c0af1400c0af906e400b00000000f0 +:10ba08002000c28f00004290201c027c1000c28fd0 +:10ba1800000043a01000c28f010042241000c2aff2 +:10ba28002000c28f010042242000c2af1400c28f40 +:10ba3800010042241400c2af1400c38f2400c28f37 +:10ba48002a106200eeff4014000000001b000424ce +:10ba58002400c58fde6c400f0000000021e8c00301 +:10ba68001c00bf8f1800be8f2000bd270800e00310 +:10ba780000000000f8ffbd270400beaf21f0a003be +:10ba8800211080000800c2a70800c28700ff4230ca +:10ba980003120200201e027c0800c2970012020056 +:10baa8002016027c251062002016027c21e8c003c3 +:10bab8000400be8f0800bd270800e0030000000056 +:10bac800f8ffbd270400beaf21f0a0030800c4aff3 +:10bad8000800c28f021e02000800c48fff00023c4b +:10bae8002410820003120200251862000800c28f89 +:10baf80000ff423000120200251862000800c28fc1 +:10bb0800001602002510620021e8c0030400be8f61 +:10bb18000800bd270800e00300000000d8ffbd278b +:10bb28002400bfaf2000beaf21f0a0032800c4af9f +:10bb38002c00c5af3000c6af1000c0af1400c2273c +:10bb480021204000029d023c504245242c00c68f13 +:10bb580012a3400f000000002c00c28f0f00422cdf +:10bb68001f004010000000001000c0afe76e400b3f +:10bb7800000000001000c28f2800c38f211062004f +:10bb880030000324000043a01000c28f01004224ab +:10bb98001000c2af3000c28fffff43241000c28fd5 +:10bba8002a104300f3ff4014000000001000c28f69 +:10bbb8002800c38f212062003000c38f1000c28f7d +:10bbc800231062001400c3272128600021304000a0 +:10bbd800349d400f00000000cb6f400b00000000b8 +:10bbe8002c00c28fff00422c1f00401000000000f4 +:10bbf8001000c0af096f400b000000001000c28f9a +:10bc08002800c38f2110620030000324000043a0e5 +:10bc18001000c28f010042241000c2af3000c28f52 +:10bc2800feff43241000c28f2a104300f3ff401484 +:10bc3800000000001000c28f2800c38f212062007e +:10bc48003000c38f1000c28f231062001400c32776 +:10bc58002128600021304000349d400f0000000082 +:10bc6800cb6f400b000000002c00c28fff0f422c4e +:10bc78001f004010000000001000c0af2b6f400be9 +:10bc8800000000001000c28f2800c38f211062003e +:10bc980030000324000043a01000c28f010042249a +:10bca8001000c2af3000c28ffdff43241000c28fc6 +:10bcb8002a104300f3ff4014000000001000c28f58 +:10bcc8002800c38f212062003000c38f1000c28f6c +:10bcd800231062001400c32721286000213040008f +:10bce800349d400f00000000cb6f400b00000000a7 +:10bcf8002c00c38fffff02342b1062001f0040107e +:10bd0800000000001000c0af4e6f400b00000000a4 +:10bd18001000c28f2800c38f211062003000032456 +:10bd2800000043a01000c28f010042241000c2afdf +:10bd38003000c28ffcff43241000c28f2a1043003a +:10bd4800f3ff4014000000001000c28f2800c38fca +:10bd5800212062003000c38f1000c28f23106200c0 +:10bd68001400c3272128600021304000349d400f73 +:10bd780000000000cb6f400b000000002c00c38fb8 +:10bd88000f00023cffff42342b1062001f004010de +:10bd9800000000001000c0af726f400b00000000f0 +:10bda8001000c28f2800c38f2110620030000324c6 +:10bdb800000043a01000c28f010042241000c2af4f +:10bdc8003000c28ffbff43241000c28f2a104300ab +:10bdd800f3ff4014000000001000c28f2800c38f3a +:10bde800212062003000c38f1000c28f2310620030 +:10bdf8001400c3272128600021304000349d400fe3 +:10be080000000000cb6f400b000000002c00c38f27 +:10be1800ff00023cffff42342b1062001f0040105d +:10be2800000000001000c0af966f400b000000003b +:10be38001000c28f2800c38f211062003000032435 +:10be4800000043a01000c28f010042241000c2afbe +:10be58003000c28ffaff43241000c28f2a1043001b +:10be6800f3ff4014000000001000c28f2800c38fa9 +:10be7800212062003000c38f1000c28f231062009f +:10be88001400c3272128600021304000349d400f52 +:10be980000000000cb6f400b000000002c00c38f97 +:10bea800ff0f023cffff42342b1062001d004010c0 +:10beb800000000001000c0afba6f400b0000000087 +:10bec8001000c28f2800c38f2110620030000324a5 +:10bed800000043a01000c28f010042241000c2af2e +:10bee8003000c28ff9ff43241000c28f2a1043008c +:10bef800f3ff4014000000001000c28f2800c38f19 +:10bf0800212062003000c38f1000c28f231062000e +:10bf18001400c3272128600021304000349d400fc1 +:10bf2800000000000100022421e8c0032400bf8fa4 +:10bf38002000be8f2800bd270800e0030000000095 +:10bf4800d8ffbd272400bfaf2000beaf21f0a0035b +:10bf58002800c4af2c00c5af1000c0af1400c22722 +:10bf680021204000029d023c504245242c00c68fef +:10bf780012a3400f000000002c00c28f0f00422cbb +:10bf880007004010000000001400c3832800c28f7f +:10bf9800000043a001000224a170400b0000000033 +:10bfa8002c00c28fff00422c160040100000000039 +:10bfb8001000c0affc6f400b000000001000c28fe3 +:10bfc8002800c38f211062001000c38f1000c427ff +:10bfd8002118830004006380000043a01000c28f72 +:10bfe800010042241000c2af1000c28f0200422894 +:10bff800f2ff40140000000002000224a170400b70 +:10c00800000000002c00c28fff0f422c16004010c9 +:10c01800000000001000c0af1570400b00000000c9 +:10c028001000c28f2800c38f211062001000c38f38 +:10c038001000c4272118830004006380000043a077 +:10c048001000c28f010042241000c2af1000c28f3e +:10c0580003004228f2ff40140000000003000224fd +:10c06800a170400b000000002c00c38fffff0234ba +:10c078002b10620016004010000000001000c0af36 +:10c088002f70400b000000001000c28f2800c38fe3 +:10c09800211062001000c38f1000c42721188300ec +:10c0a80004006380000043a01000c28f01004224f6 +:10c0b8001000c2af1000c28f04004228f2ff4014e3 +:10c0c8000000000004000224a170400b00000000e2 +:10c0d8002c00c38f0f00023cffff42342b1062007c +:10c0e80016004010000000001000c0af4a70400b5e +:10c0f800000000001000c28f2800c38f21106200ca +:10c108001000c38f1000c427211883000400638027 +:10c11800000043a01000c28f010042241000c2afeb +:10c128001000c28f05004228f2ff401400000000f2 +:10c1380005000224a170400b000000002c00c38ff2 +:10c14800ff00023cffff42342b1062001600401033 +:10c15800000000001000c0af6570400b0000000038 +:10c168001000c28f2800c38f211062001000c38ff7 +:10c178001000c4272118830004006380000043a036 +:10c188001000c28f010042241000c2af1000c28ffd +:10c1980006004228f2ff40140000000006000224b6 +:10c1a800a170400b000000002c00c38fff0f023c61 +:10c1b800ffff42342b106200160040100000000000 +:10c1c8001000c0af8070400b000000001000c28f4c +:10c1d8002800c38f211062001000c38f1000c427ed +:10c1e8002118830004006380000043a01000c28f60 +:10c1f800010042241000c2af1000c28f070042287d +:10c20800f2ff40140000000007000224a170400b58 +:10c21800000000002c00c38fffff022416006210ec +:10c22800000000001000c0af9970400b0000000033 +:10c238001000c28f2800c38f211062001000c38f26 +:10c248001000c4272118830004006380000043a065 +:10c258001000c28f010042241000c2af1000c28f2c +:10c2680008004228f2ff40140000000008000224e1 +:10c27800a170400b000000002110000021e8c0035d +:10c288002400bf8f2000be8f2800bd270800e003d0 +:10c2980000000000e0ffbd271c00bfaf1800beafc4 +:10c2a80021f0a0032000c4af2110a0002800c6afd1 +:10c2b8002400c2a31000c0af2400c2931400c327f7 +:10c2c80021206000029d033c50426524213040003b +:10c2d80012a3400f000000002400c2930f00422c5c +:10c2e8001f004010000000001000c0afc770400bd6 +:10c2f800000000001000c28f2000c38f21106200d0 +:10c3080030000324000043a01000c28f0100422423 +:10c318001000c2af2800c28fffff43241000c28f55 +:10c328002a104300f3ff4014000000001000c28fe1 +:10c338002000c38f212062002800c38f1000c28f05 +:10c34800231062001400c327212860002130400018 +:10c35800349d400f00000000fa70400b0000000000 +:10c368002400c393ff0002241d0062100000000097 +:10c378001000c0afe970400b000000001000c28f31 +:10c388002000c38f2110620030000324000043a066 +:10c398001000c28f010042241000c2af2800c28fd3 +:10c3a800feff43241000c28f2a104300f3ff4014fd +:10c3b800000000001000c28f2000c38f21206200ff +:10c3c8002800c38f1000c28f231062001400c327f7 +:10c3d8002128600021304000349d400f00000000fb +:10c3e8000100022421e8c0031c00bf8f1800be8f83 +:10c3f8002000bd270800e00300000000e8ffbd277b +:10c408001400beaf21f0a0031800c4af1c00c5afd4 +:10c418002000c6af0000c0af0400c0af0800c0af26 +:10c42800010002240c00c2af2000c38f10000224b8 +:10c4380036006214000000001c00c28fffff422477 +:10c448000000c2af4071400b000000001c00c28f0a +:10c45800ffff43240000c28f09006214000000009f +:10c468000000c28f1800c38f2110620000004280b4 +:10c47800d0ff42240800c2af3d71400b000000000d +:10c488000000c28f0400c2af2c71400b00000000f6 +:10c498000c00c28f001102000c00c2af0400c28f52 +:10c4a800010042240400c2af1c00c28ffeff4324d7 +:10c4b8000400c28f2a106200f5ff4010000000003f +:10c4c8000000c28f1800c38f211062000000428054 +:10c4d800d0ff4224211840000c00c28f021862705d +:10c4e8000800c28f211043000800c2af0000c28fad +:10c4f800ffff42240000c2af0000c28fd3ff4104f7 +:10c50800000000007671400b000000002000c38f7f +:10c518000a0002242e006214000000000000c0afd0 +:10c528007171400b000000000000c28f050040142c +:10c5380000000000010002240c00c2af6371400b30 +:10c54800000000000400c0af5e71400b0000000056 +:10c558000c00c28f40100200801802002110430016 +:10c568000c00c2af0400c28f010042240400c2af15 +:10c578000400c38f0000c28f2a106200f4ff401429 +:10c58800000000000000c28f1800c38f2110620055 +:10c5980000004280d0ff4224211840000c00c28fc6 +:10c5a800021862700800c28f211043000800c2af51 +:10c5b8000000c28f010042240000c2af0000c38ff8 +:10c5c8001c00c28f2a106200d7ff40140000000030 +:10c5d8000800c28f21e8c0031400be8f1800bd27d1 +:10c5e8000800e00300000000e0ffbd271c00bfaf0b +:10c5f8001800beaf21f0a0032000c4af2110a00096 +:10c608002400c2a32400c2931000c3272120600085 +:10c61800029d033c504265242130400012a3400f84 +:10c62800000000002400c2930f00422c07004010b5 +:10c63800000000001000c3832000c28f000043a048 +:10c6480001000224a471400b000000002400c393e1 +:10c65800ff0002240b006210000000001000c383da +:10c668002000c28f000043a02000c28f0100422496 +:10c678001100c383000043a002000224a471400bf0 +:10c68800000000002110000021e8c0031c00bf8f3b +:10c698001800be8f2000bd270800e003000000003e +:10c6a800e8ffbd271400beaf21f0a0031800c4aff7 +:10c6b8001c00c5af0400c0af0000c0afc571400b7f +:10c6c80000000000029d023c0400c38f8018030094 +:10c6d80054424224211062000000428c0800c2af7c +:10c6e8000000c28f1800c38f211062000000428032 +:10c6f800211840000800c28f261062000400c2af53 +:10c708000000c28f010042240000c2af0000c38fa6 +:10c718001c00c28f2a106200eaff401400000000cb +:10c728000400c28f21e8c0031400be8f1800bd2783 +:10c738000800e00300000000f8ffbd270400beafba +:10c7480021f0a0030800c4af21e8c0030400be8f95 +:10c758000800bd270800e0030000000058ffbd27bf +:10c76800a400bfafa000beaf21f0a003a800c4afd3 +:10c77800ac00c5afb000c6af1000c0a31400c0af76 +:10c788000f72400b00000000800002241800c2afa6 +:10c79800b000c38f1400c28f231862001800c28f24 +:10c7a8002b1062000500401000000000b000c38f8d +:10c7b8001400c28f231062001800c2afac00c38ff0 +:10c7c8001400c28f211062001c00c32721206000c2 +:10c7d800212840001800c68fcc5b400f00000000e5 +:10c7e8001000c2a31000c28319004014000000000a +:10c7f800a800c38f1400c28f211062001c00c32739 +:10c8080021206000212840001800c68fb4a1400fe5 +:10c81800000000001000c2a31000c2830f004014e3 +:10c82800000000001400c38f1800c28f211062009e +:10c838001400c2af1400c38fb000c28f2b10620067 +:10c84800d1ff4014000000001a72400b00000000e5 +:10c85800000000001a72400b0000000000000000f9 +:10c868001000c28321e8c003a400bf8fa000be8fc0 +:10c87800a800bd270800e00300000000e0ffbd2776 +:10c888001c00bfaf1800beaf21f0a0032000c4af4a +:10c898002400c5af2800c6aff4ff02241000c2a3cd +:10c8a800140002241100c2a33d72400b00000000d6 +:10c8b8002000c48f2400c58f2800c68f025c400f5b +:10c8c800000000001000c2a31000c283070040143b +:10c8d800000000002000c48f2400c58f2800c68fe8 +:10c8e800d971400f000000001000c2a31000c283dd +:10c8f80009004010000000001100c2932b10020034 +:10c90800ff0042301100c393ffff63241100c3a34b +:10c91800e7ff4014000000001000c28321e8c003b4 +:10c928001c00bf8f1800be8f2000bd270800e00341 +:10c9380000000000f0ffbd270c00beaf21f0a003ef +:10c94800211880001400c5af2110c0001000c3a337 +:10c958001800c2a71000c2930000c2a30200c0a71b +:10c968008a72400b000000000400c0a78372400bcd +:10c97800000000000200c2971400c38f211062005b +:10c9880000004290211840000400c29704104300a0 +:10c9980080004230c3110200201c027c0000c293b8 +:10c9a80082110200ff0042302014027c0100423054 +:10c9b8002014027c261062002014027c0600c2a308 +:10c9c8000000c293401002002014027c7f00423015 +:10c9d8002024027c0600c39321106000c0100200ce +:10c9e80021104300ff0042302014027c26108200f0 +:10c9f8002014027c0000c2a30400c2970100422454 +:10ca08000400c2a70400c2970800422cd9ff4014b2 +:10ca1800000000000200c297010042240200c2a7e1 +:10ca28000200c3971800c2972b106200ceff401473 +:10ca3800000000000000c29321e8c0030c00be8f74 +:10ca48001000bd270800e00300000000d8ffbd2744 +:10ca58002400bfaf2000beaf1c00b0af21f0a00380 +:10ca68002800c4af1000c0a32800c28f0000438c68 +:10ca7800bc1a023cf9de42340300621000000000d8 +:10ca8800f4ff02241000c2a32800c28f4400508c77 +:10ca98002800c28f7f000424212840004400062477 +:10caa8004f72400f00000000030002120000000057 +:10cab800f4ff02241000c2a31000c28321e8c003bf +:10cac8002400bf8f2000be8f1c00b08f2800bd2718 +:10cad8000800e00300000000e0ffbd271c00bfaf16 +:10cae8001800beaf21f0a0032000c4af2000c28f01 +:10caf800212040000010052448000624cc5b400f8c +:10cb0800000000001000c2a31000c28305004014fa +:10cb1800000000002000c48f9572400f0000000044 +:10cb28001000c2a31000c2830f00401000000000d4 +:10cb38002000c28f21204000002005244800062440 +:10cb4800cc5b400f000000001000c2a31000c2839d +:10cb580005004014000000002000c48f9572400fab +:10cb6800000000001000c2a31000c28321e8c00327 +:10cb78001c00bf8f1800be8f2000bd270800e003ef +:10cb880000000000e0ffbd271c00bfaf1800beafcb +:10cb980021f0a0032000c4aff4ff02241000c2a3b8 +:10cba8000020042400100524755c400f00000000dc +:10cbb8001000c2a31000c283360040140000000019 +:10cbc8002000c28f0800428c010043242000c28f3d +:10cbd800080043ac2000c28f7f00042421284000b5 +:10cbe800440006244f72400f000000002118400046 +:10cbf8002000c28f440043ac2000c28f2120400097 +:10cc080000200524480006242172400f000000007f +:10cc18001000c2a31000c2831e00401400000000d0 +:10cc28000010042400100524755c400f000000006b +:10cc38001000c2a31000c2831600401400000000b8 +:10cc48002000c28f0800428c010043242000c28fbc +:10cc5800080043ac2000c28f7f0004242128400034 +:10cc6800440006244f72400f0000000021184000c5 +:10cc78002000c28f440043ac2000c28f2120400016 +:10cc880000100524480006242172400f000000000f +:10cc98001000c2a31000c28321e8c0031c00bf8f8c +:10cca8001800be8f2000bd270800e0030000000028 +:10ccb800a0ffbd275c00bfaf5800beaf21f0a003a6 +:10ccc8006000c4af6400c5af6800c6af6400c28f1f +:10ccd80008004010000000006800c28f05004010e6 +:10cce800000000006000c28f0a00422c04004014bb +:10ccf8000000000021100000a473400b0000000099 +:10cd08006000c28f0300432c060060100000000082 +:10cd18002b10020012004014000000005073400b5a +:10cd280000000000090003240d004310000000006b +:10cd38009273400b000000006400c28f000040acfa +:10cd4800da5c400f00000000401402002118400087 +:10cd58006800c28f000043aca373400b00000000c2 +:10cd6800dc84400f0000000021184000010002246c +:10cd7800040062100000000021100000a473400ba2 +:10cd8800000000001000c22721204000b872400fa8 +:10cd98000000000004004010000000002110000006 +:10cda800a473400b000000006000c38f020002243f +:10cdb80006006214000000002c00c38f6400c28fbc +:10cdc800000043ac8873400b000000006000c38f74 +:10cdd8000100022406006214000000002000c38f36 +:10cde8006400c28f000043ac8873400b0000000051 +:10cdf8006000c38f090002240700621400000000cd +:10ce08002000c38f0400023c00c042342118620095 +:10ce18006400c28f000043ac039d033c6000c28fd6 +:10ce2800d88e6324c0100200211062000400438cd5 +:10ce38006800c28f000043aca373400b00000000e1 +:10ce4800039d023c6000c38fc0180300d88e4224a3 +:10ce5800211062000000438c6400c28f000043acc4 +:10ce6800039d033c6000c28fd88e6324c01002006b +:10ce7800211062000400438c6800c28f000043ac9c +:10ce8800000000000100022421e8c0035c00bf8ffd +:10ce98005800be8f6000bd270800e00300000000b6 +:10cea800e0ffbd271c00bfaf1800beaf21f0a003f4 +:10ceb8002000c4af2118a0002110c0002400c3a383 +:10cec8002800c2a3dc84400f0000000021184000a5 +:10ced800010002240400621000000000f4ff022494 +:10cee800f373400b000000002000c28f0a00422ca0 +:10cef8000400401400000000f1ff0224f373400b0b +:10cf0800000000001400c2272000c48f1000c327af +:10cf180021286000213040002e73400f00000000df +:10cf28000400401400000000f4ff0224f373400bd7 +:10cf3800000000001000c28fff0f423004004010b4 +:10cf480000000000f1ff0224f373400b0000000012 +:10cf58002400c3932800c29321106200001b020022 +:10cf68001400c28f2b104300040040100000000082 +:10cf7800f4ff0224f373400b000000002400c29366 +:10cf8800001b02001000c28f211062001000c2af07 +:10cf98001000c38f2800c2930013020021206000f4 +:10cfa80021284000755c400f00000000040040107c +:10cfb80000000000f4ff0224f373400b000000009f +:10cfc8002110000021e8c0031c00bf8f1800be8f8d +:10cfd8002000bd270800e00300000000e0ffbd2797 +:10cfe8001c00bfaf1800beaf21f0a0032000c4afe3 +:10cff8002400c5af2800c6af2c00c7afdc84400fa3 +:10d008000000000021184000010002240400621002 +:10d0180000000000f4ff02244174400b00000000ef +:10d028002400c28f05004010000000002000c28fbd +:10d038000a00422c0400401400000000f1ff022402 +:10d048004174400b000000001400c2272000c48f68 +:10d058001000c32721286000213040002e73400fa4 +:10d06800000000000400401400000000f4ff022447 +:10d078004174400b000000002800c38f2c00c28fb1 +:10d08800211862001400c28f2b10430008004014be +:10d09800000000002800c38f2c00c28f21186200f6 +:10d0a8002800c28f2b10620004004010000000000e +:10d0b800f4ff02244174400b000000001000c38fed +:10d0c8002800c28f211062001000c2af1000c28f6a +:10d0d8002400c48f212840002c00c68f025c400f1a +:10d0e800000000000400401000000000f4ff0224cb +:10d0f8004174400b000000002110000021e8c0032b +:10d108001c00bf8f1800be8f2000bd270800e00359 +:10d1180000000000e0ffbd271c00bfaf1800beaf35 +:10d1280021f0a0032000c4af2400c5af2800c6af7b +:10d138002c00c7afdc84400f00000000211840001d +:10d14800010002240400621000000000f4ff022421 +:10d158008f74400b000000002400c28f05004010af +:10d16800000000002000c28f0a00422c0400401476 +:10d1780000000000f1ff02248f74400b0000000043 +:10d188001400c2272000c48f1000c3272128600084 +:10d19800213040002e73400f0000000004004014ae +:10d1a80000000000f4ff02248f74400b0000000010 +:10d1b8002800c38f2c00c28f211862001400c28f70 +:10d1c8002b10430008004014000000002800c38f03 +:10d1d8002c00c28f211862002800c28f2b10620019 +:10d1e8000400401000000000f4ff02248f74400b7c +:10d1f800000000001000c38f2800c28f21106200b9 +:10d208001000c2af1000c28f2400c48f2128400034 +:10d218002c00c68fcc5b400f0000000004004010bb +:10d2280000000000f4ff02248f74400b000000008f +:10d238002110000021e8c0031c00bf8f1800be8f1a +:10d248002000bd270800e0030000000098ffbd276c +:10d258006400bfaf6000beaf21f0a003dc84400fc4 +:10d2680000000000211840000100022404006210a0 +:10d2780000000000f4ff0224be74400b0000000010 +:10d288001400c22721204000b872400f000000009f +:10d298000400401000000000f4ff0224be74400b9c +:10d2a800000000003000c28f1000c2af2400c28fff +:10d2b8003000c2af1000c28f2400c2af9823023cd6 +:10d2c800187742343400c2af1400c227212040002e +:10d2d800e372400f0000000004004010000000004e +:10d2e800f4ff0224be74400b00000000211000006f +:10d2f80021e8c0036400bf8f6000be8f6800bd27af +:10d308000800e00300000000e8ffbd271400bfafdd +:10d318001000beaf21f0a00380bf023c000640ac65 +:10d3280080bf033c0006628c010004240429827c2f +:10d33800000662ac80bf023c100640ac80bf023cd5 +:10d3480010270324200643ac88bf033ca010628c3e +:10d35800020004248420827ca01062ac88bf033cb5 +:10d36800a010628c030004240408827ca01062ac24 +:10d3780088bf033c3010628c0421027c301062ac00 +:10d3880088bf033c6010628c010004240421827c65 +:10d39800601062ac80bf033c0006628c010004246c +:10d3a800c47b827c000662ac00a0023c680f442467 +:10d3b800212800000801062411a1400f00000000e8 +:10d3c80021e8c0031400bf8f1000be8f1800bd27ce +:10d3d8000800e00300000000f0ffbd270c00beaf0e +:10d3e80021f0a0031000c4af0000c0af1000c28f2e +:10d3f800c0100200801802002318620000a0023c3e +:10d40800680f4224211062001400428c460040102c +:10d41800000000001000c28fc01002008018020037 +:10d428002318620000a0023c680f42242110620009 +:10d438000400438c1000c28fc0100200802002003c +:10d448002320820000a0023c680f422421108200a1 +:10d458000000428c231062000000c2af0000c38f9e +:10d468001000c28fc010020080200200232082001a +:10d4780000a0023c680f4224211082000c00428c5c +:10d488002b1062000c004014000000001000c28f36 +:10d49800c0100200801802002318620000a0023c9d +:10d4a800680f422421106200040040ac01000224ed +:10d4b8004d75400b000000000000c28f1a004104a7 +:10d4c800000000000000c28fe80342242118400039 +:10d4d8001000c28fc01002008020020023208200aa +:10d4e80000a0023c680f4224211082000c00428cec +:10d4f8002b1062000c004014000000001000c28fc6 +:10d50800c0100200801802002318620000a0023c2c +:10d51800680f422421106200040040ac010002247c +:10d528004d75400b000000002110000021e8c003e9 +:10d538000c00be8f1000bd270800e00300000000ab +:10d54800f0ffbd270c00beaf21f0a0031000c4af50 +:10d558000000c0af1000c28fc01002008018020087 +:10d568002318620000a0023c680f422421106200c8 +:10d578001400428c45004010000000001000c28fcb +:10d58800c0100200801802002318620000a0023cac +:10d59800680f4224211062000800438c1000c28fdb +:10d5a800c0100200802002002320820000a0023c5c +:10d5b800680f4224211082000000428c2310620070 +:10d5c8000000c2af0000c38f1000c28fc01002005d +:10d5d800802002002320820000a0023c680f422421 +:10d5e800211082001000428c2b1062000c004014a5 +:10d5f800000000001000c28fc01002008018020056 +:10d608002318620000a0023c680f42242110620027 +:10d61800080040ac01000224a675400b0000000081 +:10d628000000c28f19004104000000000000c28ff2 +:10d63800ffff43241000c28fc010020080200200a8 +:10d648002320820000a0023c680f4224211082009f +:10d658001000428c2b1062000c00401400000000e7 +:10d668001000c28fc0100200801802002318620048 +:10d6780000a0023c680f422421106200080040ac60 +:10d6880001000224a675400b0000000021100000d4 +:10d6980021e8c0030c00be8f1000bd270800e0037e +:10d6a80000000000f0ffbd270c00beaf21f0a00372 +:10d6b8001000c4af0000c0af1000c28fc01002003d +:10d6c800801802002318620000a0023c680f422460 +:10d6d800211062001400428cd900401000000000a4 +:10d6e8001000c28fc01002008018020023186200c8 +:10d6f80000a0023c680f4224211062000800438cfd +:10d708001000c28fc0100200802002002320820077 +:10d7180000a0023c680f4224211082000000428cc5 +:10d72800231062000000c2af0000c38f1000c28f38 +:10d73800c0100200802002002320820000a0023cca +:10d74800680f4224211082001000428c2b106200c6 +:10d7580056004014000000001000c28fc0100200e4 +:10d76800801802002318620000a0023c680f4224bf +:10d77800211062000400438c1000c28fc010020008 +:10d78800802002002320820000a0023c680f42246f +:10d79800211082000000428c231062000000c2affa +:10d7a8000000c38f1000c28fc0100200802002004a +:10d7b8002320820000a0023c680f4224211082002e +:10d7c8000c00428c2b106200140040140000000072 +:10d7d8001000c28fc01002008018020023186200d7 +:10d7e80000a0023c680f422421106200080040acef +:10d7f8001000c28fc01002008018020023186200b7 +:10d8080000a0023c680f422421106200040040acd2 +:10d81800010002249376400b000000000000c28f34 +:10d8280087004104000000000000c28fe803422482 +:10d83800211840001000c28fc01002008020020092 +:10d848002320820000a0023c680f4224211082009d +:10d858000c00428c2b10620079004014000000007c +:10d868001000c28fc0100200801802002318620046 +:10d8780000a0023c680f422421106200080040ac5e +:10d888001000c28fc0100200801802002318620026 +:10d8980000a0023c680f422421106200040040ac42 +:10d8a800010002249376400b000000000000c28fa4 +:10d8b80063004104000000000000c28fffff432402 +:10d8c8001000c28fc01002008020020023208200b6 +:10d8d80000a0023c680f4224211082001000428cf4 +:10d8e8002b10620056004014000000001000c28f88 +:10d8f800c0100200801802002318620000a0023c39 +:10d90800680f4224211062000400438c1000c28f6b +:10d91800c0100200802002002320820000a0023ce8 +:10d92800680f4224211082000000428c23106200fc +:10d938000000c2af0000c38f1000c28fc0100200e9 +:10d94800802002002320820000a0023c680f4224ad +:10d95800211082000c00428c2b106200140040142d +:10d96800000000001000c28fc010020080180200e2 +:10d978002318620000a0023c680f422421106200b4 +:10d98800080040ac1000c28fc010020080180200ce +:10d998002318620000a0023c680f42242110620094 +:10d9a800040040ac010002249376400b0000000004 +:10d9b8000000c28f22004104000000000000c28f56 +:10d9c800e8034224211840001000c28fc010020052 +:10d9d800802002002320820000a0023c680f42241d +:10d9e800211082000c00428c2b106200140040149d +:10d9f800000000001000c28fc01002008018020052 +:10da08002318620000a0023c680f42242110620023 +:10da1800080040ac1000c28fc0100200801802003d +:10da28002318620000a0023c680f42242110620003 +:10da3800040040ac010002249376400b0000000073 +:10da48002110000021e8c0030c00be8f1000bd2784 +:10da58000800e00300000000e8ffbd271400bfaf86 +:10da68001000beaf21f0a0031800c4af1c00c5af62 +:10da78001800c28fc010020080180200231862002c +:10da880000a0023c680f4224211062000100032418 +:10da9800140043ac1c00c28fe803422c1e00401443 +:10daa800000000001800c28fc01002008018020099 +:10dab8002318620000a0023c680f42242110620073 +:10dac8001c00c48fe80303241b008300f4016000da +:10dad8001020000012180000100043ac1800c28f7c +:10dae800c0100200801802002318620000a0023c47 +:10daf800680f4224211062001c00c48fe80303242d +:10db08001b008300f4016000101800000c0043acf7 +:10db1800d976400b000000001800c28fc010020028 +:10db2800801802002318620000a0023c680f4224fb +:10db380021106200100040ac1800c28fc010020013 +:10db4800801802002318620000a0023c680f4224db +:10db5800211062001c00c38f0c0043ac1800c48f56 +:10db68000b77400f0000000021e8c0031400bf8fae +:10db78001000be8f1800bd270800e0030000000059 +:10db8800e8ffbd271400bfaf1000beaf21f0a0030f +:10db98001800c4af1c00c5af1800c28fc010020027 +:10dba800801802002318620000a0023c680f42247b +:10dbb8002110620001000324140043ac1800c28f36 +:10dbc800c0100200801802002318620000a0023c66 +:10dbd800680f4224211062001c00c38f100043ac60 +:10dbe8001800c28fc01002008018020023186200bb +:10dbf80000a0023c680f4224211062000c0040acd7 +:10dc08001800c48f0b77400f0000000021e8c00304 +:10dc18001400bf8f1000be8f1800bd270800e00356 +:10dc280000000000f8ffbd270400beaf21f0a003ec +:10dc38000800c4af0800c28fc0100200801802009c +:10dc48002318620000a0023c680f422421106200e1 +:10dc5800000040ac0800c28fc0100200801802000b +:10dc68002318620000a0023c680f422421106200c1 +:10dc7800040040ac0800c28fc010020080180200e7 +:10dc88002318620000a0023c680f422421106200a1 +:10dc9800080040ac21e8c0030400be8f0800bd277f +:10dca8000800e00300000000f8ffbd270400beaf35 +:10dcb80021f0a0030800c4af0800c28fc010020002 +:10dcc800801802002318620000a0023c680f42245a +:10dcd800211062001400428c21e8c0030400be8faa +:10dce8000800bd270800e00300000000f8ffbd277a +:10dcf8000400beaf21f0a0030800c4af0800c28f23 +:10dd0800c0100200801802002318620000a0023c24 +:10dd1800680f422421106200140040ac21e8c003bf +:10dd28000400be8f0800bd270800e00300000000c3 +:10dd3800e8ffbd271400bfaf1000beaf21f0a0035d +:10dd48001800c4af020004249876400f1800c58f4d +:10dd58005977400b00000000400000000200042436 +:10dd6800ab75400f00000000fbff401000000000f2 +:10dd78003d77400f0200042421e8c0031400bf8f40 +:10dd88001000be8f0800e0031800bd2700e85d41c1 +:10dd980000701a4000601b40e0ffbd271c00baafae +:10dda8001800bbaf44781b7c00087b3700609b40a1 +:10ddb8001400beaf1000a4af0c00a3af0800a2afc0 +:10ddc80021f0a00300a0023c680f42240400c2af67 +:10ddd8000000c0af9477400b000000000400c28f21 +:10dde8001400428c12004010000000000400c28f92 +:10ddf8000400428ce80343380100632cff006330c1 +:10de0800010044240400c28f040044ac08006010e0 +:10de1800000000000400c28f040040ac0400c28f60 +:10de28000800428c010043240400c28f080043ac60 +:10de38000400c28f180042240400c2af0000c28f41 +:10de4800010042240000c2af0000c28f0b00422c28 +:10de5800e2ff40140000000088bf033c3010628cd1 +:10de68000421027c301062ac21e8c0031400be8f8c +:10de78001000a48f0c00a38f0800a28f00606041df +:10de8800c00000001c00ba8f1800bb8f00709a40b9 +:10de98002000bd2700e8dd4100609b4018000042db +:020000040000fa +:020000041d01dc +:10dea8006c4000a01c00000001000000ffff0405fa +:10deb80025013d013e0169012701480154026a011b +:10dec80055026b016c010000a40000a001000000d5 +:10ded800000000001c0200a0240000000000000058 +:10dee800a80000a00400000000000000ac0000a092 +:10def8000800000000000000300000a0040000003e +:10df08000100000004000000a44000a0140000006c +:10df180000000000b40000a0140000000000000091 +:10df2800340000a0040000000100000016000000fa +:10df3800c80000a00400000000000000380000a095 +:10df4800040000000100000000010000cc0000a057 +:10df58000400000000000000d00000a00100000044 +:10df680000000000d40000a0100000000000000025 +:10df7800400200a0c000000000000000e40000a073 +:10df88000400000000000000e80000a004000000f9 +:10df980000000000000300a0400000000000000096 +:10dfa800ec0000a018000000000000003c0000a0e9 +:10dfb800020000000100000001090000400300a069 +:10dfc8006e02000000000000ac3000a0bc0400009d +:10dfd8000100000057494e43333430305f30303a47 +:10dfe80030300000000000000000000000000000c9 +:10dff800000000000001000a31323334354646463d +:10e00800464600000000000000000000000000007c +:10e018000000000100c0a8320100000057494e432b +:10e02800333430305f30303a303000004865726544 +:10e0380020697320746865206c697374206f66208a +:10e0480074686520617661696c61626c6520636fd4 +:10e058006d6d616e64733a0a0d0a0d68656c702007 +:10e068003a2053686f777320746869732077696ef4 +:10e07800646f770a0d0a706f776572205b7374613d +:10e0880074655d20536574206368616c65742773db +:10e098002031325620496e76657274657220666545 +:10e0a800656420706f7765722073746174652e20c3 +:10e0b800205468697320636f6d6d616e6420636faf +:10e0c8006e74726f6c7320746865206d61696e2060 +:10e0d800706f7765722072656c61790a2020202044 +:10e0e8002d20417661696c61626c65205b73746197 +:10e0f80074655d20617267756d656e742061726507 +:10e108003a206f6e0a202020202020202020202066 +:10e1180020202020202020202020202020202020f7 +:10e1280020202020202020202020206f66660a0a38 +:10e1380077696669205b636f6d6d616e645d2063ee +:10e148006f6e74726f6c204368616c657444756996 +:10e158006e6f27732057694669206d6f64756c650b +:10e16800207374617465250a202020202d204176b3 +:10e1780061696c61626c65205b636f6d6d616e6473 +:10e188005d20617267756d656e74206172653a20f5 +:10e198006f6e20287475726e73204f4e206d6f64f9 +:10e1a800756c65290a20202020202020202020208e +:10e1b8002020202020202020202020202020202057 +:10e1c800202020202020202020202020206f66666c +:10e1d80020287475726e73204f4646206d6f6475e3 +:10e1e8006c65290a202020202020202020202020a3 +:10e1f8002020202020202020202020202020202017 +:10e2080020202020202020202020202073746174ca +:10e218007573202872657475726e732063757272d7 +:10e22800656e7420737461747573290a0a62617467 +:10e2380074657279205b73656e736f725d207265a9 +:10e248007475726e732063757272656e7420626184 +:10e2580074746572792073656e736f72732072655a +:10e268006164696e67730a202020202d2041766141 +:10e27800696c61626c65205b73656e736f725d209b +:10e28800617267756d656e74206172653a20766f8c +:10e298006c746167650a202020202020202020201f +:10e2a8002020202020202020202020202020202066 +:10e2b800202020202020202020202020206375726c +:10e2c80072656e740a202020202020202020202023 +:10e2d8002020202020202020202020202020202036 +:10e2e800202020202020202020202020736f632041 +:10e2f800287374617465206f66206368617267654e +:10e30800290a20202020202020456d707479205b68 +:10e3180073656e736f725d20617267756d656e747b +:10e32800207072696e747320616c6c2076616c75f4 +:10e3380065730a0a737461747573203a206765748b +:10e348002067656e6572616c2073797374656d20e2 +:10e358007374617475730a0a626f6f746c6f6164a9 +:10e368006572205b636f6d6d616e645d203a20623b +:10e378006f6f746c6f61646572206d6f6465206384 +:10e388006f6e74726f6c0a202020202d20417661f8 +:10e39800696c61626c65205b636f6d6d616e645d55 +:10e3a80020617267756d656e74206172653a2073bd +:10e3b800746172742028656e61626c6520626f6f8b +:10e3c800746c6f6164657220616e64206f70656e35 +:10e3d8007320706f7274290a2020202020202020aa +:10e3e8002020202020202020202020202020202025 +:10e3f8002020202020202020202020202020202015 +:10e4080073746f70202864697361626c657320622d +:10e418006f6f746c6f61646572206966206e6f74cb +:10e428002062757379290a202020202020202020ae +:10e4380020202020202020202020202020202020d4 +:10e448002020202020202020202020202020207371 +:10e458007461746520287072696e747320616374c6 +:10e4680075616c207374617465206f6620746865cb +:10e4780020626f6f746c6f61646572290a0a486163 +:10e488007665206120676f6f6420646179210a00d6 +:10e49800400000a00c00000001000000f8f0054555 +:10e4a800d4840000043100a0b00500a09803000047 +:10e4b800000000004c0000a0040000000100000063 +:10e4c800a892029d480900a0200600000000000054 +:10e4d800040100a00c00000000000000743e00a031 +:10e4e800580000000100000057494e4333343030d3 +:10e4f8005f30303a303000000000000000000000bb +:10e5080000000000000000000001000a313233342e +:10e518003546464646460000000000000000000060 +:10e52800000000000000000100c0a8320100000047 +:10e5380057494e43333430305f30303a3030000082 +:10e54800500000a00800000001000000f8f0054598 +:10e55800d4840000680f00a008010000000000003b +:10e56800083e00a06c0000000100000057494e431f +:10e57800333430305f30303a303000000000000073 +:10e588000000000000000000000000000001000a78 +:10e598003132333435464646464600000000000016 +:10e5a80000000000000000000000000100c0a832c8 +:10e5b8000100000057494e43333430305f30303a61 +:10e5c800303000006f70656e776561746865726dd4 +:10e5d80061702e6f72670000683500a000040000ab +:10e5e80000000000580000a010000000010000001a +:10e5f800f8f00545d484ffffffffffffffffff0092 +:10e60800100100a01c00000000000000701000a015 +:10e61800040d000000000000680000a004000000d5 +:10e6280001000000000504002c0100a00400000007 +:10e6380000000000cc3e00a05800000001000000cf +:10e6480057494e43333430305f30303a3030000071 +:10e6580000000000000000000000000000000000b2 +:10e668000001000a3132333435464646464600003a +:10e678000000000000000000000000000000000191 +:10e6880000c0a8320100000057494e4333343030ef +:10e698005f30303a303000006c0000a00800000005 +:10e6a80001000000f8f00545d4840000300100a006 +:10e6b8000400000000000000340100a00800000071 +:10e6c80000000000741d00a01600000000000000fb +:10e6d8008c1d00a00010000000000000243f00a0d6 +:10e6e800580000000100000057494e4333343030d1 +:10e6f8005f30303a303000000000000000000000b9 +:10e7080000000000000000000001000a313233342c +:10e71800354646464646000000000000000000005e +:10e72800000000000000000100c0a8320100000045 +:10e7380057494e43333430305f30303a3030000080 +:10e74800740000a00800000001000000f8f0054572 +:10e75800d48400008c2d00a0f4010000000000000b +:10e768003c0100a004000000000000007c3f00a065 +:10e77800580000000100000057494e433334303040 +:10e788005f30303a30300000000000000000000028 +:10e7980000000000000000000001000a313233349c +:10e7a80035464646464600000000000000000000ce +:10e7b800000000000000000100c0a83201000000b5 +:10e7c80057494e43333430305f30303a30300000f0 +:10e7d8007c0000a00800000001000000f8f00545da +:10e7e800d4840000802f00a02c010000000000004d +:10e7f800d43f00a0580000000100000057494e43d4 +:10e80800333430305f30303a3030000000000000e0 +:10e818000000000000000000000000000001000ae5 +:10e828003132333435464646464600000000000083 +:10e8380000000000000000000000000100c0a83235 +:10e848000100000057494e43333430305f30303ace +:10e8580030300000840000a0180000000100000013 +:10e86800f8f00545d4840000ffffffff0100000019 +:10e87800892f00a009000000400100a01800000036 +:10e8880000000000683900a000040000000000003b +:10e89800580100a00100000000000000683d00a031 +:10e8a800a0000000010000002c4000a000000000b3 +:10e8b8002c4000a009000000200000004c4000a0ef +:10e8c800000000004c4000a00e0201000000000003 +:10e8d8000000000000000000000000000602020026 +:10e8e8000000000000000000000000000000000020 +:10e8f8000000000000000000000000000000000010 +:10e9080000000000000000000000000000000000ff +:10e9180000000000000000000000000000000000ef +:10e9280000000000000000000000000000000000df +:10e9380000000000000000000000000000000000cf +:10e9480000000000000000002c4000a04000000073 +:10e95800000000009c0000a004000000010000006e +:10e96800683d00a0590100a001000000000000005f +:10e97800b84000a004000000000000005c0100a0f6 +:10e988000400000000000000bc4000a004000000db +:10e9980000000000884000a01c00000000000000eb +:10e9a800600100a00800000000000000a00000a016 +:10e9b800040000000100000002000000000000a0a8 +:10e9c80020000000010000000c0000000000000012 +:10e9d8000100017c1f0c1d000c0000001400000049 +:10e9e800043e029d4c040000200000a0100000001e +:10e9f800010000000c000000240000005073043add +:10ea08005c0400000000000022222222222222228e +:10ea180022222222222222222222222222222222ce +:020000040000fa +:020000041d01dc +:10ea2800e8ffbd271400bfaf1000beaf21f0a00360 +:10ea3800057c400f0000000021e8c0031400bf8fd0 +:10ea48001000be8f1800bd270800e003000000007a +:10ea5800e0ffbd271c00bfaf1800beaf1400b0af69 +:10ea680021f0a003211080002000c2a31c80829303 +:10ea78000e00432c480160100000000080180200be +:10ea8800029d023ca0ea4224211062000000428c50 +:10ea98000800400000000000d8ea019dfcea019d42 +:10eaa80064eb019db0eb019dfceb019d40ec019de9 +:10eab800b4ec019d00ed019d4ced019da8ed019d7b +:10eac80008ee019d68ee019df0ee019d50ef019d5d +:10ead800cc8080afd48080afd88080a3d98080a339 +:10eae800da8080a3010002241c8082a3ee7b400b05 +:10eaf800000000002000c3938a0002241200621460 +:10eb080000000000d480828f00a0033c40036324ef +:10eb1800211843002000c493000064a0010042248f +:10eb2800d48082af020002241c8082a3da808393ff +:10eb38002000c29326106200ff004230da8082a3d0 +:10eb4800ee7b400b00000000cc8080af057c400fbe +:10eb580000000000ee7b400b000000002000c29384 +:10eb6800dc8082a3d480828f00a0033c400363240e +:10eb7800211843002000c493000064a0010042242f +:10eb8800d48082af030002241c8082a3da8083939e +:10eb98002000c29326106200ff004230da8082a370 +:10eba800ee7b400b00000000d480828f00a0033c65 +:10ebb80040036324211843002000c493000064a08c +:10ebc80001004224d48082af040002241c8082a366 +:10ebd8002000c293db8082a3da8083932000c29353 +:10ebe80026106200ff004230da8082a3ee7b400be1 +:10ebf80000000000d480828f00a0033c40036324ff +:10ec0800211843002000c493000064a0010042249e +:10ec1800d48082af050002241c8082a3da8083930b +:10ec28002000c29326106200ff004230da8082a3df +:10ec3800ee7b400b000000002000c393010002247b +:10ec480009006210000000002000c393ff000224a6 +:10ec58000500621000000000057c400f0000000065 +:10ec6800ee7b400b00000000d480828f00a0033ca4 +:10ec780040036324211843002000c493000064a0cb +:10ec880001004224d48082af060002241c8082a3a3 +:10ec9800da8083932000c29326106200ff0042307e +:10eca800da8082a3ee7b400b000000002000c293b4 +:10ecb800dd8082a3d480828f00a0033c40036324bc +:10ecc800211843002000c493000064a001004224de +:10ecd800d48082af070002241c8082a3da80839349 +:10ece8002000c29326106200ff004230da8082a31f +:10ecf800ee7b400b000000002000c293d98082a365 +:10ed0800d480828f00a0033c400363242118430071 +:10ed18002000c493000064a001004224d48082af84 +:10ed2800080002241c8082a3da8083932000c29307 +:10ed380026106200ff004230da8082a3ee7b400b8f +:10ed480000000000cc8080af2000c293cc8082af4e +:10ed5800cc80828f00120200cc8082afd480828f58 +:10ed680000a0033c40036324211843002000c493ff +:10ed7800000064a001004224d48082af090002246c +:10ed88001c8082a3da8083932000c293261062003d +:10ed9800ff004230da8082a3ee7b400b00000000c7 +:10eda8002000c393cc80828f25106200cc8082af74 +:10edb800cc80828f00120200cc8082afd480828ff8 +:10edc80000a0033c40036324211843002000c4939f +:10edd800000064a001004224d48082af0a0002240b +:10ede8001c8082a3da8083932000c29326106200dd +:10edf800ff004230da8082a3ee7b400b0000000067 +:10ee08002000c393cc80828f25106200cc8082af13 +:10ee1800cc80828f00120200cc8082afd480828f97 +:10ee280000a0033c40036324211843002000c4933e +:10ee3800000064a001004224d48082af0b000224a9 +:10ee48001c8082a3da8083932000c293261062007c +:10ee5800ff004230da8082a3ee7b400b0000000006 +:10ee68002000c393cc80828f25106200cc8082afb3 +:10ee7800d480828f00a0033c400363242118430000 +:10ee88002000c493000064a001004224d48082af13 +:10ee9800cc80828f2d01422c03004014000000001a +:10eea800057c400f00000000cc80828f05004014d4 +:10eeb800000000000d0002241c8082a3b57b400bdb +:10eec800000000000c0002241c8082a3da808393d7 +:10eed8002000c29326106200ff004230da8082a32d +:10eee800ee7b400b00000000da8083932000c29381 +:10eef80026106200ff004230da8082a3d480828f1d +:10ef080000a0033c40036324211843002000c4935d +:10ef1800000064a001004224d48082afd080828f98 +:10ef280001004224d08082afd080838fcc80828f32 +:10ef38001e006214000000000d0002241c8082a341 +:10ef4800ee7b400b00000000da8082932000c39320 +:10ef58000500621000000000057c400f0000000062 +:10ef6800ee7b400b00000000d98082932180400096 +:10ef7800dd7c400f00000000212000022128400015 +:10ef8800e77c400f00000000057c400f00000000f7 +:10ef9800ee7b400b00000000057c400f00000000e5 +:10efa80000000000ee7b400b0000000000000000a5 +:10efb80021e8c0031c00bf8f1800be8f1400b08f5b +:10efc8002000bd270800e00300000000e8ffbd277f +:10efd8001400bfaf1000beaf21f0a00321108000c5 +:10efe8001800c2a31800c29321204000967a400f4f +:10eff8000000000021e8c0031400bf8f1000be8f7e +:10f008001800bd270800e00300000000f8ffbd2736 +:10f018000400beaf21f0a003cc8080afd48080afc5 +:10f02800d88080a3d98080a3da8080a3010002243d +:10f038001c8082a3d08080afdd8080a3dc8080a389 +:10f0480021e8c0030400be8f0800bd270800e003c4 +:10f0580000000000f0ffbd270c00beaf21f0a003a8 +:10f06800d980829321184000020002240300621410 +:10f07800000000000000c0a30000000021e8c00359 +:10f088000c00be8f1000bd270800e0030000000040 +:10f09800f0ffbd270c00beaf21f0a0032118a0008f +:10f0a8002110c0001000c4a31400c3a31800c2a3f9 +:10f0b8001000c39301000224050062140000000040 +:10f0c800a3ff02240000c2a3387c400b000000000c +:10f0d80090ff02240000c2a31400c2930100c2a33f +:10f0e80021e8c0030c00be8f1000bd270800e00314 +:10f0f80000000000f0ffbd270c00beaf21f0a00308 +:10f108001000c4af2110a0001400c2a30000c0a3c7 +:10f118000100c0a3537c400b000000000100c29313 +:10f128001000c38f21106200000043900000c293ba +:10f13800261062000000c2a30100c293010042240d +:10f148000100c2a30100c3931400c2932b106200f4 +:10f15800f2ff4014000000000000c29321e8c00341 +:10f168000c00be8f1000bd270800e003000000005f +:10f17800f8ffbd270400beaf21f0a0031c808393d5 +:10f1880001000224040062140000000021100000a5 +:10f19800697c400b000000000100022421e8c00344 +:10f1a8000400be8f0800bd270800e003000000002f +:10f1b800d8ffbd272400bfaf2000beaf1c00b0aff2 +:10f1c80021f0a003214080002120c0002118e00088 +:10f1d8004000c28f2800c8a32c00c5a33000c4a3d8 +:10f1e8003400c3a31000c2a33c00c28f2d01422cdf +:10f1f80007004014000000004400c28f000040ac2b +:10f2080000a0023c78044224d67c400b0000000099 +:10f2180000a0023c8aff0324780443a000a0023c1b +:10f228007804422401000324010043a000a0023c0a +:10f23800780442243000c393020043a000a0023c9b +:10f24800780442242800c393030043a000a0023c92 +:10f25800780442242c00c393040043a000a0023c7d +:10f26800780442241000c393050043a000a0023c88 +:10f27800780442243400c393060043a03c00c28fa4 +:10f2880002160200ff00433000a0023c780442242a +:10f29800070043a03c00c28f02140200ff00433065 +:10f2a80000a0023c78044224080043a03c00c28f1e +:10f2b80002120200ff00433000a0023c78044224fe +:10f2c800090043a03c00c28fff00433000a0023c6d +:10f2d800780442240a0043a000a0023c830442248c +:10f2e800212040003800c58f3c00c68f349d400f58 +:10f2f800000000003c00c28f0b0050243c00c28f6d +:10f30800ff0042300b004224ff00423000a0033cc3 +:10f3180078046424212840003f7c400f000000004e +:10f328002118400000a0023c780442242110020267 +:10f33800000043a03c00c28f0c004224211840006a +:10f348004400c28f000043ac00a0023c7804422471 +:10f3580021e8c0032400bf8f2000be8f1c00b08f9f +:10f368002800bd270800e00300000000f8ffbd27c3 +:10f378000400beaf21f0a00300a0023c4b034224ce +:10f3880021e8c0030400be8f0800bd270800e00381 +:10f3980000000000a0ffbd275c00bfaf5800beaf53 +:10f3a80021f0a0036000c4af6400c5af88bf033c70 +:10f3b8006060628c010004240421827c606062ac7d +:10f3c8004d97400f00000000b297400f000000006a +:10f3d8000c81828f010042240c8182af6000c28fb1 +:10f3e8001b00422ca2014010000000006000c28fe8 +:10f3f80080180200029d023c14f44224211062008d +:10f408000000428c080040000000000078fa019dce +:10f4180078fa019d80f4019d78fa019dd0f6019d4e +:10f4280078fa019dfcf6019d78fa019d78fa019d14 +:10f4380078fa019d78fa019d78fa019d78fa019d84 +:10f4480078fa019d7cf7019d78fa019d2cf8019dc1 +:10f4580078fa019ddcf8019d78fa019da4f9019dd7 +:10f4680078fa019ddcf9019d78fa019d2cfa019d3d +:10f4780078fa019d50fa019dfe8c400f00000000b3 +:10f488002800c2afb29e400f000000002c00c2af9f +:10f498002800c2270000428c1400c2af2c00c227eb +:10f4a8000000428c1800c2af188d400f0000000009 +:10f4b8001c00c2af238d400f000000002000c2af27 +:10f4c8001000c0a3e897400f00000000211840007a +:10f4d8000100022404006214000000001000c2931e +:10f4e800010042341000c2a33c8d400f0000000010 +:10f4f80021184000010002240400621400000000ea +:10f508001000c293020042341000c2a31000c2933c +:10f518003000c2a39c3b400f000000002014027c76 +:10f528003100c2a31400c28f2014027c3200c2a38f +:10f538001400c28f021202001400c2af1400c28f5e +:10f548002014027c3300c2a31400c28f02120200ee +:10f558001400c2af1400c28f2014027c3400c2a36e +:10f568001400c28f021202001400c2af1400c28f2e +:10f578002014027c3500c2a31c00c28f2014027c18 +:10f588003600c2a31c00c28f031202001c00c2afc7 +:10f598001c00c28f2014027c3700c2a32000c28f37 +:10f5a8002014027c3800c2a31c00c28f0312020080 +:10f5b8001c00c2af1c00c28f2014027c3900c2a3f9 +:10f5c8001800c28f2014027c3a00c2a31800c28f10 +:10f5d800021202001800c2af1800c28f2014027c69 +:10f5e8003b00c2a31800c28f021202001800c2af6b +:10f5f8001800c28f2014027c3c00c2a31800c28fde +:10f60800021202001800c2af1800c28f2014027c38 +:10f618003d00c2a30c81828f2400c2af0c81828f6f +:10f628002014027c3e00c2a30c81828f02120200c9 +:10f638000c8182af0c81828f2014027c3f00c2a310 +:10f648000c81828f021202000c8182af0c81828fa2 +:10f658002014027c4000c2a30c81828f0212020097 +:10f668000c8182af0c81828f2014027c4100c2a3de +:10f678002400c28f0c8182af3000c227030004240b +:10f688002128400012000624a47e400f000000003c +:10f6980088bf023c2061428c4001427cff0042301e +:10f6a80027100200ff00423001004230ff004430c2 +:10f6b80088bf033c2061628c4429827c206162ac53 +:10f6c8009e7e400b00000000e897400f00000000fd +:10f6d8004200c2a34200c22705000424212840009a +:10f6e80001000624a47e400f000000009e7e400b0f +:10f6f80000000000020002244300c2a36400c28f7d +:10f70800000042900600401400000000d497400f0b +:10f71800000000004300c0a3d77d400b000000009c +:10f728006400c28f000043900100022407006214a5 +:10f7380000000000c097400f0000000001000224f4 +:10f748004300c2a3d77d400b000000000200022442 +:10f758004300c2a34300c227070004242128400015 +:10f7680001000624a47e400f000000009e7e400b8e +:10f7780000000000040002244400c2a36400c28ff9 +:10f788000000429006004014000000003c3b400f7f +:10f79800000000004400c0a3037e400b00000000ee +:10f7a8006400c28f00004390010002241300621419 +:10f7b800000000009c3b400f0000000021184000a2 +:10f7c8000100022409006210000000001b3a400feb +:10f7d800000000009c3b400f000000002014027c49 +:10f7e8004400c2a3037e400b000000000100022475 +:10f7f8004400c2a3037e400b000000000400022462 +:10f808004400c2a34400c2270f000424212840005a +:10f8180001000624a47e400f000000009e7e400bdd +:10f82800000000006400c28f00004390ba00022468 +:10f838001f006214000000006400c28f010042240f +:10f8480000004390ad00022419006214000000007b +:10f858006400c28f0200422400004390be000224cc +:10f8680013006214000000006400c28f03004224e9 +:10f8780000004390ef0002240d0062140000000015 +:10f88800010002244500c2a34500c2271100042438 +:10f898002128400001000624a47e400f000000003b +:10f8a80004a3400f000000009e7e400b00000000f3 +:10f8b8004500c0a34500c2271100042421284000a8 +:10f8c80001000624a47e400f000000009e7e400b2d +:10f8d800000000006400c28f00004390ba000224b8 +:10f8e80025006214000000006400c28f0100422459 +:10f8f80000004390ad0002241f00621400000000c5 +:10f908006400c28f0200422400004390ca0002240f +:10f9180019006214000000006400c28f0300422432 +:10f9280000004390fe00022413006214000000004f +:10f93800010002244600c2a34600c2271300042483 +:10f948002128400001000624ce7e400f0000000060 +:10f95800640004244e77400f000000003c3b400f39 +:10f9680000000000640004244e77400f00000000ef +:10f9780065a2400f000000004600c0a34600c22751 +:10f98800110004242128400001000624a47e400f11 +:10f99800000000009e7e400b000000004800c227c7 +:10f9a80021204000080005240c000624b765400ffc +:10f9b800000000004800c227150004242128400048 +:10f9c80008000624a47e400f000000009e7e400b25 +:10f9d800000000005000c0a36400c48f0800052484 +:10f9e8000c0006247a67400f000000002118400030 +:10f9f8000100022403006214000000000100022438 +:10fa08005000c2a35000c227170004242128400038 +:10fa180001000624a47e400f000000009e7e400bdb +:10fa280000000000039d023c909442241900042425 +:10fa3800212840000f000624a47e400f000000008b +:10fa48009e7e400b00000000010002245100c2a36a +:10fa58000c8180af5100c2271b00042421284000dc +:10fa680001000624a47e400f0000000000000000f2 +:10fa780021e8c0035c00bf8f5800be8f6000bd271f +:10fa88000800e00300000000d0ffbd272c00bfaf36 +:10fa98002800beaf21f0a0033000c4af3400c5afca +:10faa8003800c6af3000c28fff0042302400c327a1 +:10fab8003400c48f1000a4af3800c48f1400a4af62 +:10fac8001800a0af1c00a3af2120000001000524ee +:10fad8000e000624213840006e7c400f0000000014 +:10fae8002000c2af48808227212000002128400042 +:10faf800030006240533400f000000002000c38fd8 +:10fb08002400c28f212000002128600021304000fd +:10fb18000533400f0000000021e8c0032c00bf8f10 +:10fb28002800be8f3000bd270800e0030000000059 +:10fb3800d0ffbd272c00bfaf2800beaf21f0a00327 +:10fb48003000c4af3400c5af3800c6af3000c28f34 +:10fb5800ff0042302400c3273400c48f1000a4af34 +:10fb68003800c48f1400a4af1800a0af1c00a3afc6 +:10fb780021200000010005240e0006242138400041 +:10fb88006e7c400f000000002000c2af4880822732 +:10fb9800212040000300052421300000ce5e400fe4 +:10fba800000000002000c38f2400c28f21206000c5 +:10fbb8002128400021300000ce5e400f00000000e8 +:10fbc80021e8c0032c00bf8f2800be8f3000bd275e +:10fbd8000800e00300000000e0ffbd271c00bfafe5 +:10fbe8001800beaf21f0a003030002241000c2a336 +:10fbf800488082272120400003000524213000008e +:10fc0800ce5e400f0000000021e8c0031c00bf8f3b +:10fc18001800be8f2000bd270800e0030000000088 +:020000040000fa +:020000041d01dc +:10fc2800b8ffbd273c00b7af3400b5af029d173c05 +:10fc380000a0153c3800b6af2000b0af4400bfaffd +:10fc48004000beaf3000b4af2c00b3af2800b2af55 +:10fc58002400b1af4c7cf7262180a0005000a6af4d +:10fc6800bc40a4ae21b000001800a0af0000119263 +:10fc7800c80020124400bf8f2110f1020100428009 +:10fc880088004230bd0040140100102625000224df +:10fc9800a500221604000324000013822188000016 +:10fca8001400a3af21f0000004001424ff007332f5 +:10fcb8007900622e1c004014010012262110f30264 +:10fcc8000100429004004230e601401000000000ac +:10fcd8003ba1400f2120000200005382029d033cfb +:10fce8004c7c6324208c027c21106302010042902a +:10fcf80004004230edff4010218040020100102630 +:10fd0800000013822110f3020100429004004230e7 +:10fd1800fbff405401001026ff0073327900622e69 +:10fd2800e6ff401001001226029d043c80101300db +:10fd38004cfd8424211082000000428c0800400001 +:10fd480000000000dc02029dc4fc019dc4fc019d72 +:10fd5800c4fc019dc4fc019dc4fc019dc4fc019d23 +:10fd6800c4fc019dc4fc019dc4fc019dc4fc019d13 +:10fd7800c4fc019dc4fc019dc4fc019dc4fc019d03 +:10fd8800c4fc019dc4fc019dc4fc019dc4fc019df3 +:10fd9800c4fc019dc4fc019dc4fc019dc4fc019de3 +:10fda800c4fc019dc4fc019dc4fc019dc4fc019dd3 +:10fdb800c4fc019dc4fc019dc4fc019dc4fc019dc3 +:10fdc800c4fc019dc4fc019dc4fc019dc4fc019db3 +:10fdd800c4fc019dc4fc019dc4fc019dc4fc019da3 +:10fde800c4fc019dc4fc019dc4fc019dc802029d88 +:10fdf800c4fc019dc4fc019dc4fc019dc4fc019d83 +:10fe0800c4fc019dc4fc019dc4fc019dc4fc019d72 +:10fe1800c4fc019dc4fc019dc4fc019dc4fc019d62 +:10fe2800c4fc019dc4fc019dc4fc019dc4fc019d52 +:10fe3800c4fc019dc4fc019dc4fc019dc4fc019d42 +:10fe4800c4fc019dc4fc019dc4fc019dc4fc019d32 +:10fe5800c4fc019dc4fc019dc4fc019dc4fc019d22 +:10fe6800c4fc019dc4fc019dc4fc019dc4fc019d12 +:10fe7800c4fc019dac02029dc4fc019dc4fc019d13 +:10fe8800c4fc019dc4fc019dc4fc019dc4fc019df2 +:10fe9800c4fc019dc4fc019dc4fc019dc4fc019de2 +:10fea800c4fc019d9c02029dc4fc019dc4fc019df3 +:10feb800c4fc019dc4fc019dc4fc019dc4fc019dc2 +:10fec800c4fc019dc4fc019dc4fc019dc4fc019db2 +:10fed8005402029d4802029dc4fc019dc4fc019d80 +:10fee800c4fc019d3402029d4802029dc4fc019d90 +:10fef800c4fc019dac02029dc4fc019dc4fc019d93 +:10ff08009401029dc4fc019dc4fc019dc4fc019d9b +:10ff1800e000029dc4fc019d4802029dc4fc019db5 +:10ff2800c4fc019dccff019dd19e400fbc40a48e16 +:10ff38004fff225200001192ffff03244401431493 +:10ff480000a0033c1800a38f0b1063004400bf8f70 +:10ff58004000be8f3c00b78f3800b68f3400b58f95 +:10ff68003000b48f2c00b38f2800b28f2400b18fdb +:10ff78002000b08f0800e0034800bd275ea3400fb3 +:10ff880000000000000011923cff20162110f10231 +:10ff98004400bf8f1800a28f4000be8f3c00b78f6f +:10ffa8003800b68f3400b58f3000b48f2c00b38f73 +:10ffb8002800b28f2400b18f2000b08f0800e00322 +:10ffc8004800bd27218040021000132421b0000002 +:10ffd8005ea3400f00000000d19e400fbc40a48edd +:10ffe800219040002d0002247100421200a0033c21 +:10fff80021204002212860022130c00265a1400f63 +:020000041d02db +:100008001c00a0afff00032476004310bc40a58e5f +:1000180030000224d30042120000000021a000009a +:1000280002a0937221204002212860022130c002e0 +:1000380065a1400fffff3126208c117c0b00201298 +:1000480021a05400d19e400fbc40a48e2120400026 +:10005800212860022130c00265a1400f2190400094 +:10006800ff000324efff435402a0937221204002b3 +:100078002128600265a1400f2130c002ff0003243f +:10008800e2004310bc40a58e1c00a48f231014006e +:10009800f6fec0170ba044001800a38f1400a48f0d +:1000a80001006224ff0042301800a2af04000224bd +:1000b800d00082101400a48f02000224d7008210fe +:1000c8005000a48f0000828c040084245000a4af48 +:1000d8001d7f400b000054ac5ea3400f00000000e1 +:1000e8009a00c0135000a38fd19e400fbc40a48e2d +:1000f800ffff032494ff43101800a38f140040143b +:10010800010043245c80400b21804002c90062103a +:10011800000000000500c017ffff31261000a48f63 +:10012800000082a0010084241000a4af208c117c60 +:100138000d00201221804002d19e400fbc40a48ea9 +:10014800010043240200642c07008014218040022f +:100158002118e3020000638088006330ebff6050e1 +:100168000000438221804002c1fec0570000119266 +:100178001800a38f1000a48f01006224ff004230f2 +:100188001800a2af1d7f400b000080a05ea3400fa7 +:1001980021804002d19e400fbc40a48e2190400097 +:1001a8002d00022492ff42160800132400a0033ced +:1001b800bc40648c01000224d19e400f1c00a2aff9 +:1001c80021904000212040022128600265a1400fb3 +:1001d8002130c002ff0003248eff431430000224a4 +:1001e800bc40a58ebfa2400f212040021800a38f5b +:1001f8006900601000a0023c211060004400bf8f1d +:100208004000be8f3c00b78f3800b68f3400b58fe2 +:100218003000b48f2c00b38f2800b28f2400b18f28 +:100228002000b08f0800e0034800bd270200022428 +:1002380000005382218040022d7f400b1400a2afa2 +:1002480021804002f67f400b0a0013243500c013ba +:100258001800a38fffff1024d19e400fbc40a48e2e +:10026800780050101800a38f0500c017ffff312633 +:100278001000a48f000082a0010084241000a4af05 +:10028800208c117cf4ff201e000000001d7f400b15 +:10029800218040022180400210001324f67f400b89 +:1002a800010016241400a48f0700941008000224eb +:1002b80000005382218040022d7f400b1400a2af22 +:1002c8000100de27ff00de33000053822d7f400b44 +:1002d800218040021800a38fc8ff6014211060001d +:1002e800bc40a38e4400bf8f0c006394ffff022420 +:1002f800100063300a1003004000be8f3c00b78f27 +:100308003800b68f3400b58f3000b48f2c00b38f0f +:100318002800b28f2400b18f2000b08f0800e003be +:100328004800bd275000a48f01006224ff0042301e +:100338000000848c1800a2af5000a28f1000a4af58 +:10034800040042249780400b5000a2af5000a48fb5 +:100358000000638c040084241000a3af3c80400b91 +:100368005000a4afd19e400fbc40a48e7800032457 +:100378001a004310580003241a004314bc40a58ee9 +:100388001800c01200000000d19e400fbc40a48e8f +:100398000980400b21904000bc40438c4400bf8f33 +:1003a8000c006394ffff0224100063300a1003005e +:1003b8004000be8f3c00b78f3800b68f3400b58f31 +:1003c8003000b48f2c00b38f2800b28f2400b18f77 +:1003d8002000b08f0800e0034800bd27eaffc012e4 +:1003e800bc40a58ebfa2400f212040000a80400bd0 +:1003f80021a000005000a38f0000628c0400632439 +:100408005000a3af1d7f400b000054acbfa2400fab +:10041800212040022580400b1c00a48f5000a38f90 +:100428000000628c040063245000a3af1d7f400bc2 +:10043800000054a40dfec017010050265f80400b39 +:100448001800a38fffff0224d57f400b0b10630019 +:10045800bc40658cbfa2400f212040008180400b2a +:100468001800a28fd19e400fbc40a48e87ff621255 +:10047800ffff0324f6ff431400a0033c1800a48fd9 +:080488008180400b0b10840081 +:020000040000fa +:020000041d02db +:100490004a462e636f6d0000426f6f746c6f61642b +:1004a0006572207265636569766564206120667295 +:1004b000616d65207769746820696e76616c696426 +:1004c0002043524300000000426f6f746c6f616400 +:1004d000657220486561727462656174205265714d +:1004e0007565737400000000424f4f544c4f4144f7 +:1004f00045525f45524153455f424f4f544c4f4127 +:100500004445525f464c4153485f5245515545530f +:1005100054000000424f4f544c4f414445525f49f4 +:100520004e49545f55504c4f41445f5245515545db +:1005300053540000424f4f544c4f414445525f4783 +:1005400045545f53544154455f52455155455354aa +:1005500000000000424f4f544c4f414445525f55fc +:10056000504c4f41445f46494e49534845445f52c1 +:100570004551554553540000424f4f544c4f414450 +:1005800045525f455845435554455f555047524184 +:1005900047455f524551554553540000424f4f5413 +:1005a0004c4f414445525f41424f52545f4f50457a +:1005b000524154494f4e5f524551554553540000e6 +:1005c000424f4f544c4f414445525f434845434b83 +:1005d0005f464c4153485f4649524d575f494e5420 +:1005e0004547524954595f524551554553540000af +:1005f000426f6f746c6f6164657250726f746f6379 +:100600006f6c206465746563746564206120435277 +:1006100043206572726f722e2020436d643a20254c +:10062000642c2052784352433a307825782c204568 +:10063000787065637465643a5b307825785d0a008c +:10064000426f6f746c6f6164657220496e7465727d +:100650006661636520676f696e6720696e746f20dd +:1006600061637469766520737461746500000000cd +:10067000426f6f746c6f6164657220496e7465724d +:100680006661636520676f696e6720696e746f20ad +:10069000457261736520466c617368207374617480 +:1006a00065000000426f6f746c6f61646572204971 +:1006b0006e7465726661636520676f696e67206935 +:1006c0006e746f204669726d776172652052582092 +:1006d000737461746500000041626f7274696e67c3 +:1006e0002075706c6f61642c20676f696e6720697c +:1006f0006e746f205354414e444259206d6f6465af +:1007000000000000426f6f746c6f61646572207747 +:10071000696c6c206e6f77207570677261646520fc +:10072000616e64207265626f6f74212100000000a9 +:10073000426f6f746c6f616465722075706772616f +:10074000646520726571756573742064656e696592 +:10075000643a204669726d77617265206e6f74200d +:1007600075706c6f6164656400000000466c6173b5 +:10077000682065726173652066696e697368656477 +:100780002e2020426f6f746c6f6164657220496e19 +:100790007465726661636520676f696e6720696e54 +:1007a000746f2041637469766520737461746500a9 +:1007b000466c617368206572617365206572726f43 +:1007c000722e2020426f6f746c6f616465722049d5 +:1007d0006e7465726661636520676f696e67206914 +:1007e0006e746f20416374697665207374617465fb +:1007f00000000000466c61736820657261736520bb +:1008000061626f72742e2020426f6f746c6f61642e +:10081000657220496e7465726661636520676f69f1 +:100820006e6720696e746f2041637469766520730a +:10083000746174650000000041626f7274696e67d4 +:1008400020466c6173682065726173652c20676f48 +:10085000696e6720696e746f205354414e4442594b +:10086000206d6f6465000000426f6f746c6f61648f +:100870006572204368756e6b202564207375636311 +:1008800065737366756c79207772697474656e2010 +:10089000746f20666c6173680a000000426f6f74a9 +:1008a0006c6f6164657220466c6173682077726951 +:1008b0007465206572726f722e2041626f72746966 +:1008c0006e6720616e6420676f696e6720696e7461 +:1008d0006f205354414e4442592073746174650033 +:1008e000426f6f746c6f6164657220496e746572db +:1008f000666163652041424f5254494e472055502e +:100900004c4f41442e2052656365697665642069c9 +:100910006e76616c6964206368756e6b20696e64c5 +:1009200065782e202052783a205b25645d202d20aa +:1009300045787065637465643a205b25645d0a00e0 +:10094000426f6f746c6f6164657220496e7465727a +:10095000666163652e205278206e6577206461742d +:1009600061206368756e6b2e202057726974696e02 +:100970006720746f20666c6173682e2020496e6456 +:1009800065783a2025640a00426f6f746c6f616469 +:10099000657220496e7465726661636520696e7662 +:1009a000616c6964206368756e6b204352432e202e +:1009b00052657175657374696e6720726573656ed3 +:1009c00064206368756e6b20696e646578205b25b2 +:1009d000645d0a00426f6f746c6f616465722049d8 +:1009e0006e74657266616365206669726d776172a7 +:1009f000652075706c6f61642066696e69736865e7 +:100a0000642e20436865636b20666c61736820699f +:100a10006e746567726974792e0000004669726da4 +:100a20007761726520696e74656772697479206395 +:100a30006865636b206661696c65642e2020476f72 +:100a4000696e67206261636b20746f205354414e5e +:100a50004442592073746174652e0000426f6f74b4 +:100a60006c6f616465722061626f7274696e672079 +:100a70006669726d7761726520646f776e6c6f6105 +:100a8000642e2020476f696e67206261636b20745b +:100a90006f205354414e4442592073746174650071 +:100aa000426f6f746c6f6164657220496e74657219 +:100ab000666163652045726173696e672073656363 +:100ac000746f722025307825780a0000426f6f74a9 +:100ad0006c6f6164657220496e74657266616365ee +:100ae0003a204c61737420736563746f72203078a0 +:100af0002578206572617365642061667465722073 +:100b0000256420706f6c6c730a000000426f6f7474 +:100b10006c6f6164657220496e74657266616365ad +:100b200020736563746f7220307825782065726158 +:100b300073656420616674657220256420706f6c33 +:100b40006c730a00426f6f746c6f61646572204948 +:100b50006e7465726661636520466c6173682065ba +:100b600072617365206572726f722e20204d6178fc +:100b700020706f6c6c20636f756e7420726561639a +:100b8000686564203a2025642121210a00000000c4 +:100b9000426f6f746c6f6164657220666c6173681c +:100ba000206572726f722e202041626f7274696ebe +:100bb0006720616e6420676f696e67206261636b96 +:100bc00020746f205354414e44425900426f6f7459 +:100bd0006c6f6164657220666c61736820777269fe +:100be00074652074696d656f7574206572726f72bb +:100bf0002e202041626f7274696e6720616e6420de +:100c0000676f696e67206261636b20746f20535455 +:100c1000414e444259000000436865636b696e674a +:100c200020466c61736820626f6f746c6f616465dd +:100c300072206461746120696e7465677269747989 +:080c40002e2e2e200000000002 +:020000040000fa +:020000041d02db +:100c4800e0ffbd271c00bfaf1800beaf21f0a00316 +:100c58002000c4af2400c5af1000c0a31400c0af6b +:100c68001400c2270200033cac076434212840006a +:100c7800458b400f000000001000c2a31000c28383 +:100c880010004014000000002000c28f0500401032 +:100c9800000000001400c28fffff43302000c28f05 +:100ca800000043a42400c28f06004010000000008a +:100cb8001400c28f02140200ffff43302400c28fc9 +:100cc800000043a41000c28321e8c0031c00bf8faa +:100cd8001800be8f2000bd270800e00300000000b8 +:100ce800d8ffbd272400bfaf2000beaf21f0a0036e +:100cf8002800c4af1200c0a71400c0af1000c0a3e2 +:100d08001800c0af1c00c0af2800c48f2128000005 +:100d18001c00062411a1400f000000001200c22789 +:100d280021204000212800001283400f000000000d +:100d38001200c29782130200ffff4230ff004230c8 +:100d48000300433002000224400062140000000047 +:100d58001400c2279c14042421284000458b400f0e +:100d6800000000001000c2a31000c2833900401424 +:100d7800000000001400c28f300040100000000086 +:100d88001400c38f0300023c251862001800c22714 +:100d9800212060002128400008000624798b400f9c +:100da800000000001000c2a31000c28329004014f4 +:100db800000000001c00c28f1400c2af1400c28fd4 +:100dc800ffff42301400c2af1400c28f170040105a +:100dd800000000001400c38f0300023c25186200c5 +:100de8002800c28f21206000212840001c00062412 +:100df800798b400f000000001000c2a31000c283ce +:100e080014004014000000002800c28f0000439422 +:100e18001200c2970f00621000000000f4ff0224c5 +:100e28001000c2a39783400b00000000f4ff0224c7 +:100e38001000c2a39783400b00000000f4ff0224b7 +:100e48001000c2a39783400b00000000f4ff0224a7 +:100e58001000c2a31000c28321e8c0032400bf8f82 +:100e68002000be8f2800bd270800e0030000000016 +:100e7800d8ffbd272400bfaf2000beaf21f0a003dc +:100e88002800c4af1200c0a71400c0af1000c0a350 +:100e98001800c0af1c00c0af2800c48f2128000074 +:100ea8001c00062411a1400f000000001200c227f8 +:100eb80021200000212840001283400f000000007c +:100ec8001200c29782130200ffff4230ff00423037 +:100ed80003004330020002244000621400000000b6 +:100ee8001400c2279c14042421284000458b400f7d +:100ef800000000001000c2a31000c2833900401493 +:100f0800000000001400c28f3000401000000000f4 +:100f18001400c38f0300023c251862001800c22782 +:100f2800212060002128400008000624798b400f0a +:100f3800000000001000c2a31000c2832900401462 +:100f4800000000001c00c28f1400c2af1400c28f42 +:100f5800021402001400c2af1400c28f1700401020 +:100f6800000000001400c38f0300023c2518620033 +:100f78002800c28f21206000212840001c00062480 +:100f8800798b400f000000001000c2a31000c2833c +:100f980014004014000000002800c28f0000439491 +:100fa8001200c2970f00621000000000f4ff022434 +:100fb8001000c2a3fb83400b00000000f4ff0224d2 +:100fc8001000c2a3fb83400b00000000f4ff0224c2 +:100fd8001000c2a3fb83400b00000000f4ff0224b2 +:100fe8001000c2a31000c28321e8c0032400bf8ff1 +:100ff8002000be8f2800bd270800e0030000000085 +:10100800e0ffbd271c00bfaf1800beaf21f0a00352 +:101018001000c0a321200000008b400f000000003a +:101028001000c2a31000c2830e004014000000008c +:10103800564d400f000000005e4d400f00000000bc +:101048000200023c0003443421280000558b400f65 +:101058000000000001000224ac8082af1c84400b19 +:1010680000000000000000001000c28321e8c00357 +:101078001c00bf8f1800be8f2000bd270800e003aa +:1010880000000000e0ffbd271c00bfaf1800beaf86 +:1010980021f0a0031000c0a3564d400f000000002f +:1010a80021200000008b400f000000001000c2a3a8 +:1010b8001000c2830a004014000000005e4d400f7b +:1010c80000000000fe43400f000000000100022461 +:1010d800ac8082af1000c2833c84400b000000004b +:1010e800000000001000c28321e8c0031c00bf8f6d +:1010f8001800be8f2000bd270800e0030000000094 +:10110800e0ffbd271c00bfaf1800beaf21f0a00351 +:101118002000c4af1000c0a3010002241100c2a324 +:101128002000c28f0d004010000000002000c28f78 +:10113800000042901100c2a31100c29305004010a4 +:10114800000000001100c2930400422c0300401468 +:1011580000000000010002241100c2a38744400fd0 +:10116800000000001000c2a31000c2832000401439 +:10117800000000001100c293212040002347400fc7 +:10118800000000001000c2a31000c2831b0040141e +:10119800000000001100c293212040008e47400f3c +:1011a800000000001000c2a31000c2831600401403 +:1011b800000000001100c393020002241c0062100a +:1011c800000000004344400f000000001000c2a3cc +:1011d8001000c2830f004014000000000200022427 +:1011e800ac8082af1000c2839084400b00000000e6 +:1011f800000000008884400b000000000000000090 +:101208008884400b00000000000000008884400b28 +:101218000000000000000000118b400f00000000db +:10122800cc4d400f000000008f84400b00000000f0 +:10123800000000001000c28321e8c0031c00bf8f1b +:101248001800be8f2000bd270800e0030000000042 +:10125800e0ffbd271c00bfaf1800beaf21f0a00300 +:101268002000c4af1000c0a32384400f000000007a +:101278001000c2a31000c283050040140000000043 +:101288002000c48f4284400f000000001000c2a359 +:101298001000c28321e8c0031c00bf8f1800be8f56 +:1012a8002000bd270800e00300000000e0ffbd2784 +:1012b8001c00bfaf1800beaf21f0a0032000c4afd0 +:1012c800d647400f000000001000c2a31000c283e0 +:1012d8000b00401400000000118b400f00000000bc +:1012e8001000c2a31000c2830800401400000000d0 +:1012f800cc4d400f00000000c684400b00000000e9 +:1013080000000000c684400b000000000000000040 +:10131800ac8080af1000c28321e8c0031c00bf8fdf +:101328001800be8f2000bd270800e0030000000061 +:10133800e0ffbd271c00bfaf1800beaf21f0a0031f +:101348008744400f000000001000c2a31000c283b1 +:1013580021e8c0031c00bf8f1800be8f2000bd27e6 +:101368000800e00300000000f8ffbd270400beaf3e +:1013780021f0a003ac80828f21e8c0030400be8f57 +:101388000800bd270800e00300000000e0ffbd27bb +:101398001c00beaf21f0a00388bf033c0061628c33 +:1013a8004429027c006162ac88bf033c0061628c06 +:1013b8008431027c006162ac88bf033c2061628c8e +:1013c800010004248431827c206162ac88bf033c24 +:1013d8002061628c4429027c206162ac88bf033c96 +:1013e8008061628c01000424c439827c806162ac13 +:1013f80088bf033c4060628c446b027c406062acf6 +:1014080088bf033c8061628c0442027c806162accc +:1014180088bf033c8061628c8431027c806162ac4d +:1014280088bf033c0061628cc418027c006162ac16 +:1014380088bf033c2061628c01000424c418827cac +:10144800206162ac88bf033c0061628c0400027cae +:10145800006162ac88bf033c2061628c01000424f7 +:101468000400827c206162ac88bf033cc060628c4f +:10147800010004240400827cc06062ac88bf033c85 +:101488000061628c8410027c006162ac88bf033cfe +:101498002061628c8410027c206162ac88bf033cae +:1014a8000061628c0421027c006162ac88bf033c4d +:1014b8002061628c0421027c206162ac88bf033cfd +:1014c8006010628cc418027c601062ac88bf033c58 +:1014d8003010628cc418027c301062ac88bf033ca8 +:1014e8000010628c0400027c001062ac88bf033cd0 +:1014f8009010628c0300042484e6827c901062ac15 +:1015080088bf033c9010628c04ce027c901062acc1 +:1015180088bf033c6010628c01000424c418827cdc +:10152800601062ac80bf023c005a40ac80bf033cf4 +:10153800005a628c010004244429827c005a62ac5f +:1015480080bf033c005a628c010004240442827c60 +:10155800005a62ac80bf033c005a628c444a027c49 +:10156800005a62ac80bf033c005a628c8431027c12 +:10157800005a62acc404023c00b442340000c2af5a +:101588000f00023c404242340400c2af0400c28f44 +:10159800401002000000c38f1b006200f4014000ed +:1015a80010180000121000000800c2af0400c28f1b +:1015b800401002000000c38f1b006200f4014000cd +:1015c8001010000004004010000000000800c28f46 +:1015d800010042240800c2af0800c28f0101422c5a +:1015e8000300401400000000000102240800c2affc +:1015f8000800c28f04004010000000000800c28fdd +:10160800ffff42240800c2af0800c28fff0042302b +:101618002118400080bf023c305a43ac80bf033cd5 +:10162800005a628c01000424c47b827c005a62ac9c +:1016380088bf033c0061628cc439027c006162ace3 +:1016480088bf033c8061628c444a027c806162ac42 +:1016580088bf033c2061628cc439027c206162ac83 +:1016680088bf033ca061628c444a027ca06162ace2 +:1016780088bf033cc060628c8431027cc06062ac6d +:1016880088bf033ce060628c8431027ce06062ac1d +:1016980088bf033c4060628c01000424c47b827cc8 +:1016a800406062ac88bf033c4060628c0100042447 +:1016b8004408827c406062ac81bf023cffff033477 +:1016c800609043ac81bf033c6090628c4408027c0c +:1016d800609062ac81bf033c6090628c8410027c95 +:1016e800609062ac88bf033c4060628c01000424b7 +:1016f8004408827c406062ac88bf033c4060628cd6 +:10170800010004248410827c406062ac81bf023cea +:10171800009040ac81bf023c109040ac81bf023cbd +:10172800209040ac81bf023c409040ac81bf033c5c +:101738004090628c01000424049c827c409062ac3e +:1017480081bf023cf0ff0324209043a081bf033ceb +:101758002090628c010004240462827c209062ac98 +:1017680081bf033c0090628c01000424c47b827c0e +:10177800009062ac81bf033c0090628c010004249d +:101788004408827c009062ac88bf033cc060628cd5 +:101798000421027cc06062ac88bf033ce060628cbc +:1017a800010004240421827ce06062ac88bf033c11 +:1017b800c060628cc418027cc06062ac88bf033c05 +:1017c800c060628c010004248410827cc06062ac1a +:1017d80088bf033cc060628c4408027cc06062ac75 +:1017e80080bf023c005840ac80bf033c0058628c6c +:1017f800010004244429827c005862ac80bf033c69 +:101808000058628c010004240442827c005862acb7 +:1018180080bf033c0058628c444a027c005862ac8a +:1018280080bf033c0058628c8431027c005862ac53 +:10183800c404023c00b442340c00c2af0f00023ca6 +:10184800404242341000c2af1000c28f4010020064 +:101858000c00c38f1b006200f40140001018000048 +:10186800121000001400c2af1000c28f4010020016 +:101878000c00c38f1b006200f40140001010000030 +:1018880004004010000000001400c28f0100422430 +:101898001400c2af1400c28f0101422c030040148f +:1018a80000000000000102241400c2af1400c28f1f +:1018b80004004010000000001400c28fffff422403 +:1018c8001400c2af1400c28fff004230211840003c +:1018d80080bf023c305843ac80bf033c0058628c48 +:1018e80001000424c47b827c005862ac88bf033c9e +:1018f8004060628c010004248410827c406062ace9 +:1019080088bf033c4060628c010004240400827c90 +:10191800406062ac88bf033cc060628cc45a027ce1 +:10192800c06062ac88bf033ce060628cc45a027c31 +:10193800e06062ac88bf033cc060628c0100042494 +:101948000442827cc06062ac88bf033c4060628c09 +:101958000421027c406062ac88bf033c6060628cfa +:10196800010004240421827c606062ac88bf033ccf +:101978004061628c4408027c406162ac88bf033cd1 +:101988006061628c010004244408827c606162ac5e +:1019980088bf033cc060628c4429027cc06062ac92 +:1019a80088bf033ce060628c4429027ce06062ac42 +:1019b80088bf033c4060628c446b027c406062ac30 +:1019c80088bf033c6060628c446b027c606062ace0 +:1019d80088bf033c4060628c0463027c406062ac58 +:1019e80088bf033c6060628c0463027c606062ac08 +:1019f80088bf033c4060628cc418027c406062acc3 +:101a080088bf033c6060628cc418027c606062ac72 +:101a180088bf033c4060628c444a027c406062acf0 +:101a280088bf033c6060628c444a027c606062aca0 +:101a380088bf033c4060628c8452027c406062ac88 +:101a480088bf033c6060628c8452027c606062ac38 +:101a580088bf033c4060628cc45a027c406062ac20 +:101a680088bf033c6060628cc45a027c606062acd0 +:101a780088bf033c4060628c010004244429827cb6 +:101a8800406062ac0100022421e8c0031c00be8f44 +:101a98002000bd270800e00300000000e0ffbd278c +:101aa8001c00bfaf1800beaf21f0a00321188000b2 +:101ab8002110a0002000c3a32400c2a71000c0afbb +:101ac800bc86400b0000000000a0023c801d43249f +:101ad8001000c28f21106200000040a01000c28fc9 +:101ae800010042241000c2af1000c28f0a00422c2d +:101af800f5ff40140000000000a0023c80ff032412 +:101b0800801d43a000a0023c801d42242000c393f6 +:101b1800010043a02400c29702120200ffff4230d6 +:101b2800ff00433000a0023c801d4224020043a075 +:101b38002400c297ff00433000a0023c801d4224cd +:101b4800030043a000a0023c801d44240400052497 +:101b58005988400f0000000021e8c0031c00bf8f17 +:101b68001800be8f2000bd270800e0030000000019 +:101b7800e0ffbd271c00bfaf1800beaf21f0a003d7 +:101b8800211080002400c5af2000c2a30100022458 +:101b98001400c2af1000c0aff286400b0000000076 +:101ba80000a0023c801d43241000c28f2110620057 +:101bb800000040a01000c28f010042241000c2aff4 +:101bc8001000c28f0a00422cf5ff401400000000ec +:101bd80000a0023c80ff0324801d43a000a0023c1b +:101be800801d42242000c393010043a000a0023cb2 +:101bf800801d422481ff0324020043a000a0023c70 +:101c0800801d4424020005245988400f000000006c +:101c180000a0023c801d4224020042902120400086 +:101c280000a0023c741d452402000624d588400ffc +:101c3800000000001400c2af1400c38f010002248a +:101c480005006210000000002400c28f000040a4bc +:101c58002587400b0000000000a0023c741d429044 +:101c680000120200201e027c00a0023c741d4224c7 +:101c7800010042902016027c251062002016027c8a +:101c8800ffff43302400c28f000043a421e8c003b3 +:101c98001c00bf8f1800be8f2000bd270800e0037e +:101ca80000000000e0ffbd271c00bfaf1800beaf5a +:101cb80021f0a0030a000224148182af020002244a +:101cc800188182af0500042400100524a986400f5e +:101cd800000000001f5c02241000c2a71000c29779 +:101ce8002120000021284000a986400f00000000a4 +:101cf80021e8c0031c00bf8f1800be8f2000bd273d +:101d08000800e00300000000e0ffbd271c00bfaf93 +:101d18001800beaf21f0a0030a000224148182af8c +:101d280002000224188182af050004240010052453 +:101d3800a986400f000000001f5c02241000c2a703 +:101d48001000c2972120000021284000a986400fda +:101d58000000000021e8c0031c00bf8f1800be8fe0 +:101d68002000bd270800e00300000000e0ffbd27b9 +:101d78001c00bfaf1800beaf21f0a0031900022459 +:101d8800148182af01000224188182af0500042467 +:101d980000280524a986400f000000001f5c0224cb +:101da8001000c2a71000c29721200000212840007f +:101db800a986400f0000000021e8c0031c00bf8f67 +:101dc8001800be8f2000bd270800e00300000000b7 +:101dd800e0ffbd271c00bfaf1800beaf21f0a00375 +:101de80028000224148182af01000224188182afe6 +:101df8000500042400400524a986400f00000000c7 +:101e08001f0c02241000c2a71000c2972120000056 +:101e180021284000a986400f0000000021e8c003e7 +:101e28001c00bf8f1800be8f2000bd270800e003ec +:101e380000000000e0ffbd271c00bfaf1800beafc8 +:101e480021f0a00364000224148182af010002245f +:101e5800188182af0500042400a00534a986400f2c +:101e6800000000001f0402241000c2a71000c2973f +:101e78002120000021284000a986400f0000000012 +:101e880021e8c0031c00bf8f1800be8f2000bd27ab +:101e98000800e00300000000e0ffbd271c00bfaf02 +:101ea8001800beaf21f0a003010002241000c2af49 +:101eb8002120000000800534a986400f00000000a2 +:101ec8001000c2af1400c2272120000021284000c2 +:101ed800de86400f000000001400c397ff3902247b +:101ee800040062100000000021100000c287400baf +:101ef800000000002b87400f000000001000c28f78 +:101f080021e8c0031c00bf8f1800be8f2000bd272a +:101f18000800e00300000000e0ffbd271c00bfaf81 +:101f28001800beaf21f0a003010004241000c2274e +:101f380021284000de86400f000000001000c297f4 +:101f48002016027c21e8c0031c00bf8f1800be8f3a +:101f58002000bd270800e00300000000e0ffbd27c7 +:101f68001c00bfaf1800beaf21f0a003020004247c +:101f78001000c22721284000de86400f0000000024 +:101f88001000c297c2100200ffff4230801002000a +:101f9800ffff42302016027c21e8c0031c00bf8fdf +:101fa8001800be8f2000bd270800e00300000000d5 +:101fb800e0ffbd271c00bfaf1800beaf21f0a00393 +:101fc800030004241000c22721284000de86400fa9 +:101fd800000000001000c2972016027c21e8c00310 +:101fe8001c00bf8f1800be8f2000bd270800e0032b +:101ff80000000000e0ffbd271c00bfaf1800beaf07 +:1020080021f0a003030004241000c2272128400067 +:10201800de86400f000000001000c2972118400023 +:102028001881828f1b006200f40140001018000024 +:10203800121000002016027c21e8c0031c00bf8f8c +:102048001800be8f2000bd270800e0030000000034 +:10205800e0ffbd271c00bfaf1800beaf21f0a003f2 +:10206800040004241000c22721284000de86400f07 +:10207800000000001000c2972016027c21e8c0036f +:102088001c00bf8f1800be8f2000bd270800e0038a +:1020980000000000e0ffbd271c00bfaf1800beaf66 +:1020a80021f0a003040004241000c22721284000c6 +:1020b800de86400f000000001000c2972118400083 +:1020c8001481828f1b006200f40140001018000088 +:1020d800121000002016027c21e8c0031c00bf8fec +:1020e8001800be8f2000bd270800e0030000000094 +:1020f800f0ffbd270c00beaf21f0a0038e01022423 +:102108000000c2af80bf023c005040ac80bf033c1f +:102118000050628c01000424444a827c005062ac66 +:102128000000c38f80bf023c405043ac80bf033cdb +:102138000050628c01000424c47b827c005062ac95 +:10214800a48180afa88180af21e8c0030c00be8fb6 +:102158001000bd270800e00300000000f0ffbd27c5 +:102168000c00beaf21f0a0031000c4af2110a000e6 +:102178001400c2a3010002240000c2af80bf033cc8 +:102188000050628c010004240400827c005062ac80 +:102198000000000080bf023c0050428c0100423029 +:1021a800fcff40140000000080bf023c1050428c2d +:1021b800000442300500401000000000a48180aff8 +:1021c80021100000c588400b000000000400c0afcb +:1021d8009d88400b000000000400c28f1000c38fd0 +:1021e80021106200000042902118400080bf023c8c +:1021f800505043aca88180af9588400b0000000088 +:1022080080bf023c1050428c000442300b00401446 +:1022180000000000a881828f0c00033c0135633464 +:102228002a18430001006338ff006330010042248c +:10223800a88182af0500601000000000a48180af73 +:102248000000c0af9a88400b0000000080bf023c2d +:102258001050428c00404230e9ff4014000000005a +:102268000400c28f010042240400c2af1400c393cb +:102278000400c28f2a104300d7ff4014000000005a +:1022880080bf033c0050628c010004248410827ccf +:10229800005062aca88180afbd88400b00000000f0 +:1022a80080bf023c1050428c000442300b004014a6 +:1022b80000000000a881828f0c00033c01356334c4 +:1022c8002a18430001006338ff00633001004224ec +:1022d800a88182af0500601000000000a48180afd3 +:1022e8000000c0afc288400b0000000080bf023c65 +:1022f8000050428c04004230e9ff40140000000006 +:1023080001000224a48182af0000c28f21e8c0032b +:102318000c00be8f1000bd270800e003000000007d +:10232800f8ffbd270400beaf21f0a00321108000f4 +:102338000800c2a32110000021e8c0030400be8fda +:102348000800bd270800e00300000000f0ffbd27db +:102358000c00beaf21f0a003211880001400c5af07 +:102368002110c0001000c3a31800c2a3010002245a +:102378000400c2af80bf033c0050628c01000424fb +:102388000400827c005062aca88180aff088400bca +:102398000000000080bf023c1050428c0004423014 +:1023a8000500401000000000a48180af211000004b +:1023b8008d89400b0000000080bf023c0050428c19 +:1023c80001004230f3ff4014000000001000c393e6 +:1023d80080bf023c505043aca88180af0e89400baf +:1023e8000000000080bf023c1050428c00044230c4 +:1023f8000b00401400000000a881828f0c00033cf1 +:10240800013563342a18430001006338ff00633044 +:1024180001004224a88182af05006010000000007e +:10242800a48180af211000008d89400b00000000be +:1024380080bf023c1050428c00404230e9ff4014fb +:10244800000000000000c0af6589400b00000000dc +:1024580080bf033c0050628c01000424c418827cb5 +:10246800005062aca88180af3189400b00000000a9 +:1024780080bf023c1050428c000442300b004014d4 +:1024880000000000a881828f0c00033c01356334f2 +:102498002a18430001006338ff006330010042241a +:1024a800a88182af0500601000000000a48180af01 +:1024b800211000008d89400b0000000080bf023c05 +:1024c8000050428c08004230e9ff40140000000030 +:1024d8000000c28f1400c38f2110620080bf033c2c +:1024e8006050638cff006330000043a080bf033c52 +:1024f8000050628c010004244429827c005062aca4 +:1025080080bf033c0050628c010004240421827cbb +:10251800005062aca88180af5d89400b00000000cc +:1025280080bf023c1050428c000442300b00401423 +:1025380000000000a881828f0c00033c0135633441 +:102548002a18430001006338ff0063300100422469 +:10255800a88182af0500601000000000a48180af50 +:10256800211000008d89400b0000000080bf023c54 +:102578000050428c10004230e9ff40140000000077 +:102588000000c28f010042240000c2af1800c393ac +:102598000000c28f2a104300adff40140000000065 +:1025a80080bf033c0050628c010004248410827cac +:1025b800005062aca88180af8589400b0000000004 +:1025c80080bf023c1050428c000442300b00401483 +:1025d80000000000a881828f0c00033c01356334a1 +:1025e8002a18430001006338ff00633001004224c9 +:1025f800a88182af0500601000000000a48180afb0 +:10260800211000008d89400b0000000080bf023cb3 +:102618000050428c04004230e9ff401400000000e2 +:1026280001000224a48182af0400c28f21e8c00304 +:102638000c00be8f1000bd270800e003000000005a +:10264800f8ffbd270400beaf21f0a003a481828f4c +:1026580021e8c0030400be8f0800bd270800e0037e +:102668000000000098ffbd276400bfaf6000beaf48 +:1026780021f0a003010002241000c2afc404023cf0 +:1026880000b442341400c2af050002241800c2afdf +:1026980030a5400f000000001c00c2af88bf023cfc +:1026a80040000324042043ac1800c28f01004230cc +:1026b800ff0042301d004010000000001400c28fcf +:1026c8002000c2af2400c0afbe89400b000000004c +:1026d8002400c28f010042242400c2af2000c38f0f +:1026e80036fe023c803c4234211062002000c2af1a +:1026f8002000c38fc901023c81c342342b10620001 +:10270800f3ff40100000000030a5400f000000005b +:102718002800c2af88bf023c2400c38f004043acee +:102728002800c48fb1a4400f000000001800c28f19 +:102738000200423068004010000000001400c28f00 +:102748002c00c2af2c00c28f3000c2af2c00c38f48 +:10275800c404023c01b442342b1062000800401447 +:10276800000000000800023c3400c2af3000c28ff5 +:10277800421002003000c2afe389400b00000000a5 +:102788003400c0af3400c28f3800c2af30a5400f4c +:10279800000000003c00c2af88bf023c0030428c01 +:1027a8000003427cff0042304000c2af4000c28fad +:1027b800090040140000000088bf023c00100324f8 +:1027c800083043ac88bf023c0030428c00084230dd +:1027d800fcff4014000000004000c28f4400c2af5c +:1027e80081bf023c30f240ac81bf023c99aa033c55 +:1027f8005566633430f243ac81bf023c6655033cf6 +:10280800aa99633430f243ac81bf023c00f0428c99 +:102818005800c2af5800c28fc4a4027c5800c2af8f +:102828005800c38f3800c28f251062005800c2af0d +:102838005800c38f81bf023c00f043ac81bf023c0b +:1028480000f0428c5800c2af81bf023c3333033cd6 +:102858003333633430f243ac4400c28f4800c2af14 +:102868004800c28f130040100000000088bf023cdf +:102878000030428c0003427cff0042304c00c2af63 +:102888004c00c28f100040140000000088bf023cba +:1028980000100324083043ac88bf023c0030428c4f +:1028a80000084230fcff401400000000358a400b4d +:1028b8000000000088bf023c00100324043043ac31 +:1028c800358a400b00000000000000003c00c48f67 +:1028d800b1a4400f000000001800c28f040042306d +:1028e8000c0040100000000088bf023c0040428cf1 +:1028f8005000c2af5000c28f300042345000c2af07 +:1029080088bf023c5000c38f004043acd1a4400fa5 +:10291800000000001400c28f5400c2af81bf023c07 +:1029280000f0428cc00c427cff0042305400c38f40 +:10293800061043005400c2af1c00c48fb1a4400f5e +:1029480000000000212000006fa4400f00000000dc +:1029580081bf033c00f0628c4408027c00f062ac4a +:1029680081bf023cffff0334609043ace584400f15 +:10297800000000002ea5400f00000000c474400fa6 +:102988000000000043a0400f000000005a97400fcd +:10299800000000001f8c400f00000000f8a2400f4c +:1029a800000000008a9e400f000000009f30400f8a +:1029b800000000008a7a400f00000000c196400f16 +:1029c800000000007064400f00000000f297400f04 +:1029d80000000000039d023c9491442427a4400f6a +:1029e80000000000ce64400f000000009b9e400fd6 +:1029f80000000000cf3d400f00000000d660400fef +:102a0800000000001b3a400f0000000021200000d9 +:102a1800900105249876400f00000000039d023cb9 +:102a2800b09144240100052438a4400f00000000a0 +:102a380058a0400f000000006ea0400f00000000ea +:102a4800010002241000c2afbf8a400b0000000042 +:102a58006ea0400f00000000a53b400f00000000e2 +:102a6800f660400f000000009035400f00000000a5 +:102a78007197400f000000003d8c400f00000000df +:102a88000798400f00000000bb9e400f00000000a8 +:102a9800e43d400f00000000d196400f0000000008 +:102aa80021200000ab75400f00000000110040100d +:102ab8000000000088bf023c2061428c8001427cfb +:102ac800ff00423027100200ff0042300100423070 +:102ad800ff00443088bf033c2061628c8431827cd3 +:102ae800206162ac21200000900105249876400ff7 +:102af800000000001000c38f01000224d4ff621000 +:102b0800000000001000c28f21e8c0036400bf8fde +:102b18006000be8f6800bd270800e00300000000c9 +:102b2800e8ffbd271400bfaf1000beaf21f0a0031f +:102b3800e584400f0000000021e8c0031400bf8fa7 +:102b48001000be8f1800bd270800e0030000000039 +:102b5800e8ffbd271400bfaf1000beaf21f0a003ef +:102b6800211080001800c2a31800c2832120400051 +:102b78002e98400f0000000021e8c0031400bf8f0a +:102b88001000be8f1800bd270800e00300000000f9 +:102b9800e8ffbd271400bfaf1000beaf21f0a003af +:102ba8001800c4af5294400f000000000100042434 +:102bb8004494400f000000002110000021e8c003e9 +:102bc8001400bf8f1000be8f1800bd270800e00357 +:102bd80000000000f8ffbd270400beaf21f0a003ed +:102be8002110000021e8c0030400be8f0800bd27a3 +:102bf8000800e00300000000e0ffbd271c00bfaf95 +:102c08001800beaf21f0a0032000c4af1000c0a37d +:102c18002000c48fe68a400f000000001000c2a305 +:102c28001000c28321e8c0031c00bf8f1800be8fac +:102c38002000bd270800e00300000000e0ffbd27da +:102c48001c00bfaf1800beaf21f0a0031000c0a346 +:102c5800f78a400f000000001000c2a31000c283d2 +:102c680021e8c0031c00bf8f1800be8f2000bd27bd +:102c78000800e00300000000e8ffbd271400bfaf14 +:102c88001000beaf21f0a003414d400f000000002e +:102c980021e8c0031400bf8f1000be8f1800bd27a5 +:102ca8000800e00300000000f0ffbd270c00beafe5 +:102cb80021f0a0031000c4af0000c0a30000c2832d +:102cc80021e8c0030c00be8f1000bd270800e003f8 +:102cd80000000000e8ffbd271400bfaf1000beaf22 +:102ce80021f0a0031800c4af1800c48fd64d400fc0 +:102cf8000000000021e8c0031400bf8f1000be8f41 +:102d08001800bd270800e00300000000e8ffbd2709 +:102d18001400bfaf1000beaf21f0a0031800c4af6d +:102d28001c00c5af1800c48f1c00c58fe74d400fad +:102d38000000000021e8c0031400bf8f1000be8f00 +:102d48001800bd270800e00300000000e8ffbd27c9 +:102d58001400bfaf1000beaf21f0a0031800c4af2d +:102d68001c00c5af1800c48f1c00c58f0b4e400f48 +:102d78000000000021e8c0031400bf8f1000be8fc0 +:102d88001800bd270800e00300000000e8ffbd2789 +:102d98001400bfaf1000beaf21f0a0031800c4afed +:102da8001c00c5af2110c0002000c2a72000c29798 +:102db8001800c48f1c00c58f213040002f4e400fd3 +:102dc8000000000021e8c0031400bf8f1000be8f70 +:102dd8001800bd270800e00300000000e0ffbd2741 +:102de8001c00bfaf1800beaf21f0a0032000c4af85 +:102df8002400c5af2800c6af18808297f8ff422488 +:102e08001600c2a71000c0af1400c0a31600c397d5 +:102e18002800c28f2b10620012004014000000002e +:102e28002400c38f1000c28f211862002800c28faf +:102e3800ffff42302000c48f21286000213040006d +:102e4800658b400f00000000ff0043301400c29360 +:102e580021106200ff0042301400c2a3bb8b400b5c +:102e6800000000002400c38f1000c28f21186200e8 +:102e78001600c2972000c48f21286000213040002e +:102e8800658b400f00000000ff0043301400c29320 +:102e980021106200ff0042301400c2a31400c28354 +:102ea8000f004014000000001600c2972800c38fce +:102eb800231062002800c2af1600c2971000c38f0b +:102ec800211062001000c2af1600c2972000c38f05 +:102ed800211062002000c2af858b400b000000006b +:102ee800000000001400c28321e8c0031c00bf8f4b +:102ef8001800be8f2000bd270800e0030000000076 +:102f0800e8ffbd271400bfaf1000beaf21f0a0033b +:102f18001800c4af1c00c5af2110c0002000c2a714 +:102f28002000c2971800c48f1c00c58f21304000b4 +:102f38006c4e400f0000000021e8c0031400bf8f52 +:102f48001000be8f1800bd270800e0030000000035 +:102f5800e0ffbd271c00bfaf1800beaf21f0a003e3 +:102f68002000c4af2400c5af2800c6af18808297e0 +:102f7800f8ff42241600c2a71000c0af1400c0a377 +:102f88001600c3972800c28f2b106200120040144d +:102f9800000000002400c38f1000c28f21186200b7 +:102fa8002800c28fffff42302000c48f2128600014 +:102fb80021304000c28b400f00000000ff0043306a +:102fc8001400c29321106200ff0042301400c2a313 +:102fd800188c400b000000002400c38f1000c28f23 +:102fe800211862001600c2972000c48f21286000b3 +:102ff80021304000c28b400f00000000ff0043302a +:103008001400c29321106200ff0042301400c2a3d2 +:103018001400c2830f004014000000001600c2977d +:103028002800c38f231062002800c2af1600c29781 +:103038001000c38f211062001000c2af1600c297a3 +:103048002000c38f211062002000c2afe28b400b2a +:1030580000000000000000001400c28321e8c00343 +:103068001c00bf8f1800be8f2000bd270800e0039a +:1030780000000000e8ffbd271400bfaf1000beaf7e +:1030880021f0a003211000009c8182af848180afd1 +:10309800908180af8c8180af948180af0100022441 +:1030a800a08182af03000424640005249876400fb1 +:1030b8000000000021100000888182af8c8180af61 +:1030c800a887400f00000000020040140000000024 +:1030d800a08180af21e8c0031400bf8f1000be8f0d +:1030e8001800bd270800e00300000000d8ffbd2736 +:1030f8002400bfaf2000beaf21f0a00303000424ca +:10310800ab75400f00000000b30040100000000045 +:1031180081bf033c4090628c01000424049c827ca3 +:10312800409062ac81bf033c0090628c4408027cf2 +:10313800009062ac0000000081bf023c0090428c0d +:1031480001004230fcff40100000000081bf023c3b +:103158007090428c1000c2af81bf033c0090628c1b +:10316800010004244408827c009062ac1000c48fe3 +:10317800f1a3400f0000000021184000039d023c0d +:10318800212060007891458cae99400f0000000026 +:103198001400c2af039d023c1400c48f7c91458c7f +:1031a800399b400f000000001400c2af1400c28f0a +:1031b8001800c2af039d023c1400c48f8091458c57 +:1031c800399b400f000000001400c2af8c81828f31 +:1031d8008813422806004014000000008c8180af4c +:1031e8001400c28f888182af878c400b00000000da +:1031f8008c81828f010042248c8182af8881828fea +:10320800212040001400c58f8a95400f000000005f +:10321800888182af1400c28f9c8182af030004248e +:10322800640005249876400f00000000a081838f79 +:10323800010002240b006214000000002788400fe0 +:1032480000000000848182af9289400f00000000d6 +:103258006100401400000000a08180aff88c400b92 +:10326800000000001c00c0af81bf033c4090628c8e +:10327800049c027c409062ac81bf033c0090628c4d +:103288004408027c009062ac0000000081bf023c50 +:103298000090428c01004230fcff4010000000000a +:1032a80081bf023c7090428c1c00c2af81bf033cbe +:1032b8000090628c010004244408827c009062ac77 +:1032c80081bf033c4090628c02000424049c827cf1 +:1032d800409062ac81bf033c0090628c4408027c41 +:1032e800009062ac0000000081bf023c0090428c5c +:1032f80001004230fcff40100000000081bf023c8a +:103308007090428c1000c2af81bf033c0090628c69 +:10331800010004244408827c009062ac1000c38f32 +:103328001c00c28f231062001000c2af1000c48faf +:10333800f1a3400f000000001400c2af039d023c3f +:103348001400c48f7891458cae99400f000000009e +:103358001400c2af039d023c1400c48f8491458cb5 +:10336800399b400f000000001400c2af039d023ccf +:103378001400c48f8891458cae99400f000000005e +:103388001400c2af1400c28f1800c2af9481828f9c +:10339800f401422807004014000000000100022444 +:1033a800948182af1000c28f988182aff68c400b57 +:1033b800000000009481828f01004224948182af32 +:1033c8009881838f1000c28f21106200988182af8c +:1033d8001000c28f848182af21e8c0032400bf8f10 +:1033e8002000be8f2800bd270800e0030000000071 +:1033f800e0ffbd271c00bfaf1800beaf1400b0af80 +:1034080021f0a0038881908f8c81828f2120400039 +:1034180046a3400f000000002120000221284000a0 +:10342800ae99400f000000009c8182af211000007f +:10343800888182af8c8180af9c81828f21e8c00314 +:103448001c00bf8f1800be8f1400b08f2000bd274e +:103458000800e00300000000f8ffbd270400beaf2d +:1034680021f0a0038c8180af988180af8481828f06 +:1034780021e8c0030400be8f0800bd270800e00350 +:1034880000000000f8ffbd270400beaf21f0a00334 +:103498009081828f21e8c0030400be8f0800bd27f9 +:1034a8000800e00300000000e8ffbd271400bfafdc +:1034b8001000beaf21f0a0039c81828f039d033cc6 +:1034c800609164242128400038a4400f00000000c7 +:1034d80021e8c0031400bf8f1000be8f1800bd275d +:1034e8000800e00300000000f8ffbd270400beaf9d +:1034f80021f0a003a081828f21e8c0030400be8fc1 +:0c3508000800bd270800e00300000000e0 +:020000040000fa +:020000041d02db +:103514004a462e636f6d00000a0d000025732025b6 +:1035240073202573202573202573000068656c7053 +:1035340000000000706f7765720000000a5b73740e +:103544006174655d20706172616d65746572206976 +:103554007320696e76616c69642e202054797065dd +:10356400202768656c702720666f72206d6f726506 +:1035740020696e666f0a00006f6e00005475726eeb +:10358400696e67206368616c6574277320696e7661 +:103594006572746572204f4e0a0000006f66660003 +:1035a4005475726e696e67206368616c6574277305 +:1035b40020696e766572746572204f46460a000073 +:1035c4000a5b73746174655d20706172616d65740a +:1035d400657220697320696e76616c69642e20209f +:1035e40054797065202768656c702720666f722097 +:1035f40076616c69642076616c7565730a000000fd +:103604000a00000077696669000000000a5b7661c1 +:103614006c75655d20706172616d65746572206999 +:103624007320696e76616c69642e2020547970650c +:10363400202768656c702720666f72206d6f726535 +:1036440020696e666f0a00005475726e696e672099 +:1036540057694669206d6f64756c65204f4e0a008a +:103664005769466920616c726561647920636f6e85 +:103674006e65637465642e2e2e0a00005475726e96 +:10368400696e672057694669206d6f64756c6520a3 +:103694004f46462e2e2e20476f6f64627965210aad +:1036a4000000000057694669206d6f64756c6520e1 +:1036b400616c7265616479204f46462e2e2e20740b +:1036c4006861742773207765697264210a000000b9 +:1036d400737461747573000057694669206d6f6473 +:1036e400756c65204f46460a00000000576946691c +:1036f40020436f6e6e65637465640a00576946699a +:1037040020446973636f6e6e65637465640a0000b8 +:1037140057694669204552524f520a005769466913 +:1037240020737461746520556e6b6e6f776e210a19 +:1037340000000000626174746572790025660000ff +:103744004261747465727920566f6c746167653a6e +:1037540020000000256400004261747465727920c1 +:103764006368617267652063757272656e743a206e +:10377400000000006d410a00766f6c74616765009b +:1037840063757272656e7400736f63004261747462 +:1037940065727920534f433a20000000250a000047 +:1037a40047656e6572616c207374617475733a0a4f +:1037b40000000000496e76657274657220706f7740 +:1037c40065722072656c61793a204f46460a0000a2 +:1037d400496e76657274657220706f7765722072b7 +:1037e400656c61793a204f4e0a000000496e766597 +:1037f4007274657220706f7765722072656c61797e +:103804003a20554e4b4e4f574e0a000057694669b1 +:103814003a204d6f64756c65206973207475726eff +:103824006564204f46460a00576946693a20436f4b +:103834006e6e656374656420746f2041500a0000e5 +:10384400576946693a20446973636f6e6e656374a1 +:1038540065642066726f6d2041500a00576946699d +:103864003a204d6f64756c6520696e697469616c8a +:10387400697a6174696f6e206572726f720a0000f2 +:10388400576946693a20556e6b6e6f776e20737474 +:103894006174650a00000000252e326600000000f5 +:1038a400560a000025646d410a00000025642525a0 +:1038b4000a000000626f6f746c6f616465720000cf +:1038c4000a5b636f6d6d616e645d20706172616d22 +:1038d4006574657220697320696e76616c69642e03 +:1038e400202054797065202768656c702720666fe6 +:1038f40072206d6f726520696e666f0a00000000a9 +:103904007374617274000000416374697661746950 +:103914006e6720626f6f746c6f616465720a000079 +:1039240073746f70000000004465616374697661ac +:1039340074696e6720626f6f746c6f616465720a7c +:10394400000000000a426f6f746c6f61646572203e +:10395400636c69656e7420636f6e6e656374656411 +:103964000a0000000a426f6f746c6f616465722014 +:10397400636c69656e74206e6f7420636f6e6e6520 +:10398400637465640a000000646562756700000082 +:10399400556e6b6e6f776e20636f6d6d616e640a2a +:0439a4000a00000015 +:020000040000fa +:020000041d02db +:1039a8002148c000214080003b00e0142118a000fd +:1039b8002b10a600480040102010c27008004010cc +:1039c800023c090023200200062088000418450054 +:1039d800044846002518830004404800023c0900ba +:1039e8001b006700f401e000ffff2b31022c0800e8 +:1039f800125000001020000002504b7100340400e7 +:103a08002530c5002b60ca001b006700f401e000e8 +:103a1800090080512330ca002130c9002b18c90081 +:103a2800050060542330ca002b20ca002118c900a1 +:103a38000b3064002330ca001b00c700f401e0000b +:103a4800ffff0831122000001018000002208b70c0 +:103a5800001c0300254068002b1804011b00c70048 +:103a6800f401e000090060502340040121400901ed +:103a78002b18090105006054234004012b18040188 +:103a8800214809010b402301234004010610480086 +:103a98000800e003211800002b10a700470040147d +:103aa8002050ea704800401520000c242b10e50037 +:103ab80005004014231086002b108600cd004054ca +:103ac80021108000231086002328a7002b208200c5 +:103ad8000800e0032318a4000600c0142010227177 +:103ae800010002241b004600f401c0001248000037 +:103af8002010227182004054200008242328a900a5 +:103b0800021c0900ffff27311b00a300f40160001d +:103b1800025c08001220000010500000022087708c +:103b280000340a002530cb002b50c4001b00a30032 +:103b3800f4016000090040512330c4002130c9005d +:103b48002b28c9000500a0542330c4002b50c40002 +:103b58002128c9000b30aa002330c4001b00c30071 +:103b6800f4016000ffff0831122000001028000057 +:103b780002388770002c05002540a8002b2007017b +:103b88001b00c300f40160000900805023400701b6 +:103b9800214009012b180901050060542340070141 +:103ba8002b180701214809010b4023012340070175 +:103bb800061048000800e0032118000021108000ca +:103bc8000800e0032118a00023608a010438470197 +:103bd800065886012558670106688501023c0b00d6 +:103be8001b00a701f401e000ffff6f3106108401fc +:103bf8000428450125284500021405000430460123 +:103c0800127000001018000002c0cf71004c0300b1 +:103c1800254822012b1038011b00a701f401e00000 +:103c28000a0040100420440121482b012b102b01cd +:103c380006004014ffffce252b1038010400405029 +:103c480023483801ffffce2521482b01234838019e +:103c58001b002701f401e000ffffa53012680000f7 +:103c6800101800000278af710014030025104500f9 +:103c78002b184f001b002701f401e0000b00601017 +:103c880000440e0021104b002b184b000700601455 +:103c9800ffffad252b184f00050060102540a80137 +:103ca800ffffad2521104b0000440e002540a80160 +:103cb8001900060123784f00104800001240000048 +:103cc8002b28e90121182001213820013d00a014ea +:103cd800121000004300e9512b1882002318e30159 +:103ce800233088002b208600231864000460830199 +:103cf8000610460125104c000800e0030618430191 +:103d0800234002010448490006300501021c09004d +:103d18001b00c300f4016000ffff273106580401af +:103d28000428450025586501022c0b000440440076 +:103d380012500000106000000250477100640c002f +:103d48002520ac002b288a001b00c300f40160006a +:103d58000600a05023208a00212089002b288900f2 +:103d68001d00a0102b308a0023208a001b0083002e +:103d7800f4016000ffff6b311230000010500000aa +:103d88000230c770002c0a002528ab002b50a60073 +:103d98001b008300f40160005bff40512328a6004c +:103da8002128a9002b20a90057ff80542328a6000a +:103db8002b50a6002120a9000b288a00c48e400b96 +:103dc8002328a600234046002318eb002b104800a8 +:103dd800398f400b23186200212889005c8f400b23 +:103de8000b20a600f8ff6054234046003a8f400b92 +:103df800211800000800e003000000002110c000a6 +:103e0800214080003e00e0142118a0002b30a600bd +:103e18004600c010000000002020447008008010f8 +:103e2800022c0200232804000628a8000418830096 +:103e3800041082002518a30004408800022c020008 +:103e48001b006500f401a000ffff49300264080070 +:103e5800125000001058000002204971003c0b006d +:103e68002538ec002b30e4001b006500f401a000ad +:103e78000b00c0102318e4002138e2002b18e200e0 +:103e880006006014ffff4a252b18e40004006010a8 +:103e98002318e400ffff4a252138e2002318e40034 +:103ea8001b006500f401a000ffff0831122000008c +:103eb8001038000002488970003c07002540e800df +:103ec8002b3009011b006500f401a0000600c0109a +:103ed800214002012b10020103004014ffff84243b +:103ee8002b48090123208900004c0a002548890035 +:103ef80021280000211020010800e0032118a0005b +:103f08002b10a70042004054212800002018e3701d +:103f18004300601420000a242b28e500c500a014e3 +:103f28002b208600bf8f400b0100892c060040140f +:103f380020184370010003241b006200f4014000b4 +:103f480012100000201843707a00605420000824e2 +:103f58002348a200023c0200ffff4b300100052469 +:103f68001b002701f401e000026c08001250000059 +:103f78001060000002204b71001c0c0025186d0019 +:103f88002b3064001b002701f401e0000900c05039 +:103f980023186400211862002b3062000400c0144a +:103fa800ffff4a252b306400a500c054ffff4a25b7 +:103fb800231864001b006700f401e000ffff0831cc +:103fc800122000001048000002588b70004c0900b5 +:103fd800254028012b300b011b006700f401e0008d +:103fe8000600c010214002012b10020103004014fa +:103ff800ffff84242b580b0123208b00004c0a0060 +:1040080025488900211020010800e0032118a0009c +:1040180021480000211020010800e0032118a00019 +:10402800235043010610460104386700253847002d +:1040380006484501021407001b002201f401400054 +:10404800ffffec300650440104286500252845018f +:1040580002540500125800001070000002686c71cc +:1040680000440e0025400a012b500d011b002201bf +:10407800f40140000a0040110430660021400701a5 +:104088002b48070106002015ffff6b252b480d0163 +:104098000400205123400d01ffff6b25214007013b +:1040a80023400d011b000201f4014000ffffa53071 +:1040b800124800001068000002602c71006c0d00ae +:1040c8002528a5012b50ac001b000201f40140007b +:1040d8000b004051005c0b002128a7002b10a70003 +:1040e80006004014ffff29252b10ac0004004050a7 +:1040f800005c0b00ffff29252128a700005c0b00ae +:1041080025482b01190026012328ac00103800008f +:104118002b40a70044000015123000003f00a750b4 +:104128000420640021280000211020010800e00379 +:104138002118a00023400301041062000630050185 +:10414800023c02001b00c700f401e000ffff4b30f7 +:104158000428650006480401044064002548250138 +:10416800026c0900125000001060000002204b7120 +:1041780000640c002518ac012b2864001b00c70044 +:10418800f401e0000b00a05023186400211862001d +:104198002b2862000600a014ffff4a252b28640084 +:1041a8000400a05023186400ffff4a25211862006c +:1041b800231864001b006700f401e000ffff2931a9 +:1041c800122000001060000002308b7000640c00a8 +:1041d800254889012b2826011b006700f401e0000f +:1041e8000b00a050002c0a00214822012b182201a4 +:1041f80006006014ffff84242b1826010400605079 +:10420800002c0a00ffff842421482201002c0a0008 +:1042180023482601da8f400b252885002b3086009d +:10422800c1ffc05021280000ffff29254c90400bfa +:104238002128000021280000bf8f400b010009241d +:08424800ee8f400b211862000b +:020000040000fa +:020000041d02db +:104250002558000000000000c700000049000000d1 +:104260008e0000009200000055000000db000000fe +:104270001c000000e300000024000000aa00000071 +:104280006d00000071000000b60000003800000062 +:10429000ff00000001000000c60000004800000010 +:1042a0008f0000009300000054000000da000000be +:1042b0001d000000e200000025000000ab0000002f +:1042c0006c00000070000000b70000003900000022 +:1042d000fe00000002000000c50000004b000000ce +:1042e0008c0000009000000057000000d900000082 +:1042f0001e000000e100000026000000a8000000f1 +:104300006f00000073000000b40000003a000000dd +:10431000fd00000003000000c40000004a0000008f +:104320008d0000009100000056000000d800000041 +:104330001f000000e000000027000000a9000000ae +:104340006e00000072000000b50000003b0000009d +:10435000fc00000004000000c30000004d0000004d +:104360008a0000009600000051000000df000000fd +:1043700018000000e700000020000000ae00000070 +:104380006900000075000000b20000003c00000061 +:10439000fb00000005000000c20000004c0000000f +:1043a0008b0000009700000050000000de000000bd +:1043b00019000000e600000021000000af0000002e +:1043c0006800000074000000b30000003d00000021 +:1043d000fa00000006000000c10000004f000000cd +:1043e000880000009400000053000000dd00000081 +:1043f0001a000000e500000022000000ac000000f0 +:104400006b00000077000000b00000003e000000dc +:10441000f900000007000000c00000004e0000008e +:10442000890000009500000052000000dc00000040 +:104430001b000000e400000023000000ad000000ad +:104440006a00000076000000b10000003f0000009c +:10445000f800000008000000cf000000410000004c +:10446000860000009a0000005d000000d3000000fc +:1044700014000000eb0000002c000000a20000006f +:104480006500000079000000be0000003000000060 +:10449000f700000009000000ce000000400000000e +:1044a000870000009b0000005c000000d2000000bc +:1044b00015000000ea0000002d000000a30000002d +:1044c0006400000078000000bf0000003100000020 +:1044d000f60000000a000000cd00000043000000cc +:1044e00084000000980000005f000000d100000080 +:1044f00016000000e90000002e000000a0000000ef +:10450000670000007b000000bc00000032000000db +:10451000f50000000b000000cc000000420000008d +:1045200085000000990000005e000000d00000003f +:1045300017000000e80000002f000000a1000000ac +:10454000660000007a000000bd000000330000009b +:10455000f40000000c000000cb000000450000004b +:10456000820000009e00000059000000d7000000fb +:1045700010000000ef00000028000000a60000006e +:10458000610000007d000000ba000000340000005f +:10459000f30000000d000000ca000000440000000d +:1045a000830000009f00000058000000d6000000bb +:1045b00011000000ee00000029000000a70000002c +:1045c000600000007c000000bb000000350000001f +:1045d000f20000000e000000c900000047000000cb +:1045e000800000009c0000005b000000d50000007f +:1045f00012000000ed0000002a000000a4000000ee +:10460000630000007f000000b800000036000000da +:10461000f10000000f000000c8000000460000008c +:10462000810000009d0000005a000000d40000003e +:1046300013000000ec0000002b000000a5000000ab +:10464000620000007e000000b9000000370000009a +:04465000f000000076 +:020000040000fa +:020000041d02db +:10465400e8ffbd271400bfaf1000beaf21f0a003d8 +:1046640088bf033ce060628c0421027ce06062aca1 +:1046740080bf023cff000324205843ac000000002c +:1046840080bf023c1058428c01004230fcff4010b5 +:104694000000000080bf023cff000324205843ac0c +:1046a4000000000080bf023c1058428c01004230e0 +:1046b400fcff40100000000080bf023cff00032408 +:1046c400205843ac0000000080bf023c1058428ccc +:1046d40001004230fcff40100000000080bf023c9b +:1046e400ff000324205843ac0000000080bf023cbc +:1046f4001058428c01004230fcff401000000000c2 +:1047040080bf023c205840ac0000000080bf023c47 +:104714001058428c01004230fcff401000000000a1 +:1047240080bf023c2058428c2016027cf08182a774 +:10473400f0818287001202002016027cf08182a799 +:1047440080bf023cff000324205843ac000000005b +:1047540080bf023c1058428c01004230fcff4010e4 +:104764000000000080bf023c2058428cffff433011 +:10477400f0818287ffff423021106200ffff423048 +:104784002016027cf08182a788bf033ce060628c23 +:10479400010004240421827ce06062acf081838700 +:1047a400fcff0224241062002016027cf08182a700 +:1047b400f08183870054022404006210000000008a +:1047c400211000002392400b000000006400042428 +:1047d4004e77400f0000000088bf033ce060628c0d +:1047e4000421027ce06062ac80bf023cff00032431 +:1047f400205843ac0000000080bf023c1058428c9b +:1048040001004230fcff40100000000080bf023c69 +:10481400ff000324205843ac0000000080bf023c8a +:104824001058428c01004230fcff40100000000090 +:1048340080bf023c205840ac0000000080bf023c16 +:104844001058428c01004230fcff40100000000070 +:1048540080bf023c205840ac0000000080bf023cf6 +:104864001058428c01004230fcff40100000000050 +:1048740088bf033ce060628c010004240421827c34 +:10488400e06062ac0100022421e8c0031400bf8f81 +:104894001000be8f1800bd270800e00300000000d0 +:1048a400e0ffbd271c00bfaf1800beaf21f0a0037e +:1048b4001000c0a788bf033ce060628c0421027c26 +:1048c400e06062ac80bf023c205840ac00000000b5 +:1048d40080bf023c1058428c01004230fcff401063 +:1048e4000000000080bf023c2058428c1000c2a788 +:1048f4001000c287001202001000c2a780bf023c51 +:10490400ff000324205843ac0000000080bf023c99 +:104914001058428c01004230fcff4010000000009f +:1049240080bf023c2058428cffff43301000c297e6 +:1049340021106200ffff42301000c2a788bf033c71 +:10494400e060628c010004240421827ce06062ac9b +:104954001000c397f8ff0224241062001000c2a7bd +:104964001000c2872120400046a3400f0000000031 +:1049740021184000039d023c21206000a894458c2e +:10498400399b400f000000001400c2af039d023c9d +:104994001400c48fac94458cae99400f0000000005 +:1049a4001400c2af1400c28f21e8c0031c00bf8fe3 +:1049b4001800be8f2000bd270800e003000000009f +:1049c400f8ffbd270400beaf21f0a003f081828769 +:1049d40021e8c0030400be8f0800bd270800e003df +:1049e40000000000f8ffbd270400beaf21f0a003c3 +:1049f400211080000800c2a30800c2930500422cc5 +:104a04000400401400000000ffff0224a992400ba0 +:104a1400000000000800c2930400401400000000dd +:104a240003000224a992400b000000000800c39375 +:104a340001000224040062140000000004000224a7 +:104a4400a992400b000000000800c3930200022456 +:104a540004006214000000000f000224a992400b1d +:104a6400000000000800c393030002240400621441 +:104a74000000000010000224a992400b0000000076 +:104a84000800c39304000224040062140000000020 +:104a940012000224a992400b00000000feff022431 +:104aa40021e8c0030400be8f0800bd270800e0030e +:104ab40000000000e0ffbd271c00bfaf1800beaf20 +:104ac40021f0a0032118a0002110c0002c00c7afc2 +:104ad4002000c4a32400c3a32800c2a3d353400fbf +:104ae400000000001000c2a31000c283360040146e +:104af400000000002400c293212040007a92400f5d +:104b0400000000001100c2a31100c2832800400469 +:104b1400000000002000c2930b00401400000000bd +:104b24001100c293211840002800c2932120600084 +:104b3400212840001d48400f000000001000c2a3bf +:104b4400ee92400b000000002000c39301000224f9 +:104b54000b006214000000001100c29321184000f1 +:104b64002800c29321206000212840005248400fb1 +:104b7400000000001000c2a3ee92400b00000000f1 +:104b84002000c393020002240a0062140000000003 +:104b94001100c293212040002c00c58f8748400f8c +:104ba400000000001000c2a3ee92400b00000000c1 +:104bb400000000003554400f000000001000c2a3a4 +:104bc400f492400b00000000000000001000c283bb +:104bd40021e8c0031c00bf8f1800be8f2000bd2732 +:104be4000800e00300000000f8ffbd270400beaf8a +:104bf40021f0a0030800c4af2110000021e8c00385 +:104c04000400be8f0800bd270800e0030000000078 +:104c1400e8ffbd271400bfaf1000beaf21f0a00312 +:104c2400211880002110a0001800c3a31c00c2a3f7 +:104c34001800c3931c00c2932120000021286000a7 +:104c44002130400021380000ae92400f00000000e7 +:104c540021e8c0031400bf8f1000be8f1800bd27c9 +:104c64000800e00300000000e8ffbd271400bfaf08 +:104c74001000beaf21f0a003211880002110a00075 +:104c84001800c3a31c00c2a31800c3931c00c29342 +:104c94000100042421286000213040002138000054 +:104ca400ae92400f0000000021e8c0031400bf8f43 +:104cb4001000be8f1800bd270800e00300000000ac +:104cc400e8ffbd271400bfaf1000beaf21f0a00362 +:104cd400211080001c00c5af1800c2a31800c293a5 +:104ce4000200042421284000213000001c00c78f4a +:104cf400ae92400f0000000021e8c0031400bf8ff3 +:104d04001000be8f1800bd270800e003000000005b +:104d1400e8ffbd271400bfaf1000beaf21f0a00311 +:104d24001800c4af2110a0001c00c2a31c00c29331 +:104d34001800c48f21284000aa48400f000000003a +:104d440021e8c0031400bf8f1000be8f1800bd27d8 +:104d54000800e00300000000e0ffbd271c00bfaf17 +:104d64001800beaf21f0a003211880002110a0007c +:104d74002800c6af2000c3a32400c2a71000c0a30c +:104d84002000c3936c0002241c0062140000000085 +:104d94001400c2272120400021280000040006241a +:104da40011a1400f000000001400c2272800c48f86 +:104db400212840000400062421380000c257400f77 +:104dc400000000001000c2a31000c2830b004014b6 +:104dd400000000008880828f08004010000000005e +:104de4008880828f1400c393212060001500c39330 +:104df4002128600009f840000000000021e8c003f9 +:104e04001c00bf8f1800be8f2000bd270800e003e0 +:104e140000000000e0ffbd271c00bfaf1800beafbc +:104e240021f0a0032000c4af1000c0a32000c28f53 +:104e340003004010000000002000c28f888082af71 +:104e440004000424029d023c5c4d45242d58400f6f +:104e5400000000001000c28321e8c0031c00bf8fc3 +:104e64001800be8f2000bd270800e00300000000ea +:104e7400d0ffbd272c00bfaf2800beaf21f0a00398 +:104e84003000c4af2000c0a33000c28f21204000f6 +:104e94008e9d400f00000000ffff423001004224bd +:104ea4002200c2a72200c2971000a0af1400a0af36 +:104eb4001800a0af04000424670005243000c68f46 +:104ec400213840003555400f000000002000c2a3e7 +:104ed4002000c28321e8c0032c00bf8f2800be8fae +:104ee4003000bd270800e00300000000b8ffbd2724 +:104ef4004400bfaf4000beaf21f0a0032000c0a318 +:104f04002400c227212040003024400f000000006c +:104f14002000c2a32000c283170040140000000038 +:104f24002400c29782130200ffff4230ff00423088 +:104f340003004330020002240d006214000000004c +:104f44001000a0af1400a0af1800a0af0400042408 +:104f54006900052421300000213800003555400f38 +:104f6400000000002000c2a3df93400b00000000fb +:104f7400f4ff02242000c2a32000c28321e8c0035e +:104f84004400bf8f4000be8f4800bd270800e003e7 +:104f940000000000d0ffbd272c00bfaf2800beaf2b +:104fa40021f0a0032000c0a31000a0af1400a0af04 +:104fb4001800a0af040004246a0005242130000076 +:104fc400213800003555400f000000002000c2a326 +:104fd4002000c28321e8c0032c00bf8f2800be8fad +:104fe4003000bd270800e00300000000b8ffbd2723 +:104ff4004400bfaf4000beaf21f0a0032000c0a317 +:105004002400c227212040003024400f000000006b +:105014002000c2a32000c283170040140000000037 +:105024002400c29782130200ffff4230ff00423087 +:1050340003004330020002240d006214000000004b +:105044001000a0af1400a0af1800a0af0400042407 +:105054006800052421300000213800003555400f38 +:10506400000000002000c2a31f94400b00000000b9 +:10507400f4ff02242000c2a32000c28321e8c0035d +:105084004400bf8f4000be8f4800bd270800e003e6 +:105094000000000000e85d4100701a4000601b4001 +:1050a400e8ffbd271400baaf1000bbaf44781b7ce7 +:1050b400000c7b3700609b400c00beaf0800a3af20 +:1050c4000400a2af21f0a00388bf033c3010628c1f +:1050d400c418027c301062ac21e8c0030c00be8fff +:1050e4000800a38f0400a28f00606041c00000008c +:1050f4001400ba8f1000bb8f00709a401800bd27af +:1051040000e8dd4100609b4018000042e8ffbd2735 +:105114001400bfaf1000beaf21f0a0031800c4af4d +:105124001800c48f4e77400f0000000021e8c00330 +:105134001400bf8f1000be8f1800bd270800e003c5 +:1051440000000000e8ffbd271400bfaf1000beaf91 +:1051540021f0a00388bf033c2061628c8410027c90 +:10516400206162ac88bf033c2061628c0421027c14 +:10517400206162ac640004244e77400f00000000fc +:1051840088bf033c2061628c010004248410827c6b +:10519400206162ac960004244e77400f00000000aa +:1051a40088bf033c2061628c010004240421827cba +:1051b400206162ac21e8c0031400bf8f1000be8fd1 +:1051c4001800bd270800e00300000000f8ffbd2719 +:1051d4000400beaf21f0a003211080000800c2a388 +:1051e4000800c293d0ff42240800c2a30800c2935f +:1051f4000a00422c04004010000000000800c29382 +:105204009394400b000000000800c2932000423435 +:105214000800c2a30800c293cfff42240800c2a31f +:105224000800c2930600422c060040100000000053 +:105234000800c2930a004224ff0042309394400bba +:1052440000000000ff00022421e8c0030400be8f18 +:105254000800bd270800e00300000000e0ffbd27b0 +:105264001c00bfaf1800beaf21f0a0032000c4afe4 +:105274002400c5af2110c0002800c2a3d194400b64 +:10528400000000002400c28f000042902400c38f5d +:10529400010063242400c3af212040007494400f14 +:1052a400000000001000c2a31000c2931000422ca2 +:1052b4000400401400000000f1ff0224da94400bc3 +:1052c400000000001000c29300110200ff004330f0 +:1052d4002000c28f000043a02400c28f000042902f +:1052e4002400c38f010063242400c3af21204000a5 +:1052f4007494400f000000001000c2a31000c29379 +:105304001000422c0400401400000000f1ff0224ad +:10531400da94400b000000002000c28f000043908c +:105324001000c29321106200ff0043302000c28f9e +:10533400000043a02000c28f010042242000c2af1d +:105344002800c2932b100200ff0042302800c393b0 +:10535400ffff63242800c3a3caff40140000000019 +:105364002110000021e8c0031c00bf8f1800be8f6d +:0c5374002000bd270800e003000000003e +:020000040000fa +:020000041d02db +:10538000d8ffbd271400b0af2400bfaf2000b3afdb +:105390001c00b2af1800b1af44008004218080002f +:1053a0006e0082280e0040100b0082287900401009 +:1053b000039d023cb08c42248080040021800202c4 +:1053c0000000028e2400bf8f2000b38f1c00b28f1c +:1053d0001800b18f1400b08f0800e0032800bd272b +:1053e000eb51023c1f85423418008200c397040031 +:1053f000102800006666133c43190500231872004c +:1054000080100300001903002110430080180200df +:1054100021104300231082002014027c676673264b +:1054200018005300c317020010180000039d113c20 +:1054300083180300231062002014027c0900422418 +:10544000b08c312680100200211051004c00248eb7 +:10545000399b400f0000458c1800130221204000aa +:1054600010980000839813002390720240101200dd +:10547000c090120021905200238012022084107ce0 +:105480008080100021881102399b400f0000258e7a +:105490002400bf8f2000b38f1c00b28f1800b18f83 +:1054a0001400b08f0800e0032800bd27238004000b +:1054b0002084107c6e00022a1d004010eb51023c3b +:1054c0000b00022a51004054039d023c6666023cd8 +:1054d0006766422418000202c31f1000101000006b +:1054e000831002002310430040200200c018020075 +:1054f00021188300238003022024027c09008424d5 +:105500002014107c039d033ce48c63248020040061 +:105510008010020021208300211043000000848cb1 +:10552000399b400f0000458cf294400b2400bf8f44 +:105530001f85423418000202c39710001028000093 +:105540006666133c4319050023187200801003009f +:1055500000190300211043008018020021104300ad +:10556000231002022014027c676673261800530081 +:10557000c317020010180000039d113c831803009c +:10558000231062002014027c090042241195400b74 +:10559000e48c31266666023c67664224180082006d +:1055a000c31f0400101000008310020023104300ea +:1055b00040200200c018020021188300238003024b +:1055c0002014027c090042242084107c039d033cab +:1055d000b08c6324801002008080100021800302c0 +:1055e000211043000000058e399b400f0000448cc1 +:1055f0002400bf8f2000b38f1c00b28f1800b18f22 +:105600001400b08f0800e0032800bd27e48c42247a +:105610008080100021800202f194400b0000028e75 +:020000040000fa +:020000041d02db +:105620000080013c2628a100c24d0400ff00293162 +:10563000c25d0500ff006b310080073c00420400a2 +:10564000254007010052050025504701ffff2d2589 +:10565000fe00a12d6100201000000000ffff6d255d +:10566000fe00a12d770020100000000023602b0118 +:105670000d00800500000000200081290300201497 +:10568000000000001500001002000a2425300a0066 +:1056900006508a0104688a011000a611000000006b +:1056a0000e00001002004a3525480b0023600c0054 +:1056b00020008129030020140000000007000010d2 +:1056c000020008242530080006408801046888018b +:1056d0000200a611000000000200083524608700c7 +:1056e000266885011000a0050000000021400a0185 +:1056f0002b680a011700a0110000000001000d3105 +:105700000200a0110000000002000835424008001d +:1057100001002925ff0001240e00211500000000d2 +:105720000c000010000008242b680a010400a011de +:1057300023400a012340080003000010266087016f +:10574000500000110000000020300671234826019f +:105750000440c8000e002019000000008000082549 +:1057600080000d2d21482d01026a08000100ad3195 +:1057700023400d014040080042420800c06d09006e +:1057800025400d0125100c010800e0030000000079 +:10579000010006242330c9002000c12c390020104c +:1057a000000000000080013c2540010120000d2484 +:1057b0002368a6010448a801020020110640c80081 +:1057c000010008350000092480000d25e3ffa10534 +:1057d00000000000e1ff0010010009240e00201568 +:1057e0000000000021400801050000110000000039 +:1057f00020600c7123482c0198ff001004408801a0 +:10580000ff0001240f006111000000000080013c36 +:105810001800a11400000000216808011b00a01559 +:1058200000000000ff0001241400611500000000ca +:10583000266885001500a005000000000d0000107e +:1058400000000000080060150000000021504a011f +:105850000a0040110000000020604c7123586c01c8 +:1058600082ff001004508a0121684a010700a01538 +:1058700000000000c4ff001025100500c2ff00104a +:1058800025100400c0ff001000000224beff00101d +:08589000c0ff023c0000000013 +:020000040000fa +:020000041d02db +:10589800d0ffbd272c00bfaf2800beaf21f0a0036a +:1058a8003000c4af3400c5af38818293010042385c +:1058b800ff00423003004010000000008a96400fad +:1058c80000000000ffff02241000c2af3000c28faa +:1058d8001400c2af1400c28f210040100000000065 +:1058e8001800c0af5596400b000000001400c28f8e +:1058f800000042901c00c2af1000c38f1c00c28f72 +:10590800261062002000c2af1000c28f021a0200e7 +:105918002000c28fff00443000a0023c8020040019 +:1059280068394224211082000000428c261062004f +:105938001000c2af1400c28f010042241400c2af8d +:105948001800c28f010042241800c2af1800c38f8c +:105958003400c28f2b106200e4ff401400000000e6 +:105968001000c28f271002001000c2af1000c28fb3 +:1059780021e8c0032c00bf8f2800be8f3000bd2750 +:105988000800e00300000000e0ffbd271c00bfafd7 +:105998001800beaf21f0a0032000c4af2110a00062 +:1059a8002400c2a32400c2931000c2af388182939e +:1059b80001004238ff0042300300401000000000a0 +:1059c8008a96400f000000002000c38f1000c28f8d +:1059d800261062001400c2af2000c28f021a020013 +:1059e8001400c28fff00443000a0023c8020040055 +:1059f80068394224211082000000428c261062007f +:105a08002000c2af2000c28f21e8c0031c00bf8f56 +:105a18001800be8f2000bd270800e003000000002a +:105a2800e8ffbd271400beaf21f0a0030000c0afff +:105a3800b696400b000000000000c28f0800c2affd +:105a48000400c0afa896400b000000000800c28ff9 +:105a580001004230ff004230090040100000000001 +:105a68000800c28f42180200b8ed023c208342347d +:105a7800261062000800c2afa596400b0000000087 +:105a88000800c28f421002000800c2af0400c28f93 +:105a9800010042240400c2af0400c28f0800422c57 +:105aa800eaff40140000000000a0023c0000c38f81 +:105ab8008018030068394224211062000800c38f4f +:105ac800000043ac0000c28f010042240000c2afb6 +:105ad8000000c28f0001422cd7ff401400000000d4 +:105ae80001000224388182a321e8c0031400be8f7c +:105af8001800bd270800e00300000000e8ffbd27ec +:105b08001400bfaf1000beaf21f0a003f88180af32 +:105b18000a0004243600023c80ee45349876400f93 +:105b28000000000021e8c0031400bf8f1000be8fe2 +:105b38001800bd270800e00300000000e8ffbd27ab +:105b48001400bfaf1000beaf21f0a0032120000059 +:105b5800de96400f0000000021e8c0031400bf8f4c +:105b68001000be8f1800bd270800e00300000000e9 +:105b7800e8ffbd271400bfaf1000beaf21f0a0039f +:105b88001800c4aff881828f010003242800431055 +:105b980000000000020003243d0043100000000044 +:105ba8005c004014000000001800c28f060040107e +:105bb800000000000100032415004310000000004d +:105bc8004797400b000000000a000424ab75400f03 +:105bd800000000000c0040100000000088bf033cdb +:105be800e060628c01000424c45a827ce06062acec +:105bf8000a000424a00f05249876400f0000000036 +:105c080001000224f88182af0c97400b00000000cd +:105c18000a0004243600023c80ee45349876400f92 +:105c280000000000000000004797400b0000000043 +:105c38001800c28f000042240200422c3400401099 +:105c4800000000000a000424ab75400f00000000ab +:105c58000c0040100000000088bf033ce060628c2c +:105c6800c45a027ce06062ac0a0004241200023cc0 +:105c7800804f45349876400f00000000020002244f +:105c8800f88182af000000004797400b0000000039 +:105c98001800c28f06004010000000000100032415 +:105ca8000f004310000000004797400b0000000061 +:105cb8000a000424ab75400f0000000010004010db +:105cc800000000003c3b400f00000000640004247a +:105cd8004e77400f0000000065a2400f0000000052 +:105ce8000a0004243600023c80ee45349876400fc2 +:105cf80000000000f88180af4397400b00000000cf +:105d080000000000000000004797400b0000000062 +:105d18000000000021e8c0031400bf8f1000be8ff0 +:105d28001800bd270800e00300000000e8ffbd27b9 +:105d38001400bfaf1000beaf21f0a003010004247f +:105d4800de96400f0000000021e8c0031400bf8f5a +:105d58001000be8f1800bd270800e00300000000f7 +:105d6800e8ffbd271400bfaf1000beaf21f0a003ad +:105d780088bf033c2061628cc439027c206162ac1c +:105d880088bf033ca061628c444a027ca06162ac7b +:105d980002000224808182af010004243d77400f75 +:105da8000000000021e8c0031400bf8f1000be8f60 +:105db8001800bd270800e00300000000e8ffbd2729 +:105dc8001400bfaf1000beaf21f0a00388bf023c93 +:105dd8005060428c008042300c00401400000000eb +:105de8008081828f0500401400000000039d023c62 +:105df8001892442427a4400f000000000100022448 +:105e0800808182af8e97400b000000008081838fd5 +:105e1800010002240500621400000000039d023cfa +:105e28002c92442427a4400f00000000808180affa +:105e3800010004242c77400f0000000021184000c6 +:105e48000100022411006214000000000100042473 +:105e5800ab75400f000000000c004010000000006f +:105e680088bf033c2061628cc439027c206162ac2b +:105e780088bf033ca061628c444a027ca06162ac8a +:105e8800010004243d77400f0000000004000424b2 +:105e9800ab75400f00000000030040100000000038 +:105ea800d497400f0000000021e8c0031400bf8f02 +:105eb8001000be8f1800bd270800e0030000000096 +:105ec800e8ffbd271400bfaf1000beaf21f0a0034c +:105ed80004000424c0a80534e276400f0000000046 +:105ee80021e8c0031400bf8f1000be8f1800bd2723 +:105ef8000800e00300000000e8ffbd271400bfaf62 +:105f08001000beaf21f0a00388bf033c2061628c63 +:105f180001000424c439827c206162ac010004249d +:105f2800c80005249876400f0000000001000224f4 +:105f380021e8c0031400bf8f1000be8f1800bd27d2 +:105f48000800e00300000000e8ffbd271400bfaf11 +:105f58001000beaf21f0a00388bf033ca061628c93 +:105f680001000424444a827ca06162ac010004243c +:105f7800c80005249876400f0000000001000224a4 +:105f880021e8c0031400bf8f1000be8f1800bd2782 +:105f98000800e00300000000f8ffbd270400beafc2 +:105fa80021f0a0038081828f2014027c21e8c003a5 +:105fb8000400be8f0800bd270800e00300000000b1 +:105fc800e8ffbd271400bfaf1000beaf21f0a0034b +:105fd800b48180af00a0023c8c2d4424212800000d +:105fe800f401062411a1400f00000000070004245a +:105ff800c80005249876400f0000000021e8c0037f +:106008001400bf8f1000be8f1800bd270800e003e2 +:1060180000000000e8ffbd271400bfaf1000beafae +:1060280021f0a003293d400f0000000004004014a7 +:1060380000000000b48180af2898400b00000000e9 +:10604800b481828f1400401000000000070004246f +:10605800ab75400f00000000211840000100022429 +:106068000d0062140000000000a0023c8c2d4324a7 +:10607800b481828f2120600021284000ec3c400f31 +:1060880000000000b48180af07000424c800052484 +:106098009876400f0000000021e8c0031400bf8f6d +:1060a8001000be8f1800bd270800e00300000000a4 +:1060b800e8ffbd271400bfaf1000beaf21f0a0035a +:1060c800211080001800c2a3293d400f00000000e5 +:1060d8000500401400000000b48180af21100000ca +:1060e8005598400b00000000b481838f00a0023c4b +:1060f8008c2d4224211062001800c393000043a095 +:10610800b481828f01004224b48182afb481838f2d +:10611800f4010224080062140000000000a0023c00 +:106128008c2d422421204000f4010524ec3c400f32 +:1061380000000000b48180af07000424c8000524d3 +:106148009876400f000000000100022421e8c003f7 +:106158001400bf8f1000be8f1800bd270800e00391 +:1061680000000000e0ffbd271c00bfaf1800beaf55 +:106178001400b0af21f0a0032000c4af293d400fa8 +:10618800000000000500401400000000b48180af4a +:10619800211000007298400b000000002000d08ff2 +:1061a8002000c48f8e9d400f0000000021200002b7 +:1061b80021284000ec3c400f0000000001000224b0 +:1061c80021e8c0031c00bf8f1800be8f1400b08fd9 +:1061d8002000bd270800e00300000000f8ffbd27ed +:1061e8000400beaf21f0a003b481828f04004014e4 +:1061f80000000000010002248398400b000000000a +:106208002110000021e8c0030400be8f0800bd274c +:086218000800e0030000000093 +:020000040000fa +:020000041d02db +:106220004a462e636f6d0000486f737420495020fa +:1062300069732025642e25642e25642e25640d0a9d +:1062400000000000486f7374204e616d6520697313 +:106250002025730d0a000000426f6f746c6f61643b +:1062600065722073657276657220737461727465ed +:106270006400000042696e64204661696c656400d8 +:10628000736f636b6574202564206c697374656e2d +:10629000204661696c65642e204572726f723a20e7 +:1062a00025640a004269656e76656e7565206175c4 +:1062b000206368616c6574210a4c65206368616cb9 +:1062c0006574207061726c6520656e20616e676c0c +:1062d00061697320636f6d6d65204d722e2050656e +:1062e00070696e0a496620796f75206e6565642055 +:1062f00068656c702e2e2e20747970652068656c30 +:10630000700a0a005465726d696e616c20636c6975 +:10631000656e7420636f6e6e656374656400000063 +:106320005379736c6f672057656c636f6d650a00f6 +:106330004e6574776f726b20636c69656e74206351 +:106340006f6e6e656374656400000000426f6f7469 +:106350006c6f6164657220636c69656e7420636f35 +:106360006e6e656374656400536f636b657420259e +:1063700064203a20416363657074204661696c65ee +:10638000640a00005465726d696e616c20636c690b +:10639000656e7420646973636f6e6e6563746564a3 +:1063a000000000004e6574776f726b20636c696546 +:1063b0006e7420646973636f6e6e656374656400e8 +:1063c000426f6f746c6f6164657220636c69656e97 +:1063d0007420646973636f6e6e6563746564000036 +:1063e00057692d466920636f6e6e65637465640d31 +:1063f0000000000057692d466920646973636f6e61 +:106400006e65637465640d00776966695f63623aff +:10641000204d324d5f574946495f524553505f50ba +:10642000524f564953494f4e5f494e464f2e0d002d +:10643000776966695f63623a2050726f7669736943 +:106440006f6e206661696c65642e0d004368616c37 +:10645000657456696c6c65456d617264000000007e +:106460004576696e72756465333000006572726fcf +:0464700072000000b6 +:020000040000fa +:020000041d02db +:10647400e8ffbd271400beaf21f0a0031800c4af8d +:106484000400c0af0000c0a3a499400b00000000aa +:106494000200c0a70400c28f021202000400c2afaf +:1064a4000100c0a33b99400b000000000100c2930f +:1064b4001800c38f21106200000042900800c2a39c +:1064c4000800c3832e0002240b00621000000000a9 +:1064d4000800c28308004010000000000100c293bd +:1064e400010042240100c2a30100c2930400422c13 +:1064f400eeff4014000000000100c29305004010ac +:10650400000000000100c39304000224040062148c +:106514000000000021100000a999400b00000000b9 +:106524001800c28f000042900800c2a31800c28f56 +:10653400010042241800c2af0100c2930200422ca1 +:1065440026004014000000000800c3833000022429 +:10655400250062140000000021100000a999400bde +:10656400000000000800c2833000422805004014e7 +:10657400000000000800c2833a00422804004014ce +:106584000000000021100000a999400b0000000049 +:106594000200c2974010020080180200211043003c +:1065a400ffff43300800c283ffff42302110620026 +:1065b400ffff4230d0ff42240200c2a71800c28f5e +:1065c400000042900800c2a31800c28f01004224b8 +:1065d4001800c2af7c99400b0000000000000000ce +:1065e4007c99400b00000000000000000100c293f1 +:1065f4002b100200ff0042300100c393ffff63240d +:106604000100c3a3d7ff4014000000000200c2979a +:106614000001422c0400401400000000211000007e +:10662400a999400b000000000200c2970016020066 +:106634000400c38f251062000400c2af0800c283a7 +:1066440005004014000000000000c393030002246e +:1066540008006214000000000800c2830800401013 +:10666400000000000000c39303000224040062142d +:106674000000000021100000a999400b0000000058 +:106684000000c293010042240000c2a30000c29390 +:106694000400422c7eff4014000000000400c28f5e +:1066a40021e8c0031400be8f1800bd270800e003d2 +:0466b40000000000e2 +:020000040000fa +:020000041d02db +:1066b80000800b3cc2450400ff000831c2550500ac +:1066c800ff004a31003a04002538eb00004a050073 +:1066d80025482b012670850024586e01ffff0e25e2 +:1066e800fe00c12d3f00201000000000ffff4e25d6 +:1066f800fe00c12d53002010000000002b08e90007 +:10670800030020140000000042380700010008259b +:1067180082630900f40180011b00ec0012200000d4 +:1067280010300000ff3f2d311900a401122800008d +:10673800803306002b70c5000400c0112330c5004b +:10674800ffff84242130c9002b70c900f4018001a7 +:106758001b00cc0012380000103000001900a701ff +:1067680012280000803306002b70c5000400c011f9 +:106778002330c500ffffe7242130c9002b70c90072 +:10678800807304002138ee000200c01000390700b1 +:106798000100e7347e000e242370ca0121400e0157 +:1067a800ffff0e25fe00c12d340020100000000060 +:1067b8008000e7248000ee2c21400e0102720700c1 +:1067c8000100ce312338ee0040380700423a070076 +:1067d800c07508002538ee002510eb000800e0031e +:1067e8000000000008000015000000002138e70044 +:1067f8000500e010000000002060ec7023400c0150 +:10680800baff001004388701040048150000000092 +:10681800217029012f00c01100000000ff00012491 +:1068280008004111000000001200001100000000e3 +:106838002170e7002700c0150000000022000010aa +:106848000000000008004015000000002148290150 +:106858001d0020110000000020602c7123504c0105 +:10686800a6ff001004488901217029011900c015ec +:1068780000000000d9ff001025100b001200001db9 +:106888000000000001000c24236088012000812df5 +:10689800f8ff20100000000020000e242370cc0117 +:1068a8000440c70102000011063887010200e734de +:1068b800000008248000ee24bdffc1050000000090 +:1068c800bbff001001000824807f013cc3ff0010bb +:1068d80025106101c1ff0010c0ff023c000000004c +:020000040000fa +:020000041d02db +:1068e80025108500840040102110000001000224ba +:1068f80046008210c2470500ffff0224650082108f +:106908000a00022467008210f6ff02245a0082104f +:10691800ffff022409000011401905004100801002 +:106928000080023c23200400232805002b100400cb +:106938002310a2002128400040190500c2160400b7 +:1069480025106200c21e05002510430039004014be +:10695800801905008216040025106200821e0500b9 +:106968002510430012004054990002241a00022402 +:10697800c23f040040180500403004002518e30019 +:106988002120c0002128600080310300821e0400fd +:106998002518c3008236050025186600f4ff60102c +:1069a800ffff42247f0042244600401801000324d0 +:1069b800070083300a006010ff004328c000837c72 +:1069c8000300842421208300c21e040004006010f8 +:1069d800ff0043284220040001004224ff0043280e +:1069e80034006010c2200400c005837c020060509f +:1069f8002110000000b0847c0042080025104800e7 +:106a0800c01502000800e00325104400bbffa05495 +:106a1800ffff0224001208007f0042340800e00350 +:106a2800c0150200c0ffa21423200400212000008a +:106a38000080053c1a000224c037050042180400f3 +:106a48002518c30001008730423005002520e300e7 +:106a58002128c000c21e0400403106002518c300ca +:106a6800c236050025186600f3ff601401004224b1 +:106a78006c9a400b7f004224a6ffa2140012080063 +:106a880082004234c01502002000033c0800e003e5 +:106a9800251043009bffa4540a000224889a400b47 +:106aa8000012080099ffa054f6ff0224a29a400b96 +:106ab8000012080000120800ff0042340800e0033a +:106ac800c0150200231062001b0043280800605014 +:106ad8002120000023180200041864000610440056 +:106ae8002b200300252082006e9a400b010002240f +:106af800809a400b211000000800e003000000000d +:020000040000fa +:020000041d02db +:106b0800e8ffbd271400beaf21f0a0031800c4aff2 +:106b18001c00c5af2000c6af2400c7af2000c28f3d +:106b28000c00c2af1c00c28f0000428c0800c2af2c +:106b38001c00c28f08004010000000002000c28f17 +:106b480005004010000000002400c28f1000422cf5 +:106b5800040040100000000021100000349b400b8e +:106b6800000000000000c0a32f9b400b00000000a5 +:106b78000800c28f0200c2a3640002240100c2a35d +:106b88000200c2932e004010000000000400c0a3c1 +:106b9800300002240300c2a3f19a400b0000000059 +:106ba8000300c293010042240300c2a30200c3935e +:106bb8000100c293231062000200c2a30200c39323 +:106bc8000100c2932b106200f5ff40100000000086 +:106bd8000100c3930a0002241b006200f401400074 +:106be80010180000121000000100c2a30300c39394 +:106bf8003000022404006214000000000400c29364 +:106c08000a004010000000000300c3832000c28f68 +:106c1800000043a02000c28f010042242000c2af20 +:106c28000400c293010042240400c2a30100c293dd +:106c3800d7ff401400000000189b400b0000000024 +:106c48002000c28f30000324000043a02000c28f20 +:106c5800010042242000c2af0000c39303000224b5 +:106c680008006214000000002000c28f000040a04d +:106c78002000c28f010042242000c2af299b400b94 +:106c8800000000002000c28f2e000324000043a053 +:106c98002000c28f010042242000c2af0800c28f2a +:106ca800021202000800c2af0000c2930100422491 +:106cb8000000c2a30000c2930400422cacff4014a1 +:106cc800000000000c00c28f21e8c0031400be8f32 +:0c6cd8001800bd270800e00300000000c9 +:020000040000fa +:020000041d02db +:106ce400c23d0400ff00e730c24d0500ff0029311a +:106cf40000800a3c003204002530ca00004205002e +:106d040025400a012660850024504c01ffffec2435 +:106d1400fe00812d2100201000000000ffff2c2523 +:106d2400fe00812d36002010000000001900c8006c +:106d34001258000002006011103000000100c63437 +:106d44000300c0040000000040300600ffffe724f9 +:106d540082ff2c252138ec00ffffec24fe00812d5e +:106d64003a002010000000008000c6248000cc2cd3 +:106d74002138ec000262060001008c312330cc0083 +:106d84004030060042320600c06507002530cc00c2 +:106d94002510ca000800e003000000000d00e01404 +:106da400000000002130c6000500c01000000000f3 +:106db4002058cb702338eb00d8ff00100430660154 +:106dc400ff0001241f002111000000001500001025 +:106dd400000000002160c6001a00801500000000b9 +:106de4000400201500000000216008011500801136 +:106df40000000000ff0001240f0021150000000026 +:106e04000a002015000000002140080105000011bf +:106e14000000000020580b7123482b01c3ff001011 +:106e240004406801dbff001025100a0021600801fe +:106e34000400801500000000807f013cd5ff001095 +:106e440025104101d3ff0010c0ff023cfaffe01cf3 +:106e54000000000001000b24235867012000612d6d +:106e6400f0ff20100000000020000c2423608b01a0 +:106e7400043886010200e010063066010200c634c0 +:106e8400000007248000cc24b7ff81050000000027 +:0c6e9400b5ff0010010007240000000002 +:020000040000fa +:020000041d02db +:106ea00025408500030008310300001121108000f7 +:106eb000380000100000aa900000aa8c0101093cd3 +:106ec00001012935c07909002340490124400f01ff +:106ed0000700001124600a0105008811000000006d +:106ee0000000a5240000aa902a00001000008424bd +:106ef0000400ab8c00008aac2340690124400f01e0 +:106f00000700001124600b0105008811000000003b +:106f10000400a5240000aa901e0000100400842490 +:106f20000800aa8c04008bac2340490124400f01c7 +:106f30000700001124600a0105008811000000000c +:106f40000800a5240000aa90120000100800842464 +:106f50000c00ab8c08008aac2340690124400f016f +:106f60000700001124600b010500881100000000db +:106f70000c00a5240000aa90060000100c00842438 +:106f80001000aa8c0c008bac10008424ceff0010e3 +:106f90001000a5240300401500008aa00800e003ab +:106fa000000000000100ab900300601501008ba001 +:106fb0000800e003000000000200aa900300401552 +:106fc00002008aa00800e003000000000300ab906c +:106fd0000300601503008ba00800e0030000000020 +:106fe0000400aa900300401504008aa00800e003f2 +:106ff000000000000500ab900300601505008ba0a9 +:107000000800e003000000000600aa9003004015fd +:1070100006008aa00800e003000000000700ab9013 +:107020000300601507008ba00800e00300000000cb +:107030000800aa9008008424d6ff00100800a524a8 +:020000040000fa +:020000041d02db +:10704000d8ffbd271000b0af00a0103c8840028ed2 +:107050002400bfaf2000b4af1c00b3af1800b2af24 +:10706000090040101400b1af2400bf8f2000b48f7e +:107070001c00b38f1800b28f1400b18f1000b08fb6 +:107080000800e0032800bd2700a0133c6001638ec8 +:107090004200605000a0033c00a0143c6401828eba +:1070a000390040100000043c828f030082970200e8 +:1070b00000e0447c00e0657c0200313a0200523a74 +:1070c0000a18b1000a109200218860007ba4400fca +:1070d000219040000000438c0400428c2b202302ae +:1070e000240080102110620000a0043cac308424f5 +:1070f00000e0847c2b206400dbff8014218860008a +:107100002b185102050060142b1822022b18420282 +:107110000500605400a0023c2b182202d2ff601030 +:107120002190400000a0023cac30422442170200f3 +:10713000050003241b0043140400032400a0023ca8 +:107140002588220225904202600171ae640192ae50 +:10715000884011ae2400bf8f2000b48f1c00b38f75 +:107160001800b28f1400b18f1000b08f0800e00338 +:107170002800bd272b202202e2ff80542b18510249 +:107180003b9c400b00a0043c00a0023c0002842475 +:10719000c84042242a9c400b21104400269c400bee +:1071a000c8406324070043140080023c2588220263 +:1071b00025104202600171ae640182ae559c400b05 +:1071c000884011ae21884002600172ae559c400b90 +:0471d000884011ae34 +:020000040000fa +:020000041d02db +:1071d4000c008294d0ffbd27010042301800b0afec +:1071e4002c00bfaf2800b4af2400b3af2000b2af6f +:1071f4001c00b1af218080003e004010040080ac30 +:1072040000a0143c59018282130040501000068ee5 +:1072140000a0113c683d3126a00033268c9c400b15 +:10722400020112240b003352590180a20c00229651 +:1072340002014230fbff5254140031262120200267 +:10724400daa1400f14003126f9ff33560c002296c0 +:10725400590180a21000068e1700c0100e0004967b +:10726400d79c400f0800058e30004010040002ae89 +:10727400ffff0324350043500c0002960800038ee0 +:10728400ffff4224000003ae040002ae01006424a8 +:1072940000006290000004ae2c00bf8f2800b48f61 +:1072a4002400b38f2000b28f1c00b18f1800b08f60 +:1072b4000800e0033000bd27040000ae1000a5273d +:1072c400d79c400f0100062401000324120043143c +:1072d4002c00bf8f1000a2932800b48f2400b38f1a +:1072e4002000b28f1c00b18f1800b08f0800e0039b +:1072f4003000bd272c00bf8fffff02242800b48f6d +:107304002400b38f2000b28f1c00b18f1800b08fff +:107314000800e0033000bd270c000396ffff0224a1 +:1073240010006334a79c400b0c0003a60c000296cb +:10733400100042340c0002a60800028e040000aec5 +:10734400000002aea79c400bffff02243000423431 +:08735400cf9c400b0c0002a6c7 +:020000040000fa +:020000041d02db +:10735c00e0ffbd271000b0af1c00bfaf1800b2afec +:10736c001400b1af1c00a0102180a0001b00c05065 +:10737c001c00bf8f110080142190c0000000023c43 +:10738c00000042241c0040102188a6000000000cc4 +:10739c0001000424000002a201001026fbff1116bc +:1073ac001c00bf8f211040021400b18f1800b28f47 +:1073bc001000b08f0800e0032000bd271c00bf8f19 +:1073cc00211040021400b18f1800b28f1000b08f42 +:1073dc000800e0032000bd271c00bf8f2190000097 +:1073ec00211040021400b18f1800b28f1000b08f22 +:1073fc000800e0032000bd2700a0023ca000438c45 +:10740c00020002242400621080bf023c80bf023cb8 +:10741c0080bf053c80bf043c0060428c3060a524da +:10742c001060842400804230050040142190c0007c +:10743c000080033480bf023c086043ac2190c00044 +:10744c000000828c0100423009004014a00002248c +:10745c001b9d400b000000000500401000000000c8 +:10746c000000838c01006330fbff6010ffff42249f +:10747c000000828c01004230d0ff40542390d20097 +:10748c000000a28cffff52260c004012000002a24a +:10749c00139d400b0100102640684224dbff401076 +:1074ac0080bf023c80bf053c80bf043c0068428c1e +:1074bc003068a5240c9d400b10688424f29c400b72 +:0474cc002390d20037 +:020000040000fa +:020000041d02db +:1074d000211080005600c0100c00ca2c4d00401531 +:1074e0002618a4000300633023380400290060102c +:1074f0000300e7300600e0102330c7000000a39827 +:107500000300a3882128a700000083b8212087005a +:107510000f00c3302338c3001100e0102130600099 +:107520002138e5000000a3980300a3880400a89870 +:107530000700a8880800a9980b00a9880c00aa9841 +:107540000f00aa88000083ac040088ac080089ac56 +:107550001000a52410008424f2ffa714fcff8aacbd +:107560000300c3302338c3002a00e010213060003c +:107570002138e5000000a3980300a3880400a52497 +:1075800004008424fbffa714fcff83ac210000103f +:10759000000000000500e0102330c7000000a398a1 +:1075a0002128a700000083b8212087000f00c330e6 +:1075b0002338c3000d00e010213060002138e500c1 +:1075c0000000a38c0400a88c0800a98c0c00aa8cd5 +:1075d000000083ac040088ac080089ac1000a5242e +:1075e00010008424f6ffa714fcff8aac0300c3300c +:1075f0002338c3000700e010213060002138e50087 +:107600000000a38c0400a52404008424fcffa7141c +:10761000fcff83ac0600c0102138c5000000a39019 +:107620000100a52401008424fcffa714ffff83a010 +:107630000800e0030000000000008a902110800094 +:1076400003004015000000000800e00300000224d1 +:1076500001008a9003004015000000000800e003cc +:107660000100022402008a9003004015000000007f +:107670000800e0030200022403008a900300401582 +:10768000822004000800e003030002240100842497 +:107690008020040000008a8c0101093c0101293589 +:1076a000c07909002340490124400f010600001160 +:1076b00024600a01040088110000000000008a9084 +:1076c000220000100000842404008b8c23406901f8 +:1076d00024400f010600001124600b0104008811f2 +:1076e0000000000004008a901800001004008424a8 +:1076f00008008a8c2340490124400f010600001134 +:1077000024600a01040088110000000008008a902b +:107710000e000010080084240c008b8c23406901ab +:1077200024400f010600001124600b0104008811a1 +:10773000000000000c008a90040000100c0084245b +:1077400010008a8cd7ff001010008424040040151c +:1077500000000000000084240800e00323108200e1 +:1077600001008a90040040150000000001008424fc +:107770000800e0032310820002008a9004004015f4 +:1077800000000000020084240800e00323108200af +:1077900003008a90030084240800e0032310820081 +:020000040000fa +:020000041d02db +:1077a0000c00a294e0ffbd27020043301400b0afec +:1077b0001c00bfaf1800b1af2b0060102180a000eb +:1077c000000243301c0060100400a38c000242340d +:1077d0000c00a2a41d006010ff0091300a000424d8 +:1077e00028002412800042301000028e3e006210f9 +:1077f000010063240000028e01004424040003ae53 +:10780000000051a00100032400a0023c000004aecf +:10781000590143a00a000224210022520c000296c2 +:107820001c00bf8f211020021400b08f1800b18ff0 +:107830000800e0032000bd270b0060140002423462 +:107840000c00a2a4ff009130211800000800048e53 +:10785000000004ae0a000424e4ff24561000028e47 +:10786000219e400b800042301c00bf8fffff11247f +:10787000211020021400b08f1800b18f0800e0031f +:107880002000bd27d9ff40541000028e0d000424b3 +:10789000e89d400f21280002fa9d400b0400038e52 +:1078a00000014230dfff40101c00bf8f0e00049625 +:1078b0000800058effa1400f0400068e0400038e11 +:1078c000060043500800028e0c000296ffff1124b0 +:1078d000300042340c0002a60800028e040000ae04 +:1078e000089e400b000002ae2024117c3f9e400ffa +:0c78f00021280002089e400b2188400067 +:020000040000fa +:020000041d02db +:1078fc000c00a294e8ffbd27400043301000b0af4d +:10790c001400bfaf2180a0001c0060141800a4a3b9 +:10791c00020043303d006050300042341000a38c14 +:10792c001b0060500e00a4940800a58c2d00a050e4 +:10793c0000a0053c0400068effa1400f0e0004962b +:10794c00ffff02240800038e040002ae1800a2936d +:10795c00000062a01800a28301006324000003aea3 +:10796c000a000324130043500c0003961400bf8f2d +:10797c001000b08f0800e0031800bd271400bf8f63 +:10798c002014047c1000b08f0800e0031800bd2701 +:10799c0001000624ffa1400f1800a5271400bf8f7b +:1079ac001800a283040000ae1000b08f0800e003a2 +:1079bc001800bd2700016330edff60101400bf8f6d +:1079cc000e0004960800058effa1400f0400068ee1 +:1079dc000800038e1800a283040000ae5e9e400bcc +:1079ec00000003ae4c40a5242000032408004234c0 +:1079fc00080005ae000005ae100003ae040003ae97 +:107a0c000c0002a6519e400b200006240c00a2a4e0 +:0c7a1c000400a0ac5e9e400bffff0224a3 +:020000040000fa +:020000041d02db +:107a2800e8ffbd271400bfaf1000beaf21f0a003d0 +:107a3800029d023c4c7f428c6c8182af080004247a +:107a4800e80305249876400f0000000021e8c003f1 +:107a58001400bf8f1000be8f1800bd270800e00378 +:107a680000000000e8ffbd271400bfaf1000beaf44 +:107a780021f0a0039591400f00000000211840005c +:107a88000100022407006214000000002992400f40 +:107a9800000000006c8182af01000224ac9e400b04 +:107aa800000000002110000021e8c0031400bf8f6f +:107ab8001000be8f1800bd270800e003000000007a +:107ac800f8ffbd270400beaf21f0a0036c81828fb0 +:107ad80021e8c0030400be8f0800bd270800e003aa +:107ae80000000000e8ffbd271400bfaf1000beafc4 +:107af80021f0a00308000424ab75400f000000002b +:107b080008004010000000002992400f000000000b +:107b18006c8182af08000424e80305249876400f9e +:107b28000000000021e8c0031400bf8f1000be8fc2 +:0c7b38001800bd270800e003000000005a +:020000040000fa +:020000041d02db +:107b44000c008394e0ffbd271000b0af01000224b5 +:107b540021808000110064301c00bfaf1800b2af58 +:107b6400300082141400b1af0002623018004014d7 +:107b74000400028efffd63300c0003a61a001124da +:107b84000d00122418004018ffff44240000028e48 +:107b9400040004ae0100442400004290000004ae3e +:107ba40080006430050080141c00bf8f1500515004 +:107bb4000800028e0a0052500400028e1800b28f90 +:107bc4001400b18f1000b08f0800e0032000bd271f +:107bd4001400401421100000df9e400bfffd6330b1 +:107be400eaff401cffff4424400062300d004014b3 +:107bf40021200002759c400f00000000e99e400b0c +:107c04000c000396080040101c00bf8f0400048e73 +:107c14000000028e01008424ffff4224040004ae0d +:107c2400000002ae1c00bf8f100063340c0003a6da +:107c3400ffff02241800b28f1400b18f1000b08f20 +:087c44000800e0032000bd2749 +:020000040000fa +:020000041d02db +:107c4c000020202020202020202028282828282020 +:107c5c002020202020202020202020202020202018 +:107c6c002080101010101010101010101010101088 +:107c7c001004040404040404040404101010101070 +:107c8c00101041414141414101010101010101013a +:107c9c00010101010101010101010101101010108c +:107cac00101042424242424202020202020202020c +:107cbc000202020202020202020202021010101060 +:107ccc002000000000000000000000000000000088 +:107cdc000000000000000000000000000000000098 +:107cec000000000000000000000000000000000088 +:107cfc000000000000000000000000000000000078 +:107d0c000000000000000000000000000000000067 +:107d1c000000000000000000000000000000000057 +:107d2c000000000000000000000000000000000047 +:107d3c000000000000000000000000000000000037 +:107d4c00000000000009121b242d363f48415a53f5 +:107d5c006c657e7719100b023d342f265158434a1f +:107d6c00757c676e323b2029161f040d7a7368618f +:107d7c005e574c452b2239300f061d14636a7178ff +:107d8c00474e555c646d767f4049525b2c253e37df +:107d9c0008011a137d746f6659504b42353c272edf +:107dac001118030a565f444d727b60691e170c054f +:107dbc003a3328214f465d546b627970070e151cbf +:107dcc00232a31384148535a656c777e09001b12bf +:107ddc002d243f3658514a437c756e671019020b9f +:107dec00343d262f737a6168575e454c3b3229200f +:107dfc001f160d046a6378714e475c55222b30397f +:107e0c00060f141d252c373e0108131a6d647f765e +:107e1c0049405b523c352e2718110a03747d666f5e +:107e2c005059424b171e050c333a21285f564d44ce +:107e3c007b7269600e071c152a233831464f545d3e +:047e4c00626b70797c +:020000040000fa +:020000041d02db +:107e5000e0ffbd27040002241800b0af1c00bfaf34 +:107e60001c00c21021808000000102240300c21007 +:107e7000000000001300c0141c00bf8f2800a05099 +:107e80000800058e0c000296080042340c0002a681 +:107e90000c000296080005aefbfe42302530c20001 +:107ea000100007ae0c0006a6040000ae2110000072 +:107eb0001c00bf8f1800b08f0800e0032000bd2712 +:107ec0001c00bf8fffff02241800b08f0800e003e2 +:107ed0002000bd270c008294080042300700405467 +:107ee0000c0002960800848c040080500c0002965e +:107ef0001fa5400f000000000c000296000000ae1d +:107f0000f7fe4230040042340c0002a6080000ae26 +:107f1000100000ae040000aeac9f400b211000002a +:107f20000300a01000000000a49f400b1000078e6b +:107f3000a1a3400f1000a6af21284000e0ff401091 +:0c7f40001000a68fa49f400b2000072417 +:020000040000fa +:020000041d02db +:107f5000286e756c6c290000303132333435363779 +:107f60003839414243444546000000003031323345 +:107f70003435363738396162636465660000000065 +:107f800001000000000000000a00000000000000e6 +:107f90006400000000000000e80300000000000092 +:107fa0001027000000000000a08601000000000073 +:107fb00040420f0000000000809698000000000082 +:107fc00000e1f5050000000000ca9a3b0000000037 +:107fd00000e40b540200000000e87648170000009f +:107fe0000010a5d4e800000000a0724e180900009f +:107ff00000407a10f35a00000080c6a47e8d030072 +:108000000000c16ff286230000008a5d784563019d +:10801000000064a7b3b6e00d0000e8890423c78a16 +:108020000000803f000020410000003f5f70894059 +:020000040000fa +:020000041d02db +:10803000a8ffbd270400a1af0800a2af0c00a3afaa +:108040001000a4af1400a5af1800a6af1c00a7af86 +:108050002000a8af2400a9af2800aaaf2c00abaf26 +:108060003000acaf3400adaf3800aeaf3c00afafc6 +:108070004000b8af4400b9af4800bfaf12400000a5 +:108080004c00a8af104000005000a8af039d1a3c60 +:10809000d88d5a27000000000068044000600540a9 +:1080a00009f84003000000005000a88f11000001f3 +:1080b0004c00a88f130000010400a18f0800a28fbc +:1080c0000c00a38f1000a48f1400a58f1800a68f9a +:1080d0001c00a78f2000a88f2400a98f2800aa8f3a +:1080e0002c00ab8f3000ac8f3400ad8f3800ae8fda +:1080f0003c00af8f4000b88f4400b98f4800bf8f5d +:0c8100005800bd27c0000000180000421d +:020000040000fa +:020000041d02db +:10810c00e8ffbd271400bfaf1000beaf21f0a003e5 +:10811c0081bf023c00f6428c100042300700401038 +:10812c0000000000010002241c8182af039d023c70 +:10813c001493442427a4400f0000000021e8c0033e +:10814c001400bf8f1000be8f1800bd270800e0037d +:10815c0000000000f8ffbd270400beaf21f0a00313 +:10816c0080bf023c00800334080043ac21e8c0030c +:10817c000400be8f0800bd270800e00300000000cb +:10818c00f8ffbd270400beaf21f0a00380bf023c66 +:10819c0000800334040043ac21e8c0030400be8f0c +:1081ac000800bd270800e00300000000f8ffbd2711 +:1081bc000400beaf21f0a00380bf023c01000324e9 +:1081cc00080043ac21e8c0030400be8f0800bd27a3 +:1081dc000800e00300000000e0ffbd271c00bfaf5b +:1081ec001800b2af1400b1af1000b0af2700a01050 +:1081fc00211080002020a470200011242380240250 +:10820c0040300500271810000430660006180202e2 +:10821c002518c30006280502200006320a2866002d +:10822c00042082000100a3340b286400f1a3400f4a +:10823c002120a0000f001112219040001f000224e9 +:10824c000f0002120100042446a3400f0420040274 +:10825c0021284000399b400f212040021c00bf8f79 +:10826c001800b28f1400b18f1000b08f0800e0031b +:10827c002000bd27039d023c98a0400b0895458c1f +:10828c00039d023c98a0400b0c95458cf1a3400f2c +:10829c00000000001c00bf8f1800b28f1400b18fbb +:0c82ac001000b08f0800e0032000bd2788 +:020000040000fa +:020000041d02db +:1082b80053504920466c61736820636f6e66696726 +:1082c80075726564000000004552524f523a2053bf +:1082d800504920466c617368206e6f742064657421 +:1082e8006563746564000000466c6173682073748c +:1082f80061747573207265676973746572203a20ba +:10830800307825780a00000053504920466c617384 +:108318006820646574656374696f6e204641494cd2 +:1083280045442e202056656e646f723a20307825b9 +:10833800782c20436869702049443a2030782578a1 +:108348000a00000053504920466c61736820646538 +:108358007465637465642e202056656e646f723a86 +:1083680020307825782c20436869702049443a20c9 +:08837800307825780a000000ae +:020000040000fa +:020000041d02db +:10838000e0ffbd271800b0af00a0103c8840028e6f +:10839000100040101c00bfaf1b00801821184400c3 +:1083a0002b206200110080141c00bf8f00a0043c31 +:1083b0006401848c2b2083000d00805400a0023cbb +:1083c0001c00bf8f884003ae1800b08f0800e00388 +:1083d0002000bd27109c400f1000a4af8840028ee3 +:1083e000edff40141000a48f1c00bf8f00a0023cc2 +:1083f0000c0003245c0143ac1800b08fffff022483 +:108400000800e0032000bd272b2043000500801456 +:1084100000a0043c6001848c2b206400e9ff8010e4 +:108420001c00bf8f1c00bf8f00a0023c160003245d +:108430005c0143ac1800b08fffff02240800e0038a +:048440002000bd2734 +:020000040000fa +:020000041d02db +:10844400211080002600c0101000ca2c1f00401507 +:10845400ff00a530005205002528aa00005405009d +:108464002528aa00030083300500601004000724b7 +:108474002338e3002330c700000085b8212087009b +:108484000f00c3302338c3000800e010213060001f +:108494002138e400000085ac040085ac080085acfc +:1084a40010008424fbff8714fcff85ac0300c33059 +:1084b4002338c3000500e010213060002138e400b7 +:1084c40004008424feff8714fcff85ac0400c01064 +:1084d4002138c40001008424feff8714ffff85a017 +:0884e4000800e00300000000a5 +:020000040000fa +:020000041d02db +:1084ec00200002240900052400008380feff625056 +:1084fc0001008424030065542d0002243da1400b8f +:10850c0001008424190062102b0002241b0062500d +:10851c000100842421380000029d063c4c7cc624ba +:10852c002110c30001004290040042300c004010a6 +:10853c002110000040280200c01002002110a200ef +:10854c000100842421104300000083802128c300f3 +:10855c000100a5900400a530f6ffa014d0ff422422 +:10856c00231802000800e0030b10670001008424ac +:10857c000000838049a1400b010007240000838088 +:08858c0049a1400b2138000059 +:020000040000fa +:020000041d02db +:10859400e0ffbd271800b0af029d103c4c7c1026b4 +:1085a40021189000010063901c00bfaf04006730e5 +:1085b4000900e01021108000d0ff82242a28450001 +:1085c4001100a0101c00bf8fff0042301800b08fb4 +:1085d4000800e0032000bd27010067300400e050dc +:1085e400030063300c00c01400000000030063307b +:1085f40004006010a9ff42242a284500f2ffa014b9 +:108604001c00bf8f1c00bf8fff0002241800b08f16 +:108614000800e0032000bd2790a4400f1000a5af80 +:1086240021805000010003927ca1400b1000a58f13 +:020000040000fa +:020000041d02db +:10863400feff082440300400403805002548c700e8 +:108644001b0020110000000000ff013c0100213448 +:108654002b08c1001a0020100000000000ff013c9c +:10866400010021342b08e100150020100000000057 +:108674000200810442300600233006000200a104f7 +:1086840042380700233807002a08c70003002010d7 +:108694000000000007000010ffff02242a08e60083 +:1086a400030020100000000002000010010002245a +:1086b400000002240800e0030000000000000000a5 +:0c86c400fcff0010251008000000000062 +:020000040000fa +:020000041d02db +:1086d0000400c92805002011213886001700c01c9d +:1086e000000000000800e003211000002540850084 +:1086f000030008310300001100000000100000100a +:10870000000088900000888c0000a98c040084245c +:10871000050009110400a524fcffa524fcff842406 +:108720000700001000008890fcffc624f5ffc01c65 +:10873000000000000800e003211000000000889005 +:108740000000a99001008424030009110100a52460 +:108750000800e00323100901f8ff8714000000005f +:088760000800e00321100000f5 +:020000040000fa +:020000041d02db +:108768000c008294e8ffbd271000b0af010003247d +:108778002180800001024430170083101400bfaf2d +:108788000202423002020324060043500800058e0c +:10879800211000001400bf8f1000b08f0800e00304 +:1087a8001800bd27fbffa010211000000400068e52 +:1087b800f9ffc0101400bf8fffa1400f0e000496f0 +:1087c8000400038e040043100c000296300042346b +:1087d800ffff42300c0002a60800048e2000433040 +:1087e800ffff0224040000ae000004aee7a1400b26 +:0487f8000a10030060 +:020000040000fa +:020000041d02db +:1087fc00e0ffbd271c00bfaf1200a0101800b0afe7 +:10880c001000c0100300842c060080140000023cf1 +:10881c001c00bf8f2110c0001800b08f0800e003af +:10882c002000bd27000042240b0040102120a00096 +:10883c002128c0000000000c1400a6af07a2400bba +:10884c001400a68f1c00bf8f211000001800b08fe1 +:10885c000800e0032000bd272180a6000000a480b2 +:10886c000100a5241000a5afd68a400f1400a6afb6 +:10887c001000a58ff9ffb0141400a68f08a2400bae +:04888c001c00bf8f7e +:020000040000fa +:020000041d02db +:10889000c2350400ff00c630ffffc924fe00212db1 +:1088a0000b0020100000000082ffc6247f80013ce6 +:1088b000ffff213424208100003f013c252081005e +:1088c0000000a6ac251004000800e0030000000032 +:1088d0000d00c0140000000021488400f8ff2011a2 +:1088e00000000000403a04002040e8702330c80037 +:1088f000043807010080013c24208100024a07005f +:10890000e9ff001025208900c0ff043cecff0010a7 +:08891000000006240000000035 +:020000040000fa +:020000041d02db +:10891800002a04000080013c2528a100c23d040073 +:10892800ff00e7309e0006242330c7000d00c00476 +:10893800000000002000c1280300201400000000ef +:108948000500001000000224020081040628c5006a +:1089580023280500251005000800e003000000009a +:1089680000000000807f013c010021342b088100b9 +:108978000300201400000000f7ff00100080023cf4 +:0c898800f5ff0010ffff022400000000bb +:020000040000fa +:020000041d02db +:10899400e8ffbd271400bfaf30a5400f0000000062 +:1089a40088bf023c0030438c0003637c08006014e1 +:1089b40099aa033c0010042488bf033c083064ac2b +:1089c4000030438c00086330fdff601499aa033c17 +:1089d40081bf023c5566632430f240ac30f243acb4 +:1089e4006655033caa99633430f243ac81bf023c20 +:1089f4000100032418f643ac81bf023c10f6428cfc +:088a040081a2400b00000000fc +:020000040000fa +:020000041d02db +:108a0c00e0ffbd271800b2af1400b1af1000b0af3b +:108a1c001c00bfaf218080002188a00090a2400bd9 +:108a2c00ffff1224e89d400f000000000b005210c5 +:108a3c00010010260000028221282002f9ff4014b8 +:108a4c00212040001c00bf8f1800b28f1400b18f82 +:108a5c001000b08f0800e0032000bd271c00bf8f62 +:108a6c00ffff02241800b28f1400b18f1000b08fda +:088a7c000800e0032000bd2703 +:020000040000fa +:020000041d02db +:108a84001b00c01021100000000082801100401063 +:108a94000000a38012004314ffffc624b0a2400bc1 +:108aa400ffff072400008280090040100100a52474 +:108ab4000000a3800b004314ff004230ffffc624d4 +:108ac400f8ffc714010084240800e003211000000b +:108ad4000000a380ff0063300800e003231043007c +:108ae400ff004230ff0063300800e003231043001e +:088af4000800e003000000008f +:020000040000fa +:020000041d02db +:108afc00ffff032403008314211080000800e0030f +:108b0c00000000000c00a494010003240102843036 +:108b1c00030083500800a68c0800e003ffff02242a +:108b2c00f6ffc050ffff02240400a48c1000a38c9d +:108b3c00f2ff8350ffff02240000a38c0600c31039 +:108b4c00010084240400a4acffff64240000a4ac46 +:108b5c000800e003ffff62a001006324d5a2400bd4 +:048b6c000000a3acb6 +:020000040000fa +:020000041d02db +:108b7000f8ffbd270400beaf21f0a003211880003c +:108b80002110a0000800c3a30c00c2a30c00c393d3 +:108b900080bf023c305a43ac0800c39380bf023c04 +:108ba000205a43ac0000000080bf023c105a428ca7 +:108bb00001004230fcff40100000000080bf023c7a +:108bc000205a428c0800c2a30800c29321e8c003c7 +:108bd0000400be8f0800bd270800e003000000006d +:108be000f8ffbd270400beaf21f0a00388bf033cff +:108bf000e060628c8431027ce06062ac21e8c003fa +:108c00000400be8f0800bd270800e003000000003c +:108c1000f8ffbd270400beaf21f0a00388bf033cce +:108c2000e060628c010004248431827ce06062acec +:108c30000100022421e8c0030400be8f0800bd2704 +:088c40000800e0030000000041 +:020000040000fa +:020000041d02db +:108c4800d0ffbd273800a2273800a6af1000a2af7a +:108c580021304000ff7f02242800b0af2400a2afdb +:108c680021808000c20002241400a4272c00bfaf7a +:108c78001400b0af1c00b0af3c00a7af1800a0af05 +:108c88009d4e400f2000a2a71400a28f000040a014 +:108c98001400a28f2c00bf8f231050002800b08f23 +:088ca8000800e0033000bd27c5 +:020000040000fa +:020000041d02db +:108cb0000000803f000020410000c84200007a44cc +:108cc00000401c460050c347002474498096184b4e +:108cd00020bcbe4c286b6e4ef9021550ec78ad608e +:108ce000caf249710000803fcdcccc3d0ad7233c6d +:108cf0006f12833a17b7d138acc52737bd378635e1 +:108d000095bfd63377cc2b325f708930ffe6db2ef0 +:088d100008e53c1e6042a20dc3 +:020000040000fa +:020000041d02db +:108d18000080013c12008010243081000200810490 +:108d280000000000232004009e00052420388770de +:108d38002328a7000420e400800084248000882cd5 +:108d48002128a800034204000100083123208800dc +:108d58004020040042220400c04505002520880068 +:108d6800251086000800e003000000000000000055 +:020000040000fa +:020000041d02db +:108d7800e0ffbd271400b0af029d103c1800b1af52 +:108d88001c00bfaf00a0113c4c7c1026d19e400fa8 +:108d9800bc40248e211802020100638088006330e1 +:108da800faff6014ffff03240400431000a0033cf3 +:108db800bc40658cbfa2400f212040001c00bf8f23 +:108dc8001800b18f1400b08f0800e0032000bd2701 +:020000040000fa +:020000041d02db +:108dd800e0ffbd271c00bfaf1800beaf21f0a00305 +:108de800004802401000c2af006802401f00423035 +:108df800e48082af00700240ec8082af00600340e4 +:108e0800ff0f023cfeff42342410620000608240e3 +:108e1800c0000000400000004000000040000000ca +:088e280065a2400f00000000ec +:020000040000fa +:020000041d02db +:108e3000c8ffbd274000a3273400bfaf4000a6af46 +:108e40004400a7af1000a3af1400a4af1c00a4af50 +:108e50008e9d400f2800a5af1000a68f2800a58f7b +:108e60001800a2af2400a2af1400a427c10002245e +:108e70000a7f400f2000a2a73400bf8f0800e00344 +:048e80003800bd27d2 +:020000040000fa +:020000041d02db +:108e840000a0033cb840628ce8ffbd270d004010f1 +:108e94001400bfaf0000448cb84064acffff03244f +:108ea400030043101400bf8f0800e0031800bd271f +:108eb400e966042400a0033c5c0164ac0800e00300 +:108ec4001800bd27caa3400f20000424a9a3400b07 +:048ed400ffff032475 +:020000040000fa +:020000041d02db +:108ed8000000000000000000000000000060070023 +:108ee80000000000006007000030000000080000db +:108ef80000380000001800000030000000200000ca +:108f08000050000000100000006000000020000079 +:108f18000080000000100000000000000020000099 +:020000040000fa +:020000041d02db +:108f2800e0ffbd271800b1af1400b0af1c00bfaf01 +:108f3800e0a0400f218880000700201a218040000f +:108f4800ffff022404000212212000022128000051 +:108f580011a1400f213020021c00bf8f21100002f8 +:108f68001800b18f1400b08f0800e0032000bd275f +:020000040000fa +:020000041d02db +:108f78000000043ce8ffbd270000842403008010a3 +:108f88001400bfaf09f88000000000000000843022 +:108f98000000a5309b89400f000000000000023c43 +:108fa80000004224030040100000000009f84000bf +:0c8fb80000000000f9ff001000000000a5 +:020000040000fa +:020000041d02db +:108fc400e8ffbd271400bfaf060080042110800015 +:108fd40046a3400f000000001400bf8f0800e00308 +:108fe4001800bd27010042304220040046a3400f70 +:108ff40025208200212040008a95400f212840002e +:0c9004001400bf8f0800e0031800bd2717 +:020000040000fa +:020000041d02db +:109010000000023ce8ffbd2700004224060040108b +:109020001400bfaf0000023c0000422403004010c7 +:10903000039d023c3f000070039d023c5890422477 +:10904000030040100000000009f84000000000008c +:0890500014a4400b0000000015 +:020000040000fa +:020000041d02db +:1090580000606041c000000099aa033c81bf023c47 +:109068005566632430f240ac30f243ac6655033c9d +:10907800aa99633430f243ac81bf023c0100032457 +:1090880018f643ac81bf023c10f6428c18a4400b82 +:0490980000000000d4 +:020000040000fa +:020000041d02db +:10909c00e0ffbd271400b0af00a0103c7c3d0526be +:1090ac001c00bfaf83a2400f1800b1af7c3d05265a +:1090bc000a000424e89d400f218840001c00bf8f4b +:1090cc00211020021400b08f1800b18f0800e003ab +:0490dc002000bd278c +:020000040000fa +:020000041d02db +:1090e000e0ffbd272400a2272118800000a0043c37 +:1090f0002400a5af2800a6af7c3d84242128600071 +:10910000213040001c00bfaf2c00a7af9d4e400f88 +:109110001000a2af1c00bf8f0800e0032000bd2795 +:020000040000fa +:020000041d02db +:109120000000023c00004224050040100000023c08 +:109130000000422403004010039d023c3f000070e9 +:10914000039d023c58904224fdff401000000000a7 +:0891500009f8400000000000d6 +:020000040000fa +:020000041d02db +:109158004a462e636f6d000042617474657279200f +:10916800766f6c746167653a2025660a0000000016 +:1091780000c07f443d0a574000003041333353401c +:10918800cdcc4c3d4a462e636f6d00004368616c40 +:1091980065744475696e6f20563220496e6974692a +:1091a800616c697a65640000746573742025640acb +:0491b80000000000b3 +:020000040000fa +:020000041d02db +:1091bc00006803408000023c251062000068824079 +:1091cc00040080100010032488bf023c0800e00358 +:1091dc00041043ac88bf023c0800e003081043ac09 +:020000040000fa +:020000041d02db +:1091ec0000a0033c8c40622401000424080044ac21 +:1091fc0000a0043cc84084248c4064ac0000033cb8 +:0c920c00000263240800e003040043acef +:020000040000fa +:020000041d02db +:10921800496e766572746572207475726e65642025 +:109228004f4e0000496e76657274657220747572cf +:089238006e6564204f464600fc +:020000040000fa +:020000041d02db +:10924000029d033c4c7c6324211883002110800084 +:109250000100649020004324010084300800e003f2 +:049260000b1064008b +:020000040000fa +:020000041d02db +:10926400029d023c4c7c4224211082000100429069 +:10927400e0ff8324020042300b2062000800e00378 +:049284002110800035 +:020000040000fa +:020000041d02db +:10928800f8ffbd270400beaf21f0a00321e8c0030a +:109298000400be8f0800bd270800e003000000009e +:020000040000fa +:020000041d02db +:1092a8005052494e544600005258204649464f20d5 +:0c92b8004f766572666c6f770000000056 +:020000040000fa +:020000041d02db +:1092c4000100843003008014000000000800e00363 +:0c92d400006060410800e0032060604181 +:020000040000fa +:020000041d02db +:1092e0000300a01021300000949f400b20000724b1 +:0c92f00004000624949f400b213800006d +:020000040000fa +:020000041d02db +:1092fc005541525431204f45525200005541525461 +:10930c0032204f45525200005761746368646f6796 +:10931c0020776173207472696767657265640000f9 +:020000040000fa +:020000041d02db +:10932c00f8ff022400800340241062000200423443 +:08933c000800e00300808240fc +:020000040000fa +:020000041d02db +:10934400f8ff02240080034024106200030042342a +:089354000800e00300808240e4 +:020000040000fa +:020000041d02db +:10935c0000601a40bfff1b3cffff7b3724d05b0330 +:08936c0000609a401800004265 +:020000040000fa +:020000041d02db +:10937400029d023c4c7c4224211044000100429096 +:089384000800e003070042307d +:020000040000fa +:020000041d02db +:10938c00029d023c4c7c422421104400010042907e +:08939c000800e0030300423069 +:020000040000fa +:020000041d02db +:1093a400029d023c4c7c4224211044000100429066 +:0893b4000800e0032000423034 +:020000040000fa +:020000041d02db +:1093bc00029d023c4c7c422421104400010042904e +:0893cc000800e0030400423038 +:020000040000fa +:020000041d02db +:1093d400029d023c4c7c4224211044000100429036 +:0893e4000800e003170042300d +:020000040000fa +:020000041d02db +:1093ec00029d023c4c7c422421104400010042901e +:0893fc000800e003020042300a +:020000040000fa +:020000041d02db +:10940400029d023c4c7c4224211044000100428015 +:089414000800e003970042305c +:020000040000fa +:020000041d02db +:10941c00029d023c4c7c42242110440001004290ed +:08942c000800e00310004230cb +:020000040000fa +:020000041d02db +:10943400029d023c4c7c42242110440001004280e5 +:089444000800e003880042303b +:020000040000fa +:020000041d02db +:10944c00029d023c4c7c42242110440001004290bd +:08945c000800e00301004230aa +:020000040000fa +:020000041d02db +:10946400029d023c4c7c42242110440001004290a5 +:089474000800e003440042304f +:020000040000fa +:020000041d02db +:10947c0000a0023cb840438cb84044ac0800e00368 +:04948c00000083acad +:020000040000fa +:020000041d02db +:109490004348414c45545f5630312e30302e320017 +:1094a0004a462e636f6d00000000803d00000041c1 +:0894b0004a462e636f6d0000b7 +:020000040000fa +:020000041d02db +:0894b8000800e003206062419e +:020000040000fa +:020000041d02db +:0894c0000800e00300606241b6 +:020000040000fa +:020000041d02db +:0894c8000800e00300000000b1 +:020000040000fa +:020000041d02db +:0894d0000800e00300000000a9 +:020000040000fa +:020000041d02db +:0894d8000800e0032110000070 +:020000040000fa +:020000041d02db +:0894e0000800e0038000822c6b +:020000040000fa +:020000041d02db +:0894e8000800e0037f00823060 +:020000040000fa +:020000041d02db +:0894f0000800e00320008224c3 +:020000040000fa +:020000041d02db +:0894f8000800e003e0ff8224fc +:020000040000fa +:020000041d02db +:089500000800e00380000224d2 +:020000040000fa +:020000041d02db +:089508000000804f0000004f3d +:020000040000fa +:020000041d02db +:047f4c00bfad3a4f3c +:00000001FF diff --git a/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.map b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.map new file mode 100644 index 0000000..bcfa312 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.map @@ -0,0 +1,5170 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (__floatunsisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o (memcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o (close) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuinoV2_795F512H_/production/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuinoV2_795F512H_/production/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuinoV2_795F512H_/production/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + (_printf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/main.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) + build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o (_printf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuinoV2_795F512H_/production/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) (_vfprintf_cdfFnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_fF.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_fF.eo) (_vfprintf_fF) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) (__umoddi3) + +Allocating common symbols +Common symbol size file + +mSyslogBufPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +BootloaderRxPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o +u8IsMacAddrValid 0x1 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +CurDataChunkSize 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mTerminalOpened 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +BootloaderFirmwareChunkWriteCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +BootloaderFlashWriteDataPtr + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mTerminalPendingAction + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o +mCurIPAddress 0x4 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mBatteryCurrent 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mStoredBootloaderInfo + 0x14 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +TerminalWorkString 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mWifiSPIBaudrate 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o +BootloaderRxBuf 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +BootloaderFlashErased + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +gpfAppSocketCb 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +BootloaderFlashWriteState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +gstrHifCxt 0x24 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o +mac_addr 0x6 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mLoraSMState 0x4 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o +BootloaderCurFlashWriteAddress + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mRxData 0x136 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +mSyslogBuffer 0x1f4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +mDeviceID 0x2 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o +mCurrentMeanCount 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +ActualTemp 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o +addr_in 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +BooloaderFlashEraseState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +PowerRelayState 0x4 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o +param 0x18 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +mCurrentMeanSum 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mModuleIPConfig 0x14 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +astUartData 0x620 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o +BootloaderBuffer 0x12c build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +I2CSlaveBuffer 0xa build/ChaletDuinoV2_795F512H_/production/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +BootloaderCurFlashEraseAddress + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +TerminalPrevDataBuf + 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +BootloaderFlashWritePollCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +BootloaderInterfaceState + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +DataChunkWritten 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mTxData 0x136 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mSPIFlashOK 0x4 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +mI2CWaitCounter 0x4 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o +gastrSockets 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +mTerminalTickState 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuinoV2_795F512H_/production/Source/ina219.o +BooloaderFlashErasePollCount + 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +FirmwareUploaded 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +mFlashSectorBuffer 0x1000 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +CurDataChunkIndex 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +astTimer 0x108 build/ChaletDuinoV2_795F512H_/production/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o +SyslogRxBuf 0xc8 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d005800 0xe274 57972 App's exec code +.text._vfprintf_cdfFnop 0x9d013a74 0x13d4 5076 +.text 0x9d014e48 0x9060 36960 App's exec code +.dinit 0x9d01dea8 0xb80 2944 +.text 0x9d01ea28 0x1200 4608 App's exec code +.text._vfscanf_s 0x9d01fc28 0x868 2152 +.rodata 0x9d020490 0x7b8 1976 Read-only const +.text 0x9d020c48 0x28cc 10444 App's exec code +.rodata 0x9d023514 0x494 1172 Read-only const +.text 0x9d0239a8 0x8a8 2216 App's exec code +.rodata 0x9d024250 0x404 1028 Read-only const +.text 0x9d024654 0xd2c 3372 App's exec code +.text.scale 0x9d025380 0x2a0 672 +.text.fpsubadd 0x9d025620 0x278 632 +.text 0x9d025898 0x988 2440 App's exec code +.rodata 0x9d026220 0x254 596 Read-only const +.text 0x9d026474 0x244 580 App's exec code +.text.fp32div 0x9d0266b8 0x230 560 +.text.__floatdisf 0x9d0268e8 0x220 544 +.text 0x9d026b08 0x1dc 476 App's exec code +.text.fp32mul 0x9d026ce4 0x1bc 444 +.text 0x9d026ea0 0x1a0 416 App's exec code +.text._sbrk_init 0x9d027040 0x194 404 +.text._filbuf 0x9d0271d4 0x188 392 +.text.read 0x9d02735c 0x174 372 +.text 0x9d0274d0 0x2d0 720 App's exec code +.text.fputc 0x9d0277a0 0x15c 348 +.text._flsbuf 0x9d0278fc 0x12c 300 +.text 0x9d027a28 0x11c 284 App's exec code +.text.fgetc 0x9d027b44 0x108 264 +.rodata 0x9d027c4c 0x204 516 Read-only const +.text.setvbuf 0x9d027e50 0xfc 252 +.rodata 0x9d027f4c 0x4 4 Read-only const +.rodata 0x9d027f50 0xe0 224 Read-only const +.text.general_exception 0x9d028030 0xdc 220 +.text 0x9d02810c 0x1ac 428 App's exec code +.rodata 0x9d0282b8 0xc8 200 Read-only const +.text._sbrk 0x9d028380 0xc4 196 +.text 0x9d028444 0xa8 168 App's exec code +.text.atoi 0x9d0284ec 0xa8 168 +.text.range 0x9d028594 0xa0 160 +.text.fpcmp 0x9d028634 0x9c 156 +.text 0x9d0286d0 0x98 152 App's exec code +.text.fflush 0x9d028768 0x94 148 +.text.write 0x9d0287fc 0x94 148 +.text.libm 0x9d028890 0x88 136 +.text.fptoul 0x9d028918 0x7c 124 +.text.SoftReset 0x9d028994 0x78 120 +.text.fputs 0x9d028a0c 0x78 120 +.text.strncmp 0x9d028a84 0x78 120 +.text.ungetc 0x9d028afc 0x74 116 +.text 0x9d028b70 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d028c48 0x68 104 +.rodata 0x9d028cb0 0x68 104 Read-only const +.text.sitofp 0x9d028d18 0x60 96 +.text.wspace 0x9d028d78 0x60 96 +.text 0x9d028dd8 0x58 88 App's exec code +.text._sscanf_s 0x9d028e30 0x54 84 +.text._bufallo 0x9d028e84 0x54 84 +.rodata 0x9d028ed8 0x50 80 Read-only const +.text.sbrk 0x9d028f28 0x50 80 +.text.main_entry 0x9d028f78 0x4c 76 +.text 0x9d028fc4 0x4c 76 App's exec code +.text._bootstrap_except 0x9d029010 0x48 72 +.text 0x9d029058 0x44 68 App's exec code +.text.puts 0x9d02909c 0x44 68 +.text._printf_cdfFnopsu 0x9d0290e0 0x40 64 +.vector_default 0x9d029120 0x38 56 +.rodata 0x9d029158 0x64 100 Read-only const +.text.INTConfigureSyste 0x9d0291bc 0x30 48 +.text._stub_sbd_memlayo 0x9d0291ec 0x2c 44 +.rodata 0x9d029218 0x28 40 Read-only const +.text.tolower 0x9d029240 0x24 36 +.text.toupper 0x9d029264 0x24 36 +.text 0x9d029288 0x20 32 App's exec code +.rodata 0x9d0292a8 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d0292c4 0x1c 28 +.text.setbuf 0x9d0292e0 0x1c 28 +.rodata 0x9d0292fc 0x30 48 Read-only const +.text.CheKseg0CacheOff 0x9d02932c 0x18 24 +.text.CheKseg0CacheOn 0x9d029344 0x18 24 +.text 0x9d02935c 0x18 24 App's exec code +.text.isalnum 0x9d029374 0x18 24 +.text.isalpha 0x9d02938c 0x18 24 +.text.iscntrl 0x9d0293a4 0x18 24 +.text.isdigit 0x9d0293bc 0x18 24 +.text.isgraph 0x9d0293d4 0x18 24 +.text.islower 0x9d0293ec 0x18 24 +.text.isprint 0x9d029404 0x18 24 +.text.ispunct 0x9d02941c 0x18 24 +.text.isspace 0x9d029434 0x18 24 +.text.isupper 0x9d02944c 0x18 24 +.text.isxdigit 0x9d029464 0x18 24 +.text._buffree 0x9d02947c 0x14 20 +.rodata 0x9d029490 0x28 40 Read-only const +.text.INTEnableInterrup 0x9d0294b8 0x8 8 +.text.INTDisableInterru 0x9d0294c0 0x8 8 +.text._on_reset 0x9d0294c8 0x8 8 +.text._on_bootstrap 0x9d0294d0 0x8 8 +.text.close 0x9d0294d8 0x8 8 +.text.isascii 0x9d0294e0 0x8 8 +.text.toascii 0x9d0294e8 0x8 8 +.text._tolower 0x9d0294f0 0x8 8 +.text._toupper 0x9d0294f8 0x8 8 +.text.getpagesize 0x9d029500 0x8 8 +.rodata 0x9d029508 0x8 8 Read-only const + Total kseg0_program_mem used : 0x23d10 146704 29.2% of 0x7a7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.startup 0x9d005000 0x1e8 488 C startup code + Total kseg0_boot_mem used : 0x1e8 488 24.0% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d004180 0x10 16 General-Exception +.vector_0 0x9d004200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d004220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d004240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d004260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d004280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0042a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0042c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0042e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d004300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d004320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d004340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d004360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d004380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0043a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0043c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0043e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d004400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d004420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d004440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d004460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d004480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0044a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0044c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0044e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d004500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d004520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d004540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d004560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d004580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0045a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0045c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0045e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d004600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d004620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d004640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d004660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d004680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0046a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0046c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0046e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d004700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d004720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d004740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d004760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d004780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0047a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0047c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0047e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d004800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d004820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d004840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d004860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d004880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0048a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0048c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0048e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d004900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d004920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d004940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d004960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d004980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0049a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0049c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0049e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x8 8 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x18 24 2.1% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x24120 147744 29.0% of 0x7c47f + -------------------------------------------------------------------------- + + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.eh_frame 0xa0000000 0x30 48 +.sdata 0xa0000030 0x74 116 Small init data +.sbss 0xa00000a4 0x178 376 Small uninit data +.bss 0xa000021c 0x2e90 11920 Uninitialized data +.data 0xa00030ac 0x4bc 1212 Initialized data +.bss 0xa0003568 0x800 2048 Uninitialized data +.data 0xa0003d68 0x2c4 708 Initialized data +.bss 0xa000402c 0x40 64 Uninitialized data +.data 0xa000406c 0x1c 28 Initialized data +.bss 0xa0004088 0x38 56 Uninitialized data + Total kseg1_data_mem used : 0x40c0 16576 25.3% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x40c0 16576 25.3% of 0x10000 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa00040c8 0x200 512 Reserved for heap +stack 0xa00042e0 0xbd18 48408 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .reginfo 0x00000000 0x18 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +Memory Configuration + +Name Origin Length Attributes +kseg0_program_mem 0x9d005800 0x0007a7ff xr +kseg0_boot_mem 0x9d005000 0x000007f0 +exception_mem 0x9d004000 0x00001000 +kseg1_boot_mem 0xbfc00000 0x00000490 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +kseg1_data_mem 0xa0000000 0x00010000 w !x +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Uart.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Util.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/main.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/system.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/template.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/timer.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/SPI.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/ina219.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/I2C.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/TC77.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/crc32.o +LOAD build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d004000 _ebase_address = 0x9d004000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d004180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x8 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d004180 0x10 + *(.gen_handler) + .gen_handler 0x9d004180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d004200 0x8 + *(.vector_0) + .vector_0 0x9d004200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d004200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d004220 0x8 + *(.vector_1) + .vector_1 0x9d004220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d004220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d004240 0x8 + *(.vector_2) + .vector_2 0x9d004240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d004240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d004260 0x8 + *(.vector_3) + .vector_3 0x9d004260 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + 0x9d004260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d004280 0x8 + *(.vector_4) + .vector_4 0x9d004280 0x8 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0x9d004280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0042a0 0x8 + *(.vector_5) + .vector_5 0x9d0042a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0042a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0042c0 0x8 + *(.vector_6) + .vector_6 0x9d0042c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0042c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0042e0 0x8 + *(.vector_7) + .vector_7 0x9d0042e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0042e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d004300 0x8 + *(.vector_8) + .vector_8 0x9d004300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d004300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d004320 0x8 + *(.vector_9) + .vector_9 0x9d004320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d004320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d004340 0x8 + *(.vector_10) + .vector_10 0x9d004340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d004340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d004360 0x8 + *(.vector_11) + .vector_11 0x9d004360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d004360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d004380 0x8 + *(.vector_12) + .vector_12 0x9d004380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d004380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0043a0 0x8 + *(.vector_13) + .vector_13 0x9d0043a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0043a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0043c0 0x8 + *(.vector_14) + .vector_14 0x9d0043c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0043c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0043e0 0x8 + *(.vector_15) + .vector_15 0x9d0043e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0043e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d004400 0x8 + *(.vector_16) + .vector_16 0x9d004400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d004400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d004420 0x8 + *(.vector_17) + .vector_17 0x9d004420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d004420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d004440 0x8 + *(.vector_18) + .vector_18 0x9d004440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d004440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d004460 0x8 + *(.vector_19) + .vector_19 0x9d004460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d004460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d004480 0x8 + *(.vector_20) + .vector_20 0x9d004480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d004480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0044a0 0x8 + *(.vector_21) + .vector_21 0x9d0044a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0044a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0044c0 0x8 + *(.vector_22) + .vector_22 0x9d0044c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0044c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0044e0 0x8 + *(.vector_23) + .vector_23 0x9d0044e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0044e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d004500 0x8 + *(.vector_24) + .vector_24 0x9d004500 0x8 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0x9d004500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d004520 0x8 + *(.vector_25) + .vector_25 0x9d004520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d004520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d004540 0x8 + *(.vector_26) + .vector_26 0x9d004540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d004540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d004560 0x8 + *(.vector_27) + .vector_27 0x9d004560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d004560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d004580 0x8 + *(.vector_28) + .vector_28 0x9d004580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d004580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0045a0 0x8 + *(.vector_29) + .vector_29 0x9d0045a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0045a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0045c0 0x8 + *(.vector_30) + .vector_30 0x9d0045c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0045c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0045e0 0x8 + *(.vector_31) + .vector_31 0x9d0045e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0045e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d004600 0x8 + *(.vector_32) + .vector_32 0x9d004600 0x8 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0x9d004600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d004620 0x8 + *(.vector_33) + .vector_33 0x9d004620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d004620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d004640 0x8 + *(.vector_34) + .vector_34 0x9d004640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d004640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d004660 0x8 + *(.vector_35) + .vector_35 0x9d004660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d004660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d004680 0x8 + *(.vector_36) + .vector_36 0x9d004680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d004680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0046a0 0x8 + *(.vector_37) + .vector_37 0x9d0046a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0046a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0046c0 0x8 + *(.vector_38) + .vector_38 0x9d0046c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0046c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0046e0 0x8 + *(.vector_39) + .vector_39 0x9d0046e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0046e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d004700 0x8 + *(.vector_40) + .vector_40 0x9d004700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d004700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d004720 0x8 + *(.vector_41) + .vector_41 0x9d004720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d004720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d004740 0x8 + *(.vector_42) + .vector_42 0x9d004740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d004740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d004760 0x8 + *(.vector_43) + .vector_43 0x9d004760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d004760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d004780 0x8 + *(.vector_44) + .vector_44 0x9d004780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d004780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0047a0 0x8 + *(.vector_45) + .vector_45 0x9d0047a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0047a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0047c0 0x8 + *(.vector_46) + .vector_46 0x9d0047c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0047c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0047e0 0x8 + *(.vector_47) + .vector_47 0x9d0047e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0047e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d004800 0x8 + *(.vector_48) + .vector_48 0x9d004800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d004800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d004820 0x8 + *(.vector_49) + .vector_49 0x9d004820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d004820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d004840 0x8 + *(.vector_50) + .vector_50 0x9d004840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d004840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d004860 0x8 + *(.vector_51) + .vector_51 0x9d004860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d004860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d004880 0x8 + *(.vector_52) + .vector_52 0x9d004880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d004880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0048a0 0x8 + *(.vector_53) + .vector_53 0x9d0048a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0048a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0048c0 0x8 + *(.vector_54) + .vector_54 0x9d0048c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0048c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0048e0 0x8 + *(.vector_55) + .vector_55 0x9d0048e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0048e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d004900 0x8 + *(.vector_56) + .vector_56 0x9d004900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d004900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d004920 0x8 + *(.vector_57) + .vector_57 0x9d004920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d004920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d004940 0x8 + *(.vector_58) + .vector_58 0x9d004940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d004940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d004960 0x8 + *(.vector_59) + .vector_59 0x9d004960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d004960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d004980 0x8 + *(.vector_60) + .vector_60 0x9d004980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d004980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0049a0 0x8 + *(.vector_61) + .vector_61 0x9d0049a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0049a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0049c0 0x8 + *(.vector_62) + .vector_62 0x9d0049c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0049c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0049e0 0x8 + *(.vector_63) + .vector_63 0x9d0049e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0049e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup 0x9d005000 0x1e8 + *(.startup) + *(.reset.startup) + .reset.startup + 0x9d005000 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.text 0x9d005800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d005800 . = ALIGN (0x4) + +.init 0x9d005800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d005800 . = ALIGN (0x4) + +.fini 0x9d005800 0x0 + *(.fini) + 0x9d005800 . = ALIGN (0x4) + +.preinit_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d005800 PROVIDE (__preinit_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.init_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d005800 PROVIDE (__init_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.fini_array 0x9d005800 0x0 + 0x9d005800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d005800 PROVIDE (__fini_array_end, .) + 0x9d005800 . = ALIGN (0x4) + +.ctors 0x9d005800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d005800 . = ALIGN (0x4) + +.dtors 0x9d005800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d005800 . = ALIGN (0x4) + +.rodata 0x9d005800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d005800 . = ALIGN (0x4) + +.sdata2 0x9d0051e8 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d0051e8 . = ALIGN (0x4) + +.sbss2 0x9d0051e8 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d0051e8 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d0051e8 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d0051e8 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d0051e8 . = ALIGN (0x4) + +.dbg_data 0xa0000000 0x0 + 0xa0000000 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000000 0x0 + *(.jcr) + 0xa0000000 . = ALIGN (0x4) + +.eh_frame 0xa0000000 0x30 + *(.eh_frame) + .eh_frame 0xa0000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000030 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000030 . = ALIGN (0x4) + +.persist 0xa0000030 0x0 + 0xa0000030 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 _persist_end = . + +.data 0xa0000030 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 . = . + 0xa0008020 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000030 0x0 + *(.got.plt) + *(.got) + 0xa0000030 . = ALIGN (0x4) + +.sdata 0xa0000030 0x74 + 0xa0000030 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000030 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .sdata 0xa0000034 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .sdata 0xa0000038 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + 0xa0000038 egstrNmBusCapabilities + .sdata 0xa000003c 0x2 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0xa000003c State + *fill* 0xa000003e 0x2 + .sdata 0xa0000040 0xc build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .sdata 0xa000004c 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + 0xa000004c gUartStrings + .sdata 0xa0000050 0x8 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .sdata 0xa0000058 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa000005f TerminalSocket + 0xa0000060 TerminalServerSocket + 0xa0000061 SyslogSocket + 0xa0000062 SyslogServerSocket + 0xa0000063 NetworkSocket + 0xa0000064 NetworkServerSocket + 0xa0000065 BootloaderSocket + 0xa0000066 BootloaderServerSocket + .sdata 0xa0000068 0x4 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + 0xa0000068 mLoraPreamble + .sdata 0xa000006c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .sdata 0xa0000074 0x8 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .sdata 0xa000007c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .sdata 0xa0000084 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa000008c BtldrComputedCRC + 0xa0000090 BootloaderState + 0xa0000094 BootloaderDataStartPtr + .sdata 0xa000009c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000009c _Files + .sdata 0xa00000a0 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa00000a0 __XC_UART + 0xa00000a4 . = ALIGN (0x4) + 0xa00000a4 _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa00000a4 . = ALIGN (0x4) + 0xa00000a4 _data_end = . + 0xa00000a4 _bss_begin = . + +.sbss 0xa00000a4 0x178 + 0xa00000a4 _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa00000a4 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + *fill* 0xa00000a5 0x3 + .sbss 0xa00000a8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .sbss 0xa00000ac 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .sbss 0xa00000b4 0x14 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .sbss 0xa00000c8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .sbss 0xa00000cc 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .sbss 0xa00000d0 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + *fill* 0xa00000d1 0x3 + .sbss 0xa00000d4 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa00000d4 gu16SessionID + 0xa00000d6 gbSocketInit + .sbss 0xa00000e4 0x4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .sbss 0xa00000e8 0x4 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0xa00000e8 LoraData + .sbss 0xa00000ec 0x18 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0xa00000ec DataSize + 0xa00000f0 DataCtr + 0xa00000f4 BufPtr + 0xa00000f8 RxPtr + 0xa00000f9 Command + 0xa00000fa CRC + 0xa00000fb SenderID + 0xa00000fc SenderAddress + 0xa00000fd Flags + 0xa00000fe IsUpdating + 0xa0000100 BmpDataPtr + .sbss 0xa0000104 0xc build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .sbss 0xa0000110 0x1c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa0000110 gu32HostIp + 0xa0000114 gu8RetryCount + 0xa0000124 mWiFiInitOK + 0xa0000128 mWiFiState + .sbss 0xa000012c 0x4 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + 0xa000012c mTotalMasterNbRequests + .sbss 0xa0000130 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .sbss 0xa0000134 0x8 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + 0xa0000134 ina219_currentDivider_mA + 0xa0000138 ina219_powerDivider_mW + .sbss 0xa000013c 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + 0xa000013c WatchdogTriggered + .sbss 0xa0000140 0x18 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa0000140 BootloaderHeader + 0xa0000144 BootloaderDataSize + 0xa0000148 BootloaderDataCtr + 0xa000014c BootloaderBufPtr + 0xa0000150 BootloaderCRC + 0xa0000154 BootloaderCommand + .sbss 0xa0000158 0x1 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .sbss 0xa0000159 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0000159 _outdone + *fill* 0xa000015a 0x2 + .sbss 0xa000015c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa000015c errno + .sbss 0xa0000160 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa0000160 _minbrk + 0xa0000164 _maxbrk + *(.scommon) + .scommon 0xa0000168 0x1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + 0xa0000168 mWifiSPIBaudrate + *fill* 0xa0000169 0x3 + .scommon 0xa000016c 0x8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa000016c gpfAppResolveCb + 0xa0000170 gpfAppSocketCb + .scommon 0xa0000174 0x2 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0xa0000174 acIntUartRxBuff + *fill* 0xa0000176 0x2 + .scommon 0xa0000178 0x14 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0xa0000178 mTerminalOpened + 0xa000017c TerminalDataPtr + 0xa0000180 mTerminalPendingAction + 0xa0000184 mHelpStringPtr + 0xa0000188 mTerminalTickState + .scommon 0xa000018c 0x4 build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0xa000018c ActualTemp + .scommon 0xa0000190 0xe build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa0000190 u8IsMacAddrValid + 0xa0000194 mCurIPAddress + 0xa0000198 mac_addr + .scommon 0xa000019e 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + *fill* 0xa000019e 0x2 + .scommon 0xa00001a0 0x4 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + 0xa00001a0 PowerRelayState + .scommon 0xa00001a4 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + 0xa00001a4 mBatteryCurrent + 0xa00001a8 mVoltageMeanSum + 0xa00001ac mVoltageMeanCount + 0xa00001b0 mBatterySOC + 0xa00001b4 mCurrentMeanCount + 0xa00001b8 mCurrentMeanSum + 0xa00001bc mBatteryVoltage + 0xa00001c0 mCurrentModuleOK + .scommon 0xa00001c4 0x8 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + 0xa00001c4 mLastTransactionOK + 0xa00001c8 mI2CWaitCounter + .scommon 0xa00001cc 0x8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0xa00001cc mSPIFlashHighSpeedBaudrate + 0xa00001cd mSPIFlashBaudrate + 0xa00001d0 mSPIFlashOK + .scommon 0xa00001d4 0x4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0xa00001d4 mSyslogBufPtr + .scommon 0xa00001d8 0x38 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0xa00001d8 CurDataChunkSize + 0xa00001dc BootloaderFirmwareChunkWriteCount + 0xa00001e0 BootloaderFlashWriteDataPtr + 0xa00001e4 BootloaderFlashErased + 0xa00001e8 BootloaderFlashWriteState + 0xa00001ec BootloaderCurFlashWriteAddress + 0xa00001f0 BooloaderFlashEraseState + 0xa00001f4 BootloaderCurFlashEraseAddress + 0xa00001f8 BootloaderFlashWritePollCount + 0xa00001fc BootloaderInterfaceState + 0xa0000200 DataChunkWritten + 0xa0000204 BooloaderFlashErasePollCount + 0xa0000208 FirmwareUploaded + 0xa000020c CurDataChunkIndex + .scommon 0xa0000210 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .scommon 0xa0000210 0x2 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + 0xa0000210 mDeviceID + *fill* 0xa0000212 0x2 + .scommon 0xa0000214 0x4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0xa0000214 BootloaderRxPtr + .scommon 0xa0000218 0x4 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + 0xa0000218 mLoraSMState + 0xa000021c _sbss_end = . + 0xa000021c . = ALIGN (0x4) + +.bss 0xa000021c 0x2e90 + *(.dynbss) + *(COMMON) + COMMON 0xa000021c 0x24 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + 0xa000021c gstrHifCxt + COMMON 0xa0000240 0xc0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0xa0000240 gastrSockets + COMMON 0xa0000300 0x40 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0xa0000300 astInternalUartData + COMMON 0xa0000340 0x26e build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0xa0000340 mRxData + 0xa0000478 mTxData + *fill* 0xa00005ae 0x2 + COMMON 0xa00005b0 0x398 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0xa00005b0 mStoredBootloaderInfo + 0xa00005c4 TerminalWorkString + 0xa00006f0 TerminalPrevDataBuf + 0xa000081c TerminalDataBuf + COMMON 0xa0000948 0x620 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + 0xa0000948 astUartData + COMMON 0xa0000f68 0x108 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0xa0000f68 astTimer + COMMON 0xa0001070 0xd04 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0xa0001070 NetworkRxBuf + 0xa0001470 TerminalRxBuf + 0xa0001870 BootloaderRxBuf + 0xa0001c70 addr_in + 0xa0001c80 param + 0xa0001c98 mModuleIPConfig + 0xa0001cac SyslogRxBuf + COMMON 0xa0001d74 0x16 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + 0xa0001d74 I2CSlaveBuffer + 0xa0001d80 I2CMasterBuffer + *fill* 0xa0001d8a 0x2 + COMMON 0xa0001d8c 0x1000 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0xa0001d8c mFlashSectorBuffer + COMMON 0xa0002d8c 0x1f4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0xa0002d8c mSyslogBuffer + COMMON 0xa0002f80 0x12c build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0xa0002f80 BootloaderBuffer + 0xa00030ac . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa00030ac . = ALIGN (0x4) + 0xa00030ac _end = . + 0xa00030ac _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa00030ac 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .mdebug.abi32 0xa00030ac 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa00030ac 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x260 + *(.comment) + .comment 0x00000000 0x3c build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .comment 0x00000000 0x3d build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x000000a8 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000c1 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000da 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000128 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x00000177 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001c2 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0xa98 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_aranges + 0x00000440 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_aranges + 0x00000460 0x20 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_aranges + 0x00000480 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_aranges + 0x000004a0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_aranges + 0x000004c0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_aranges + 0x000004e0 0x20 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_aranges + 0x00000500 0x20 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_aranges + 0x00000520 0x20 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_aranges + 0x00000540 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000560 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x000005a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000005c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000005e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x00000608 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000688 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_aranges + 0x000006a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x000006c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x000006e8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x00000710 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000738 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000758 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_aranges + 0x00000778 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000798 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x000007b8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000007d8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x00000800 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_aranges + 0x00000828 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000858 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000878 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000898 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x000008b8 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000958 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000978 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000998 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000009d8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000009f8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x00000a18 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000a38 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000a58 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000a78 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_pubnames + 0x00000000 0x3562 + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x20 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubnames + 0x00000020 0x4c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_pubnames + 0x0000006c 0x72 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_pubnames + 0x000000de 0x119 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_pubnames + 0x000001f7 0x7f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_pubnames + 0x00000276 0x95 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_pubnames + 0x0000030b 0x137 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000442 0x83d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000c7f 0x1f1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_pubnames + 0x00000e70 0xe8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_pubnames + 0x00000f58 0xee build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_pubnames + 0x00001046 0xe2 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_pubnames + 0x00001128 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_pubnames + 0x00001148 0x20 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_pubnames + 0x00001168 0x1ef build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_pubnames + 0x00001357 0x64 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_pubnames + 0x000013bb 0x24 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_pubnames + 0x000013df 0x125 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_pubnames + 0x00001504 0x194 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_pubnames + 0x00001698 0x17d build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_pubnames + 0x00001815 0x101 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_pubnames + 0x00001916 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_pubnames + 0x000019ee 0x31 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_pubnames + 0x00001a1f 0x38 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_pubnames + 0x00001a57 0xec build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_pubnames + 0x00001b43 0x348 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_pubnames + 0x00001e8b 0x25 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_pubnames + 0x00001eb0 0xb0 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001f60 0xca build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_pubnames + 0x0000202a 0x41 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_pubnames + 0x0000206b 0x154 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_pubnames + 0x000021bf 0x1af build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_pubnames + 0x0000236e 0x92 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_pubnames + 0x00002400 0x1b0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_pubnames + 0x000025b0 0x92 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_pubnames + 0x00002642 0x71 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_pubnames + 0x000026b3 0x3db build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_pubnames + 0x00002a8e 0x7d build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_pubnames + 0x00002b0b 0x5c build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_pubnames + 0x00002b67 0x34e build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_pubnames + 0x00002eb5 0x2f build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_pubnames + 0x00002ee4 0x7f build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_pubnames + 0x00002f63 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002f83 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x00002fbe 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x00002fe7 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00003011 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x0000303c 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x00003067 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_pubnames + 0x0000308b 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x000030be 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x000030de 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x00003102 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_pubnames + 0x0000311e 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x00003146 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00003163 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x00003188 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x000031b1 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x000031cf 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_pubnames + 0x000031f9 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00003223 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x00003243 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x0000325f 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x0000328b 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_pubnames + 0x000032b7 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x000032d8 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x000032f6 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x00003312 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x0000332d 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x0000340e 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x0000342b 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x00003449 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x000034a5 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x000034c0 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x000034dc 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x000034fe 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x00003522 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x00003542 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_info 0x00000000 0x51dd1 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x3609 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_info 0x00003609 0x181e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_info 0x00004e27 0x1c5a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_info 0x00006a81 0x274e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_info 0x000091cf 0x175d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_info 0x0000a92c 0x149f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_info 0x0000bdcb 0x1d97 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_info 0x0000db62 0x624e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_info 0x00013db0 0x1a98 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_info 0x00015848 0x15b0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_info 0x00016df8 0x1725 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_info 0x0001851d 0x1bc7 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_info 0x0001a0e4 0x1209 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_info 0x0001b2ed 0x1278 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_info 0x0001c565 0x3387 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_info 0x0001f8ec 0x19af build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_info 0x0002129b 0x115f build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_info 0x000223fa 0x3c2f build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_info 0x00026029 0x1aa8 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_info 0x00027ad1 0x1a0b build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_info 0x000294dc 0x1b0b build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_info 0x0002afe7 0x14ff build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_info 0x0002c4e6 0x127f build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_info 0x0002d765 0x1143 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_info 0x0002e8a8 0x1a3d build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_info 0x000302e5 0x113f build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_info 0x00031424 0x1141 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_info 0x00032565 0x2169 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_info 0x000346ce 0x33d0 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_info 0x00037a9e 0x131e build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_info 0x00038dbc 0x20eb build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_info 0x0003aea7 0x17ab build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_info 0x0003c652 0x12f9 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_info 0x0003d94b 0x1a78 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_info 0x0003f3c3 0x15ab build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_info 0x0004096e 0x16fb build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_info 0x00042069 0x1863 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_info 0x000438cc 0x15a4 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_info 0x00044e70 0x132c build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_info 0x0004619c 0x2e41 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_info 0x00048fdd 0x1326 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_info 0x0004a303 0x14d0 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_info 0x0004b7d3 0x2121 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_info 0x0004d8f4 0x2d4 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_info 0x0004dbc8 0x1577 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_info 0x0004f13f 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0004f1ed 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x0004f2a8 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x0004f356 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x0004f406 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x0004f4b8 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x0004f56a 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_info 0x0004f68f 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x0004f771 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x0004f82d 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x0004f8f1 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_info 0x0004f99e 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x0004fa74 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x0004fa74 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x0004fb29 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x0004fbee 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0004fcb9 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x0004fd70 0xc2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_info 0x0004fe32 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x0004fef5 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0004ffad 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x00050060 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0005013a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0005013a 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_info 0x0005021f 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x000502ff 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x000503b5 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x00050468 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x00050519 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x00050519 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x00050732 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x00050732 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x000507e7 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x0005089d 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x000509b2 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x00050a5d 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x00050b0a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x00050b0a 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x00050bd5 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x00050e97 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x00051619 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_abbrev 0x00000000 0x69eb + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1f2 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_abbrev 0x000001f2 0x1e9 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_abbrev 0x000003db 0x27f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_abbrev 0x0000065a 0x2f1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_abbrev 0x0000094b 0x1f9 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_abbrev 0x00000b44 0x1ed build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_abbrev 0x00000d31 0x2d4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_abbrev 0x00001005 0x2d5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_abbrev 0x000012da 0x29b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_abbrev 0x00001575 0x225 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_abbrev 0x0000179a 0x238 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_abbrev 0x000019d2 0x2d7 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_abbrev 0x00001ca9 0x19d build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_abbrev 0x00001e46 0x1b1 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_abbrev 0x00001ff7 0x334 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_abbrev 0x0000232b 0x260 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_abbrev 0x0000258b 0x17b build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_abbrev 0x00002706 0x2bb build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_abbrev 0x000029c1 0x268 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_abbrev 0x00002c29 0x290 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_abbrev 0x00002eb9 0x2dd build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_abbrev 0x00003196 0x223 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_abbrev 0x000033b9 0x1a2 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_abbrev 0x0000355b 0x166 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_abbrev 0x000036c1 0x329 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_abbrev 0x000039ea 0x166 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_abbrev 0x00003b50 0x166 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_abbrev 0x00003cb6 0x217 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_abbrev 0x00003ecd 0x35f build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_abbrev 0x0000422c 0x18e build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_abbrev 0x000043ba 0x2d4 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_abbrev 0x0000468e 0x1c4 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_abbrev 0x00004852 0x18e build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_abbrev 0x000049e0 0x1fa build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_abbrev 0x00004bda 0x24d build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_abbrev 0x00004e27 0x1da build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_abbrev 0x00005001 0x298 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_abbrev 0x00005299 0x20d build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_abbrev 0x000054a6 0x18c build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_abbrev 0x00005632 0x2d1 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_abbrev 0x00005903 0x1b5 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_abbrev 0x00005ab8 0x1b2 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_abbrev 0x00005c6a 0x28f build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_abbrev 0x00005ef9 0x9a build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_abbrev 0x00005f93 0x1f4 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_abbrev 0x00006187 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x000061b9 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x000061dc 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000061ff 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x00006222 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x00006245 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x00006268 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_abbrev 0x000062c7 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x000062ec 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x00006311 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x00006336 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_abbrev 0x0000635b 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x00006380 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x00006381 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x000063a6 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x000063cb 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x000063f0 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x00006415 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_abbrev 0x0000643a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x0000645f 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x00006484 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x000064a9 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x000064f2 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x000064f3 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_abbrev 0x00006536 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x0000656c 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x00006591 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x000065b6 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x000065db 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x000065dc 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x00006601 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00006602 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00006627 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x0000664c 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x00006684 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x000066a9 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x000066ce 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x000066cf 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x00006701 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x0000677a 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x000068ac 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_line 0x00000000 0x8b66 + *(.debug_line) + .debug_line 0x00000000 0x215 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_line 0x00000215 0x200 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_line 0x00000415 0x336 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_line 0x0000074b 0x415 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_line 0x00000b60 0x287 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_line 0x00000de7 0x275 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_line 0x0000105c 0x381 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_line 0x000013dd 0x81c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_line 0x00001bf9 0x44b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_line 0x00002044 0x231 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_line 0x00002275 0x301 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_line 0x00002576 0x3f5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_line 0x0000296b 0x1f6 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_line 0x00002b61 0x25e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_line 0x00002dbf 0x63f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_line 0x000033fe 0x36c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_line 0x0000376a 0x15a build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_line 0x000038c4 0x2cc build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_line 0x00003b90 0x266 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_line 0x00003df6 0x383 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_line 0x00004179 0x2fa build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_line 0x00004473 0x25f build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_line 0x000046d2 0x165 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_line 0x00004837 0x101 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_line 0x00004938 0x335 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_line 0x00004c6d 0x101 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_line 0x00004d6e 0x101 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_line 0x00004e6f 0x233 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_line 0x000050a2 0x502 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_line 0x000055a4 0x159 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_line 0x000056fd 0x26d build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_line 0x0000596a 0x1b1 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_line 0x00005b1b 0x165 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_line 0x00005c80 0x294 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_line 0x00005f14 0x242 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_line 0x00006156 0x1ed build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_line 0x00006343 0x2a4 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_line 0x000065e7 0x255 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_line 0x0000683c 0x169 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_line 0x000069a5 0x4c1 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_line 0x00006e66 0x197 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_line 0x00006ffd 0x1a0 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_line 0x0000719d 0x388 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_line 0x00007525 0x13b build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_line 0x00007660 0x1c3 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_line 0x00007823 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x000078d4 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00007936 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x000079a7 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00007a19 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x00007a8c 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x00007aff 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_line 0x00007b8d 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x00007c24 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x00007ca8 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x00007d30 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_line 0x00007da9 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x00007e3f 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x00007e3f 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x00007eaf 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x00007f1d 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x00007f8d 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x00007ffe 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_line 0x0000806e 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x000080df 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x0000814f 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x000081be 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x0000822b 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x0000822b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_line 0x0000829b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x0000830b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x0000837b 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x000083ea 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00008458 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00008458 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x000084c8 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x000084c8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x00008538 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x000085a8 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x00008620 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00008698 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00008711 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00008711 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x000087a4 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x000088a9 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x00008a11 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_frame 0x00000000 0x3ac0 + *(.debug_frame) + .debug_frame 0x00000000 0x2c build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_frame 0x0000002c 0xa0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_frame 0x000000cc 0x148 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_frame 0x00000214 0x1ec build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_frame 0x00000400 0xb8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_frame 0x000004b8 0xd4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_frame 0x0000058c 0x144 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_frame 0x000006d0 0x8d0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_frame 0x00000fa0 0x294 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_frame 0x00001234 0x17c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_frame 0x000013b0 0x128 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_frame 0x000014d8 0x298 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_frame 0x00001770 0x2c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_frame 0x0000179c 0x2c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_frame 0x000017c8 0x320 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_frame 0x00001ae8 0x17c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_frame 0x00001c64 0x2c build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_frame 0x00001c90 0x138 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_frame 0x00001dc8 0x130 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_frame 0x00001ef8 0xf4 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_frame 0x00001fec 0x128 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_frame 0x00002114 0x10c build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_frame 0x00002220 0x2c build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_frame 0x0000224c 0x64 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_frame 0x000022b0 0x148 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_frame 0x000023f8 0x2b4 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_frame 0x000026ac 0x2c build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_frame 0x000026d8 0x80 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_frame 0x00002758 0xb8 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_frame 0x00002810 0x48 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_frame 0x00002858 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_frame 0x00002930 0x198 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_frame 0x00002ac8 0x9c build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_frame 0x00002b64 0x17c build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_frame 0x00002ce0 0xa0 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_frame 0x00002d80 0x80 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_frame 0x00002e00 0x1d0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_frame 0x00002fd0 0x80 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_frame 0x00003050 0x64 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_frame 0x000030b4 0x1b4 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_frame 0x00003268 0x64 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_frame 0x000032cc 0x80 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_frame 0x0000334c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x00003374 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x000033a4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x000033c4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x000033e4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x00003404 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x00003424 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_frame 0x0000344c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x00003474 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x00003494 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x000034b4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_frame 0x000034d4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x000034f4 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00003520 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x00003568 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x000035a0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x000035c0 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_frame 0x000035e8 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x00003614 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x0000363c 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x00003668 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x000036a0 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_frame 0x000036f8 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x0000376c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00003794 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x000037c4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x000037e4 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x00003904 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x00003924 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x00003954 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x000039e0 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x00003a0c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x00003a34 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x00003a54 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00003a80 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00003aa0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_str 0x00000000 0x44fd + *(.debug_str) + .debug_str 0x00000000 0x22f build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_str 0x0000022f 0x141 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_str 0x00000370 0x1ba build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_str 0x0000052a 0x158 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_str 0x00000682 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_str 0x000007b1 0x139 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_str 0x000008ea 0x166 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_str 0x00000a50 0x406 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_str 0x00000e56 0x15c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_str 0x00000fb2 0x160 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_str 0x00001112 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_str 0x00001241 0x17f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_str 0x000013c0 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_str 0x000014ef 0x12f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_str 0x0000161e 0x2e5 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_str 0x00001903 0x18a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_str 0x00001a8d 0x12f build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_str 0x00001bbc 0x21e build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_str 0x00001dda 0x14f build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_str 0x00001f29 0x1ac build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_str 0x000020d5 0x18a build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_str 0x0000225f 0x145 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_str 0x000023a4 0x12f build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_str 0x000024d3 0x12f build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_str 0x00002602 0x14d build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_str 0x0000274f 0x12f build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_str 0x0000287e 0x12f build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_str 0x000029ad 0x17f build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_str 0x00002b2c 0x289 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_str 0x00002db5 0x146 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_str 0x00002efb 0x1a4 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_str 0x0000309f 0x15b build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_str 0x000031fa 0x138 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_str 0x00003332 0x1d9 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_str 0x0000350b 0x18b build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_str 0x00003696 0x17e build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_str 0x00003814 0x19f build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_str 0x000039b3 0x14b build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_str 0x00003afe 0x15e build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_str 0x00003c5c 0x2cb build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_str 0x00003f27 0x13a build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_str 0x00004061 0x159 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_str 0x000041ba 0x1fe build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_str 0x000043b8 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_str 0x000043b8 0x145 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x000044fd 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_loc 0x00000000 0x1489 + *(.debug_loc) + .debug_loc 0x00000000 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_loc 0x00000068 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x00000131 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x00000af4 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x43f7 + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x253 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .debug_pubtypes + 0x00000253 0x133 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .debug_pubtypes + 0x00000386 0x164 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .debug_pubtypes + 0x000004ea 0x155 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .debug_pubtypes + 0x0000063f 0x15e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .debug_pubtypes + 0x0000079d 0x128 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .debug_pubtypes + 0x000008c5 0x216 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .debug_pubtypes + 0x00000adb 0x756 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00001231 0x120 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .debug_pubtypes + 0x00001351 0x13a build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .debug_pubtypes + 0x0000148b 0x14e build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .debug_pubtypes + 0x000015d9 0x13f build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .debug_pubtypes + 0x00001718 0x113 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .debug_pubtypes + 0x0000182b 0x11b build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .debug_pubtypes + 0x00001946 0x3c3 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .debug_pubtypes + 0x00001d09 0x120 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00001e29 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .debug_pubtypes + 0x00001f10 0x1f8 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .debug_pubtypes + 0x00002108 0x136 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .debug_pubtypes + 0x0000223e 0x1af build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .debug_pubtypes + 0x000023ed 0x166 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .debug_pubtypes + 0x00002553 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .debug_pubtypes + 0x0000263a 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .debug_pubtypes + 0x00002721 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .debug_pubtypes + 0x00002808 0x15b build/ChaletDuinoV2_795F512H_/production/Source/main.o + .debug_pubtypes + 0x00002963 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .debug_pubtypes + 0x00002a4a 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .debug_pubtypes + 0x00002b31 0x145 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .debug_pubtypes + 0x00002c76 0x2f4 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .debug_pubtypes + 0x00002f6a 0xfc build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .debug_pubtypes + 0x00003066 0x17e build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x000031e4 0x136 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x0000331a 0xf8 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .debug_pubtypes + 0x00003412 0x160 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .debug_pubtypes + 0x00003572 0x121 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .debug_pubtypes + 0x00003693 0x110 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .debug_pubtypes + 0x000037a3 0xf8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .debug_pubtypes + 0x0000389b 0x139 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .debug_pubtypes + 0x000039d4 0xf8 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .debug_pubtypes + 0x00003acc 0x344 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .debug_pubtypes + 0x00003e10 0xe7 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .debug_pubtypes + 0x00003ef7 0x10d build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .debug_pubtypes + 0x00004004 0x183 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .debug_pubtypes + 0x00004187 0x2c build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .debug_pubtypes + 0x000041b3 0x11e build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .debug_pubtypes + 0x000042d1 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_pubtypes + 0x00004305 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x00004345 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x0000439e 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.debug_ranges 0x00000000 0x270 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000050 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000060 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x00000090 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x000000e0 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x000000f8 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .debug_ranges 0x00000110 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000130 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000140 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000150 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000160 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x000001f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x00000200 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000210 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000240 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000250 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000260 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuinoV2_795F512H_/production/Source/system.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/template.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + .gnu.attributes + 0x00000290 0x10 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .gnu.attributes + 0x000002a0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + .gnu.attributes + 0x000002b0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + .gnu.attributes + 0x000002c0 0x10 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + .gnu.attributes + 0x000002d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x000002e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x000002f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x00000300 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x00000520 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x00000530 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x00000540 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x00000550 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa00042e0 0x400 + .stack 0xa00042e0 0x400 stack + +.data 0xa00030ac 0x4bc + .data 0xa00030ac 0x4bc build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.bss 0xa0003568 0x800 + .bss 0xa0003568 0x400 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .bss 0xa0003968 0x400 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + +.data 0xa0003d68 0x2c4 + .data 0xa0003d68 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003d68 _iob + .data 0xa0003e08 0x6c build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + .data 0xa0003e74 0x58 build/ChaletDuinoV2_795F512H_/production/Source/main.o + .data 0xa0003ecc 0x58 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .data 0xa0003f24 0x58 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .data 0xa0003f7c 0x58 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + .data 0xa0003fd4 0x58 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.bss 0xa000402c 0x40 + .bss 0xa000402c 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000402c _sibuf + 0xa000404c _sobuf + +.data 0xa000406c 0x1c + .data 0xa000406c 0x1c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + +.bss 0xa0004088 0x38 + .bss 0xa0004088 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa00040a4 0x14 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + .bss 0xa00040b8 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa00040bc 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z21 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z22 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z23 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z24 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z38 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z39 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z40 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z41 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z43 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z44 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z60 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z61 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z62 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z63 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z64 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z65 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z66 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z67 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z68 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z69 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z70 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z71 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z72 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z73 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z74 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z75 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z76 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z77 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z78 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z79 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z80 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z81 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z82 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z83 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z84 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z85 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z86 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z87 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z88 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z89 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z90 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z91 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z92 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z93 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z94 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z95 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z96 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z97 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z98 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z99 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z100 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z101 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z102 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z103 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z104 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z105 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z106 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z107 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z108 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z109 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z110 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z111 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z112 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z113 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z114 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z115 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z116 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z117 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z118 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z119 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z120 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z121 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z122 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z123 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z124 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z125 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z126 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z127 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z128 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z129 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z130 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z131 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z132 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z133 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z134 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z135 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z136 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z137 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z138 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z139 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z140 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z141 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z142 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z143 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z144 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z145 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z146 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z147 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z148 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z149 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z150 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z151 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z152 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z153 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z154 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z155 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z156 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z157 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z158 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z159 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z160 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z161 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z162 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z163 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z164 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z165 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z166 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z167 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z168 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z169 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z170 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z171 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z172 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z173 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z174 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z175 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z176 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z177 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z178 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z179 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z180 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z181 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z182 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z183 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z184 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z185 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z186 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z187 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z188 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z189 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z190 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z191 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z192 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.data%z193 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.bss%z194 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z195 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z196 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z197 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z198 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z199 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z200 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z201 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z202 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z203 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z204 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z205 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z206 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z207 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z208 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z209 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z210 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + +.data%z211 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + +.bss%z212 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z213 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z214 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z215 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z216 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z217 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.bss%z218 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z219 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z220 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z221 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z222 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z223 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z224 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z225 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z226 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z227 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z228 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z229 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z230 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z231 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z232 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + +.data%z233 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.bss%z236 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + +.data%z237 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + +.data%z239 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + +.bss%z240 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + +.bss%z241 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.data%z242 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.bss%z243 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + +.bss%z244 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.data%z245 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + +.bss%z251 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + +.data%z252 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + +.bss%z253 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + +.data%z254 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + +.bss%z255 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + +.data%z256 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + +.bss%z257 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + +.data%z258 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + +.bss%z259 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + +.data%z260 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.data%z262 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.bss%z263 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.data%z264 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.bss%z265 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.bss%z266 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.data%z267 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.bss%z268 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + +.data%z269 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.bss%z275 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + +.data%z276 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + +.bss%z277 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + +.data%z278 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + +.bss%z279 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + +.data%z280 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + +.bss%z281 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + +.data%z282 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + +.bss%z283 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + +.data%z284 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + +.bss%z285 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + +.data%z286 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + +.bss%z287 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + +.data%z288 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + +.bss%z289 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.data%z290 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.bss%z291 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + +.data%z292 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + +.bss%z293 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + +.data%z294 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + +.bss%z295 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + +.data%z296 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + +.bss%z305 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.data%z306 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.bss%z307 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + +.data%z308 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + +.bss%z309 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + +.data%z310 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + +.bss%z311 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.data%z312 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.bss%z313 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z314 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +._debug_exception + 0xbfc00480 0x2c + ._debug_exception + 0xbfc00480 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + 0xbfc00480 __DbgExecReturn + +.text 0x9d005800 0xe274 + .text 0x9d005800 0x4174 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_wifi.o + 0x9d006008 m2m_wifi_download_mode + 0x9d006334 m2m_wifi_ble_set_gain_table + 0x9d0063a8 m2m_wifi_init_hold + 0x9d0063e8 m2m_wifi_init_start + 0x9d00657c m2m_wifi_init + 0x9d0065d8 m2m_wifi_deinit + 0x9d006620 m2m_wifi_reinit_hold + 0x9d00665c m2m_wifi_reinit_start + 0x9d006694 m2m_wifi_reinit + 0x9d0066f4 m2m_wifi_get_state + 0x9d006778 m2m_wifi_handle_events + 0x9d0067cc m2m_wifi_delete_sc + 0x9d006848 m2m_wifi_default_connect + 0x9d006bd0 m2m_wifi_connect_open + 0x9d006cc8 m2m_wifi_connect_wep + 0x9d006edc m2m_wifi_connect_psk + 0x9d007154 m2m_wifi_1x_set_option + 0x9d007430 m2m_wifi_1x_get_option + 0x9d007648 m2m_wifi_connect_1x_mschap2 + 0x9d00792c m2m_wifi_connect_1x_tls + 0x9d007d4c m2m_wifi_connect + 0x9d007dc0 m2m_wifi_connect_sc + 0x9d008000 m2m_wifi_disconnect + 0x9d00804c m2m_wifi_set_mac_address + 0x9d0080b8 m2m_wifi_set_static_ip + 0x9d00814c m2m_wifi_enable_dhcp + 0x9d0081c4 m2m_wifi_set_lsn_int + 0x9d008218 m2m_wifi_set_cust_InfoElement + 0x9d008278 m2m_wifi_set_scan_options + 0x9d0082f0 m2m_wifi_set_stop_scan_on_first + 0x9d008384 m2m_wifi_set_scan_region + 0x9d0083f4 m2m_wifi_request_scan + 0x9d00849c m2m_wifi_request_scan_passive + 0x9d008544 m2m_wifi_request_scan_ssid_list + 0x9d0086a0 m2m_wifi_wps + 0x9d008728 m2m_wifi_wps_disable + 0x9d008780 m2m_wifi_p2p + 0x9d00882c m2m_wifi_p2p_disconnect + 0x9d008884 m2m_wifi_enable_ap + 0x9d00891c m2m_wifi_enable_ap_ext + 0x9d0089d0 m2m_wifi_disable_ap + 0x9d008a28 m2m_wifi_req_curr_rssi + 0x9d008a80 m2m_wifi_req_restrict_ble + 0x9d008ad8 m2m_wifi_req_unrestrict_ble + 0x9d008b30 m2m_wifi_send_ethernet_pkt + 0x9d008bd0 m2m_wifi_get_otp_mac_address + 0x9d008c3c m2m_wifi_get_mac_address + 0x9d008ca0 m2m_wifi_req_scan_result + 0x9d008d0c m2m_wifi_get_num_ap_found + 0x9d008d34 m2m_wifi_get_sleep_mode + 0x9d008d64 m2m_wifi_set_sleep_mode + 0x9d008df0 m2m_wifi_request_sleep + 0x9d008e74 m2m_wifi_set_device_name + 0x9d008f10 m2m_wifi_configure_sntp + 0x9d008fc0 m2m_wifi_get_chipId + 0x9d008ff0 m2m_wifi_get_firmware_version + 0x9d009054 m2m_wifi_check_ota_rb + 0x9d0090c0 m2m_ota_get_firmware_version + 0x9d009124 m2m_wifi_start_provision_mode + 0x9d0091d4 m2m_wifi_start_provision_mode_ext + 0x9d009320 m2m_wifi_stop_provision_mode + 0x9d00936c m2m_wifi_get_connection_info + 0x9d0093b8 m2m_wifi_set_system_time + 0x9d00940c m2m_wifi_get_system_time + 0x9d009458 m2m_wifi_enable_sntp + 0x9d0094d0 m2m_wifi_set_power_profile + 0x9d00953c m2m_wifi_set_tx_power + 0x9d0095a8 m2m_wifi_enable_firmware_logs + 0x9d009614 m2m_wifi_set_battery_voltage + 0x9d009684 m2m_wifi_prng_get_random_bytes + 0x9d009724 m2m_wifi_enable_mac_mcast + 0x9d0097bc m2m_wifi_set_receive_buffer + 0x9d00981c m2m_wifi_enable_roaming + 0x9d0098ac m2m_wifi_disable_roaming + 0x9d009900 m2m_wifi_ble_api_send + .text 0x9d009974 0x2908 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/socket.o + 0x9d00a3f0 socketInit + 0x9d00a460 socketDeinit + 0x9d00a4bc registerSocketCallback + 0x9d00a4f4 registerSocketEventCallback + 0x9d00a520 registerSocketResolveCallback + 0x9d00a54c socket + 0x9d00a88c bind + 0x9d00a9c8 listen + 0x9d00aac0 accept + 0x9d00ab44 connect + 0x9d00acc8 secure + 0x9d00ae90 send + 0x9d00b06c sendto + 0x9d00b234 recv + 0x9d00b454 shutdown + 0x9d00b5a4 recvfrom + 0x9d00b7a4 gethostbyname + 0x9d00bc34 setsockopt + 0x9d00bdfc getsockopt + 0x9d00be38 m2m_ping_req + 0x9d00bef4 set_alpn_list + 0x9d00c0ac get_alpn_index + 0x9d00c174 IsSocketReady + 0x9d00c19c get_error_detail + .text 0x9d00c27c 0x1ad8 build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + 0x9d00c27c InitUart + 0x9d00c52c UartResetPort + 0x9d00c7e0 UartOpenComPort + 0x9d00c9d0 UartReceiveData + 0x9d00cb1c UartGetPendingDataSize + 0x9d00cc14 UartTransmitData + 0x9d00d358 DataSentNotification + 0x9d00d640 UartTick + 0x9d00dc60 UartBlockAndTick + 0x9d00dcc0 UartBlockUntillBufEmpty + .text 0x9d00dd54 0x19e8 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + 0x9d00e86c InitWiFi + 0x9d00ecf0 TurnOFFWiFi + 0x9d00ed84 CloseSockets + 0x9d00ee70 GetWiFiSate + 0x9d00ee94 TickWiFi + 0x9d00ef74 OpenTerminalServer + 0x9d00f030 SendTerminalData + 0x9d00f0b8 SentTerminalByte + 0x9d00f134 OpenNetworkServer + 0x9d00f1f0 SendNetworkData + 0x9d00f278 SentNetworkByte + 0x9d00f2f4 OpenSyslogServer + 0x9d00f3b0 SendSyslogData + 0x9d00f428 SendSyslogByte + 0x9d00f4a4 IsSyslogClientConnected + 0x9d00f4e4 OpenBootloaderServer + 0x9d00f5a0 CloseBootloaderServer + 0x9d00f608 SendBootloaderData + 0x9d00f680 SendSBootloaderByte + 0x9d00f6fc IsBootloaderClientConnected + .text 0x9d00f73c 0x1808 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + 0x9d00f73c BootloaderInterfaceInit + 0x9d00f790 BootloaderInterfaceTick + 0x9d00f7c8 BootloaderExecuteCmd + 0x9d00fa6c BootloaderCRCError + 0x9d00fad4 BootloaderInterfaceStateMachine + 0x9d0104e8 BootloaderResetStateMachine + 0x9d010544 BootloaderActivateBootloader + 0x9d010584 BootloaderDeactivateBootloader + 0x9d0105b4 BootloaderFlashEraseStateMachine + 0x9d0107e8 ResetBootloaderFlashEraseStateMachine + 0x9d01081c BootloaderFlashWriteStateMachine + 0x9d010a48 BootloaderPrintFlashData + 0x9d010a68 BootloaderCheckFlashBootloaderData + 0x9d010d8c ResetBootloaderFlashWriteStateMachine + 0x9d010dcc BootloaderBytesToInt + 0x9d010e84 BootloaderIntToBytes + .text 0x9d010f44 0x1678 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmasic.o + 0x9d010f44 chip_apply_conf + 0x9d010ff8 chip_idle + 0x9d01106c enable_rf_blocks + 0x9d01110c enable_interrupts + 0x9d01121c cpu_start + 0x9d0113e8 nmi_get_chipid + 0x9d011600 nmi_get_rfrevid + 0x9d01164c restore_pmu_settings_after_global_reset + 0x9d0116a0 nmi_update_pll + 0x9d011714 nmi_set_sys_clk_src_to_xo + 0x9d011770 chip_sleep + 0x9d0118d8 chip_wake + 0x9d011a98 chip_reset_and_cpu_halt + 0x9d011c2c chip_reset + 0x9d011c8c wait_for_bootrom + 0x9d011e38 wait_for_firmware_start + 0x9d011f58 chip_deinit + 0x9d012074 set_gpio_dir + 0x9d012148 set_gpio_val + 0x9d01221c get_gpio_val + 0x9d0122a8 pullup_ctrl + 0x9d012360 nmi_get_otp_mac_address + 0x9d0124c0 nmi_get_mac_address + .text 0x9d0125bc 0x14b8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + 0x9d013504 nm_spi_reset + 0x9d013558 nm_spi_lock_init + 0x9d013578 nm_spi_init + 0x9d013730 nm_spi_deinit + 0x9d013758 nm_spi_read_reg + 0x9d01379c nm_spi_read_reg_with_ret + 0x9d01382c nm_spi_write_reg + 0x9d0138bc nm_spi_read_block + 0x9d0139b0 nm_spi_write_block + +.text._vfprintf_cdfFnopsuxX + 0x9d013a74 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d013a74 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d013a74 _vfprintf_cdfFnopsuxX + 0x9d013a74 _vfprintf_cdfFnopuxX + 0x9d013a74 _vfprintf_cdnopsuxX + 0x9d013a74 _vfprintf_fF + 0x9d013a74 _vfprintf_cdnopuxX + +.text 0x9d014e48 0x9060 + .text 0x9d014e48 0x1384 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_hif.o + 0x9d014f4c hif_chip_wake + 0x9d015014 hif_set_sleep_mode + 0x9d015048 hif_get_sleep_mode + 0x9d0150d4 hif_chip_sleep + 0x9d015178 hif_init + 0x9d0151d8 hif_deinit + 0x9d015230 hif_check_compatibility + 0x9d0152a8 hif_enable_access + 0x9d0153e0 hif_check_code + 0x9d0154d4 hif_send + 0x9d015ecc hif_handle_isr + 0x9d015f08 hif_receive + 0x9d0160b4 hif_register_cb + .text 0x9d0161cc 0x121c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/spi_flash/source/spi_flash.o + 0x9d016f30 spi_flash_read + 0x9d017008 spi_flash_write + 0x9d0171d4 spi_flash_erase + 0x9d017368 spi_flash_get_size + .text 0x9d0173e8 0xf70 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + 0x9d0173e8 InternalUartInit + 0x9d0175c4 OpenInternalPort + 0x9d0177e4 SendInternalUartData + 0x9d017b38 SendInternalUartDataBlocking + 0x9d017c48 TickInternalUart + 0x9d017c68 InternalUart1AInterrupt + 0x9d017ea4 InternalUart2Interrupt + 0x9d018134 ResetUart1 + 0x9d01823c ResetUart2 + 0x9d018338 process + .text 0x9d018358 0xe68 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + 0x9d018358 InitTerminal + 0x9d0183d8 TickTerminal + 0x9d018434 RxTerminalBuf + 0x9d0184c0 RxTerminalData + 0x9d018610 ParseNewBuffer + 0x9d01910c TerminalPrintString + 0x9d019160 TerminalPrintChar + 0x9d0191a0 TerminalStateMachine + .text 0x9d0191c0 0xdd0 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + 0x9d0191c0 InitSPIFlash + 0x9d019338 SPIFlashCheckAndConfigure + 0x9d019414 SPIFlashIsPresent + 0x9d019438 SPIFlashWriteEnable + 0x9d01949c SPIFlashReadStatusReg + 0x9d019544 SPIFlashCheckBusy + 0x9d0195a0 SPIFlashCheckChipID + 0x9d0196dc SPIFlashReadBuffer + 0x9d01985c SPIFlashEraseSector + 0x9d019984 SPIFlashErase64KSector + 0x9d019ad8 SPIFlashWriteSectorWorkingBuffer + 0x9d019c94 SPIFlashWriteByte + 0x9d019de8 SPIFlashWriteBuffer + .text 0x9d019f90 0xd98 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ssl.o + 0x9d01a29c m2m_ssl_init + 0x9d01a2fc m2m_ssl_handshake_rsp + 0x9d01a374 m2m_ssl_send_certs_to_winc + 0x9d01a6bc m2m_ssl_retrieve_next_for_verifying + 0x9d01aaf0 m2m_ssl_retrieve_cert + 0x9d01ab68 m2m_ssl_retrieve_hash + 0x9d01ac2c m2m_ssl_stop_retrieving + 0x9d01ac6c m2m_ssl_stop_processing_certs + 0x9d01ac9c m2m_ssl_ecc_process_done + 0x9d01acc0 m2m_ssl_set_active_ciphersuites + .text 0x9d01ad28 0xd54 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + 0x9d01ad28 BootloaderProtocolInit + 0x9d01ad58 BootloaderProtocolStateMachine + 0x9d01b2a8 BootloaderProtocolProtocolAnalyzeNewData + 0x9d01b324 BootloaderProtocolResetStateMachine + 0x9d01b378 BootloaderProtocolSendFrame + 0x9d01b544 BootloaderProtocolGetDataBufferPtr + 0x9d01b568 BootloaderProtocolSendHeartbeat + 0x9d01b5b0 BootloaderProtocolSendACK + 0x9d01b604 BootloaderProtocolSendNACK + 0x9d01b654 BootloaderProtocolSendInitUploadResponse + 0x9d01b7b4 BootloaderProtocolSendDataChunkResult + 0x9d01b8a8 BootloaderProtocolSendBootloaderState + 0x9d01b90c BootloaderProtocolSendFirmwareUploadResult + 0x9d01b970 BootloaderProtocolSendFlashCheckResult + 0x9d01b9d4 BootloaderProtocolSendStoredFirmwareInfoResponse + .text 0x9d01ba7c 0xce8 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + 0x9d01ba7c SwapEndianShort + 0x9d01bac8 SwapEndianInt + 0x9d01bb24 ConvertIntToStrLeadingZero + 0x9d01bf48 ConvertIntToStr + 0x9d01c29c ConvertCharToStrLeadingZero + 0x9d01c404 ConvertStrToValue + 0x9d01c5f0 ConvertCharToStr + 0x9d01c6a8 Crc8 + 0x9d01c740 Delay + .text 0x9d01c764 0xbac build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + 0x9d01cea8 m2m_flash_erase_sector + 0x9d01cfe4 m2m_flash_write + 0x9d01d11c m2m_flash_read + 0x9d01d254 m2m_flash_switch_firmware + .text 0x9d01d310 0xb98 build/ChaletDuinoV2_795F512H_/production/Source/timer.o + 0x9d01d310 TimerInit + 0x9d01d3e0 IsMilliSecTimerExpired + 0x9d01d548 IsSecTimerExpired + 0x9d01d6ac IsTimerExpired + 0x9d01da60 TimerStart + 0x9d01db88 TimerStartSeconds + 0x9d01dc2c TimerReset + 0x9d01dcb0 IsTimerRunning + 0x9d01dcf4 TimerStop + 0x9d01dd38 Sleep + 0x9d01dd94 Timer1MilliSecInterrupt + +.dinit 0x9d01dea8 0xb80 + .dinit 0x9d01dea8 0xb80 data_init + +.text 0x9d01ea28 0x1200 + .text 0x9d01ea28 0x974 build/ChaletDuinoV2_795F512H_/production/Source/NetworkProtocol.o + 0x9d01ea28 ProtocolInit + 0x9d01ea58 StateMachine + 0x9d01efd4 ProtocolAnalyzeNewData + 0x9d01f014 ResetStateMachine + 0x9d01f05c ProtocolExecCmd + 0x9d01f098 ProtocolAcknowledge + 0x9d01f0fc ProtocolCalcCrc + 0x9d01f178 ProtocolIsReceiving + 0x9d01f1b8 ProtocolGetFrame + 0x9d01f374 ProtocolMsgDataPtr + .text 0x9d01f39c 0x88c build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + 0x9d01f39c ExecuteMasterCommand + 0x9d01fa90 SendLoraNetworkCommand + 0x9d01fb38 SendLoraNetworkCommandBlocking + 0x9d01fbe0 TestTx + +.text._vfscanf_s + 0x9d01fc28 0x868 + .text._vfscanf_s + 0x9d01fc28 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d01fc28 _vfscanf_s + 0x9d01fc28 _vfscanf_0 + +.rodata 0x9d020490 0x7b8 + .rodata 0x9d020490 0x7b8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderInterface.o + +.text 0x9d020c48 0x28cc + .text 0x9d020c48 0x74c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmdrv.o + 0x9d020c48 nm_get_hif_info + 0x9d020ce8 nm_get_firmware_full_info + 0x9d020e78 nm_get_ota_firmware_info + 0x9d021008 nm_drv_init_download_mode + 0x9d02108c nm_drv_init_hold + 0x9d021108 nm_drv_init_start + 0x9d021258 nm_drv_init + 0x9d0212b4 nm_drv_deinit + 0x9d021338 nm_cpu_start + 0x9d021370 nm_get_state + .text 0x9d021394 0x710 build/ChaletDuinoV2_795F512H_/production/Source/ChaletduinoV2Board.o + 0x9d021394 InitBoard + .text 0x9d021aa4 0x654 build/ChaletDuinoV2_795F512H_/production/Source/ina219.o + 0x9d021cac ina219SetCalibration_13V_10A + 0x9d021d10 ina219SetCalibration_32V_2A + 0x9d021d74 ina219SetCalibration_32V_1A + 0x9d021dd8 ina219SetCalibration_16V_500mA + 0x9d021e3c ina219SetCalibration_16V_200mA + 0x9d021ea0 ina219Init + 0x9d021f20 ina219GetShuntVoltage + 0x9d021f64 ina219GetBusVoltage + 0x9d021fb8 ina219GetPower + 0x9d021ffc ina219GetPower_mW + 0x9d022058 ina219GetCurrent + 0x9d02209c ina219GetCurrent_mA + .text 0x9d0220f8 0x574 build/ChaletDuinoV2_795F512H_/production/Source/I2C.o + 0x9d0220f8 I2CInit + 0x9d022164 I2CWrite + 0x9d022328 I2CTransmitByte + 0x9d022354 I2CRead + 0x9d022648 I2CWasLastTransactionOK + .text 0x9d02266c 0x52c build/ChaletDuinoV2_795F512H_/production/Source/main.o + 0x9d02266c main + 0x9d022b58 _mon_putc + .text 0x9d022b98 0x4e4 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmbus.o + 0x9d022c00 nm_bus_iface_init + 0x9d022c44 nm_bus_iface_deinit + 0x9d022c80 nm_bus_reset + 0x9d022cb0 nm_bus_iface_reconfigure + 0x9d022cdc nm_read_reg + 0x9d022d14 nm_read_reg_with_ret + 0x9d022d54 nm_write_reg + 0x9d022de4 nm_read_block + 0x9d022f58 nm_write_block + .text 0x9d02307c 0x498 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + 0x9d02307c InitBatteryMonitor + 0x9d0230f4 BatteryMonitorTick + 0x9d0233f8 GetBatteryVoltage + 0x9d023460 GetSolarPanelCurrent + 0x9d02348c GetBatterySOC + 0x9d0234b0 SendNetworkBatteryData + 0x9d0234f0 GetCurrentModuleOK + +.rodata 0x9d023514 0x494 + .rodata 0x9d023514 0x494 build/ChaletDuinoV2_795F512H_/production/Source/Terminal.o + +.text 0x9d0239a8 0x8a8 + .text 0x9d0239a8 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d0239a8 __umoddi3 + .text 0x9d023e04 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d023e04 __udivdi3 + +.rodata 0x9d024250 0x404 + .rodata 0x9d024250 0x404 build/ChaletDuinoV2_795F512H_/production/Source/Util.o + 0x9d024254 CRC8_TABLE + +.text 0x9d024654 0xd2c + .text 0x9d024654 0x394 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + 0x9d024654 TC77Configure + 0x9d0248a4 TC77GetActualTemp + 0x9d0249c4 TC77GetDeviceID + .text 0x9d0249e8 0x374 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_periph.o + 0x9d024bec m2m_periph_init + 0x9d024c14 m2m_periph_gpio_set_dir + 0x9d024c6c m2m_periph_gpio_set_val + 0x9d024cc4 m2m_periph_gpio_get_val + 0x9d024d14 m2m_periph_pullup_ctrl + .text 0x9d024d5c 0x33c build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_ota.o + 0x9d024e18 m2m_ota_init + 0x9d024e74 m2m_ota_start_update + 0x9d024ef0 m2m_ota_rollback + 0x9d024f98 m2m_ota_abort + 0x9d024ff0 m2m_ota_switch_firmware + .text 0x9d025098 0x2e8 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/common/source/nm_common.o + 0x9d025098 chip_isr + 0x9d025110 nm_sleep + 0x9d025148 nm_reset + 0x9d025260 hexstr_2_bytes + +.text.scale 0x9d025380 0x2a0 + .text.scale 0x9d025380 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d025620 0x278 + .text.fpsubadd + 0x9d025620 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d025620 __subsf3 + 0x9d025620 fpsub + 0x9d025628 __addsf3 + 0x9d025628 fpadd + +.text 0x9d025898 0x988 + .text 0x9d025898 0x26c build/ChaletDuinoV2_795F512H_/production/Source/crc32.o + 0x9d025898 crc_32 + 0x9d025990 update_crc_32 + .text 0x9d025b04 0x264 build/ChaletDuinoV2_795F512H_/production/Source/LoraWatchdog.o + 0x9d025b04 InitLoraWatchdog + 0x9d025b44 TickLoraWatchdog + 0x9d025b78 LoraWatchdogStateMachine + 0x9d025d34 KickLoraWatchdog + .text 0x9d025d68 0x260 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + 0x9d025d68 InitChaletPowerRelay + 0x9d025dc4 ChaletPowerRelayTick + 0x9d025ec8 ChaletPowerRelayKickTimer + 0x9d025f00 ChaletPowerRelayTurnOn + 0x9d025f50 ChaletPowerRelayTurnOff + 0x9d025fa0 GetChaletPowerRelayState + .text 0x9d025fc8 0x258 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + 0x9d025fc8 InitSyslog + 0x9d02601c SyslogTick + 0x9d0260b8 SyslogNewByte + 0x9d02616c SyslogNewString + 0x9d0261e4 SyslogIsBufferEmpty + +.rodata 0x9d026220 0x254 + .rodata 0x9d026220 0x254 build/ChaletDuinoV2_795F512H_/production/Source/WiFiCtrl.o + +.text 0x9d026474 0x244 + .text 0x9d026474 0x244 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_addr.o + 0x9d026474 inet_addr + +.text.fp32div 0x9d0266b8 0x230 + .text.fp32div 0x9d0266b8 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d0266b8 fpdiv + 0x9d0266b8 __divsf3 + +.text.__floatdisf + 0x9d0268e8 0x220 + .text.__floatdisf + 0x9d0268e8 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d0268e8 __floatdisf + +.text 0x9d026b08 0x1dc + .text 0x9d026b08 0x1dc build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/socket/source/inet_ntop.o + 0x9d026b08 inet_ntop + +.text.fp32mul 0x9d026ce4 0x1bc + .text.fp32mul 0x9d026ce4 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d026ce4 __mulsf3 + 0x9d026ce4 fpmul + +.text 0x9d026ea0 0x1a0 + .text 0x9d026ea0 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d026ea0 strcpy + +.text._sbrk_init + 0x9d027040 0x194 + .text._sbrk_init + 0x9d027040 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d027040 _sbrk_init + +.text._filbuf 0x9d0271d4 0x188 + .text._filbuf 0x9d0271d4 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d0271d4 _filbuf + +.text.read 0x9d02735c 0x174 + .text.read 0x9d02735c 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d02735c read + +.text 0x9d0274d0 0x2d0 + .text 0x9d0274d0 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d0274d0 memcpy + .text 0x9d027638 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d027638 strlen + +.text.fputc 0x9d0277a0 0x15c + .text.fputc 0x9d0277a0 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d0277a0 fputc + +.text._flsbuf 0x9d0278fc 0x12c + .text._flsbuf 0x9d0278fc 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d0278fc _flsbuf + +.text 0x9d027a28 0x11c + .text 0x9d027a28 0x11c build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + 0x9d027a28 InitTempSensor + 0x9d027a6c TempSensorCheckAndConfigure + 0x9d027ac8 TempSensorGetTemp + 0x9d027aec TickTempSensor + +.text.fgetc 0x9d027b44 0x108 + .text.fgetc 0x9d027b44 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d027b44 fgetc + +.rodata 0x9d027c4c 0x204 + .rodata 0x9d027c4c 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d027c4c _ctype + .rodata 0x9d027d50 0x100 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/nmspi.o + +.text.setvbuf 0x9d027e50 0xfc + .text.setvbuf 0x9d027e50 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d027e50 setvbuf + +.rodata 0x9d027f50 0xe0 + .rodata 0x9d027f50 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d028030 0xdc + .text.general_exception + 0x9d028030 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d028030 _general_exception_context + +.text 0x9d02810c 0x1ac + .text 0x9d02810c 0xd8 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + 0x9d02810c InitWatchdog + 0x9d028160 EnableWatchdog + 0x9d02818c DisableWatchdog + 0x9d0281b8 KickWatchdog + .text 0x9d0281e4 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d0281e4 __floatundisf + +.rodata 0x9d0282b8 0xc8 + .rodata 0x9d0282b8 0xc8 build/ChaletDuinoV2_795F512H_/production/Source/SPI_Flash.o + +.text._sbrk 0x9d028380 0xc4 + .text._sbrk 0x9d028380 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d028380 _sbrk + +.text 0x9d028444 0xa8 + .text 0x9d028444 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d028444 memset + +.text.atoi 0x9d0284ec 0xa8 + .text.atoi 0x9d0284ec 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d0284ec atoi + +.text.range 0x9d028594 0xa0 + .text.range 0x9d028594 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d028634 0x9c + .text.fpcmp 0x9d028634 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d028634 __eqsf2 + 0x9d028634 __lesf2 + 0x9d028634 __gtsf2 + 0x9d028634 __nesf2 + 0x9d028634 fpcmp + 0x9d028634 __gesf2 + 0x9d028634 __ltsf2 + +.text 0x9d0286d0 0x98 + .text 0x9d0286d0 0x98 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcmp.o) + 0x9d0286d0 memcmp + +.text.fflush 0x9d028768 0x94 + .text.fflush 0x9d028768 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d028768 fflush + +.text.write 0x9d0287fc 0x94 + .text.write 0x9d0287fc 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d0287fc write + +.text.libm 0x9d028890 0x88 + .text.libm 0x9d028890 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d028890 frexpf + 0x9d028890 fpfrexp + +.text.fptoul 0x9d028918 0x7c + .text.fptoul 0x9d028918 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d028918 fptoul + 0x9d028918 fptoui + 0x9d028918 __fixunssfsi + +.text.SoftReset + 0x9d028994 0x78 + .text.SoftReset + 0x9d028994 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d028994 SoftReset + +.text.fputs 0x9d028a0c 0x78 + .text.fputs 0x9d028a0c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d028a0c fputs + +.text.strncmp 0x9d028a84 0x78 + .text.strncmp 0x9d028a84 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d028a84 strncmp + +.text.ungetc 0x9d028afc 0x74 + .text.ungetc 0x9d028afc 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d028afc ungetc + +.text 0x9d028b70 0xd8 + .text 0x9d028b70 0x70 build/ChaletDuinoV2_795F512H_/production/Source/SPI.o + 0x9d028b70 SPITransaction + .text 0x9d028be0 0x68 build/ChaletDuinoV2_795F512H_/production/Source/HarakiriRelay.o + 0x9d028be0 InitHarakiriRelay + 0x9d028c10 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d028c48 0x68 + .text._sprintf_cdfFnopuxX + 0x9d028c48 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d028c48 _sprintf_cdnopuxX + 0x9d028c48 _sprintf_cdfFnopuxX + +.rodata 0x9d028cb0 0x68 + .rodata 0x9d028cb0 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d028cb0 _powers_f + 0x9d028ce4 _npowers_f + +.text.sitofp 0x9d028d18 0x60 + .text.sitofp 0x9d028d18 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d028d18 sitofp + 0x9d028d18 litofp + 0x9d028d18 __floatsisf + +.text.wspace 0x9d028d78 0x60 + .text.wspace 0x9d028d78 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d028dd8 0x58 + .text 0x9d028dd8 0x58 build/ChaletDuinoV2_795F512H_/production/Source/exceptions.o + 0x9d028dd8 _general_exception_handler + +.text._sscanf_s + 0x9d028e30 0x54 + .text._sscanf_s + 0x9d028e30 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d028e30 _sscanf_s + 0x9d028e30 _sscanf_0 + +.text._bufallo 0x9d028e84 0x54 + .text._bufallo + 0x9d028e84 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d028e84 _bufallo + +.rodata 0x9d028ed8 0x50 + .rodata 0x9d028ed8 0x50 build/ChaletDuinoV2_795F512H_/production/Source/winc3400_142/driver/source/m2m_flash.o + +.text.sbrk 0x9d028f28 0x50 + .text.sbrk 0x9d028f28 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d028f28 sbrk + +.text.main_entry + 0x9d028f78 0x4c + .text.main_entry + 0x9d028f78 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d028fa4 __crt0_exit + +.text 0x9d028fc4 0x4c + .text 0x9d028fc4 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d028fc4 __floatunsisf + +.text._bootstrap_exception_handler + 0x9d029010 0x48 + .text._bootstrap_exception_handler + 0x9d029010 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d029010 _bootstrap_exception_handler + +.text 0x9d029058 0x44 + .text 0x9d029058 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d029058 __pic32_software_reset + +.text.puts 0x9d02909c 0x44 + .text.puts 0x9d02909c 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d02909c puts + +.text._printf_cdfFnopsuxX + 0x9d0290e0 0x40 + .text._printf_cdfFnopsuxX + 0x9d0290e0 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + 0x9d0290e0 _printf_cdnopsuxX + 0x9d0290e0 _printf_cdnopuxX + 0x9d0290e0 _printf_cdfFnopsuxX + 0x9d0290e0 _printf_fF + +.vector_default + 0x9d029120 0x38 + .vector_default + 0x9d029120 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d029120 _DefaultInterrupt + +.rodata 0x9d029158 0x64 + .rodata 0x9d029158 0x34 build/ChaletDuinoV2_795F512H_/production/Source/BatteryMonitor.o + .rodata 0x9d02918c 0x30 build/ChaletDuinoV2_795F512H_/production/Source/main.o + +.text.INTConfigureSystem + 0x9d0291bc 0x30 + .text.INTConfigureSystem + 0x9d0291bc 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d0291bc INTConfigureSystem + +.text._stub_sbd_memlayout + 0x9d0291ec 0x2c + .text._stub_sbd_memlayout + 0x9d0291ec 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d0291ec _sbd_memlayout + 0x9d0291ec _stub_sbd_memlayout + +.rodata 0x9d029218 0x28 + .rodata 0x9d029218 0x28 build/ChaletDuinoV2_795F512H_/production/Source/ChaletPowerRelay.o + +.text.tolower 0x9d029240 0x24 + .text.tolower 0x9d029240 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029240 tolower + +.text.toupper 0x9d029264 0x24 + .text.toupper 0x9d029264 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029264 toupper + +.text 0x9d029288 0x20 + .text 0x9d029288 0x20 build/ChaletDuinoV2_795F512H_/production/Source/DigitalIO.o + 0x9d029288 InitDigitalIO + +.rodata 0x9d0292a8 0x1c + .rodata 0x9d0292a8 0x1c build/ChaletDuinoV2_795F512H_/production/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d0292c4 0x1c + .text.INTRestoreInterrupts + 0x9d0292c4 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d0292c4 INTRestoreInterrupts + +.text.setbuf 0x9d0292e0 0x1c + .text.setbuf 0x9d0292e0 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d0292e0 setbuf + +.rodata 0x9d0292fc 0x30 + .rodata 0x9d0292fc 0x18 build/ChaletDuinoV2_795F512H_/production/Source/InternalUart.o + .rodata 0x9d029314 0x18 build/ChaletDuinoV2_795F512H_/production/Source/Watchdog.o + +.text.CheKseg0CacheOff + 0x9d02932c 0x18 + .text.CheKseg0CacheOff + 0x9d02932c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d02932c CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d029344 0x18 + .text.CheKseg0CacheOn + 0x9d029344 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d029344 CheKseg0CacheOn + +.text 0x9d02935c 0x18 + .text 0x9d02935c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d02935c _nmi_handler + +.text.isalnum 0x9d029374 0x18 + .text.isalnum 0x9d029374 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029374 isalnum + +.text.isalpha 0x9d02938c 0x18 + .text.isalpha 0x9d02938c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02938c isalpha + +.text.iscntrl 0x9d0293a4 0x18 + .text.iscntrl 0x9d0293a4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0293a4 iscntrl + +.text.isdigit 0x9d0293bc 0x18 + .text.isdigit 0x9d0293bc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0293bc isdigit + +.text.isgraph 0x9d0293d4 0x18 + .text.isgraph 0x9d0293d4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0293d4 isgraph + +.text.islower 0x9d0293ec 0x18 + .text.islower 0x9d0293ec 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0293ec islower + +.text.isprint 0x9d029404 0x18 + .text.isprint 0x9d029404 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029404 isprint + +.text.ispunct 0x9d02941c 0x18 + .text.ispunct 0x9d02941c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02941c ispunct + +.text.isspace 0x9d029434 0x18 + .text.isspace 0x9d029434 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029434 isspace + +.text.isupper 0x9d02944c 0x18 + .text.isupper 0x9d02944c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d02944c isupper + +.text.isxdigit 0x9d029464 0x18 + .text.isxdigit + 0x9d029464 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d029464 isxdigit + +.text._buffree 0x9d02947c 0x14 + .text._buffree + 0x9d02947c 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d02947c _buffree + +.rodata 0x9d029490 0x28 + .rodata 0x9d029490 0x10 build/ChaletDuinoV2_795F512H_/production/Source/LoraNetworkInterface.o + .rodata 0x9d0294a0 0x8 build/ChaletDuinoV2_795F512H_/production/Source/Syslog.o + .rodata 0x9d0294a8 0x8 build/ChaletDuinoV2_795F512H_/production/Source/TC77.o + .rodata 0x9d0294b0 0x8 build/ChaletDuinoV2_795F512H_/production/Source/BootloaderProtocol.o + +.text.INTEnableInterrupts + 0x9d0294b8 0x8 + .text.INTEnableInterrupts + 0x9d0294b8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d0294b8 INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d0294c0 0x8 + .text.INTDisableInterrupts + 0x9d0294c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d0294c0 INTDisableInterrupts + +.text._on_reset + 0x9d0294c8 0x8 + .text._on_reset + 0x9d0294c8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d0294c8 _on_reset + +.text._on_bootstrap + 0x9d0294d0 0x8 + .text._on_bootstrap + 0x9d0294d0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d0294d0 _on_bootstrap + +.text.close 0x9d0294d8 0x8 + .text.close 0x9d0294d8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + 0x9d0294d8 close + +.text.isascii 0x9d0294e0 0x8 + .text.isascii 0x9d0294e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0294e0 isascii + +.text.toascii 0x9d0294e8 0x8 + .text.toascii 0x9d0294e8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0294e8 toascii + +.text._tolower 0x9d0294f0 0x8 + .text._tolower + 0x9d0294f0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0294f0 _tolower + +.text._toupper 0x9d0294f8 0x8 + .text._toupper + 0x9d0294f8 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d0294f8 _toupper + +.text.getpagesize + 0x9d029500 0x8 + .text.getpagesize + 0x9d029500 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d029500 getpagesize + +.rodata 0x9d029508 0x8 + .rodata 0x9d029508 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.rodata 0x9d027f4c 0x4 + .rodata 0x9d027f4c 0x4 build/ChaletDuinoV2_795F512H_/production/Source/TemperatureSensor.o + +.text%z315 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z316 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z317 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z318 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z319 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdfFnopsuxX.eo) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(close.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/template.o + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/system.o + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuinoV2_795F512H_/production/Source/interrupts.o + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.elf b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.elf new file mode 100644 index 0000000..681dea5 Binary files /dev/null and b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.elf differ diff --git a/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.hex b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.hex new file mode 100644 index 0000000..527e537 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.hex @@ -0,0 +1,7676 @@ +:020000040000fa +:020000041fc01b +:042ff400d9fff8ff0a +:020000040000fa +:020000041fc01b +:042ff800fbcc67ffa8 +:020000040000fa +:020000041fc01b +:042ffc00ffffff7f55 +:020000040000fa +:020000041fc01b +:100000000200f00f0000000000601a40c0045a7f98 +:100010000500401300000000029d1a3cb4f75a2767 +:10002000080040030000000001a01d3cf0ffbd27b8 +:1000300001a01c3c20809c27026009402058200120 +:10004000801e2a7d8449497d02608940c0000000ed +:1000500000e0dc4102608b40c0000000029d083cd3 +:1000600004f9082509f800010000000000a0083c80 +:100070008400082500a0093cb42b292506000010a7 +:1000800000000000000000ad040000ad080000ad5d +:100090000c0000ad100008252b080901f9ff201401 +:1000a00000000000019d083c446408250000098d03 +:1000b000180020110400082500000a8d04000825fe +:1000c00000000b8d090060110400082500000c9150 +:1000d000ffff4a250100082500002ca1fbff401569 +:1000e000010029250500001000000000000020a1eb +:1000f000ffff4a25fdff40150100292503000825c3 +:10010000fcff0a24244048010000098de7ff201568 +:10011000000000000000093c00002925100020110b +:10012000000000000100093c0000292588bf0a3cae +:1001300010204a25000049ad0100093c0000292596 +:1001400088bf0a3c20204a25000049ad0100093c37 +:100150000000292588bf0a3c30204a25000049ad0f +:1001600000488040ffff0a2400588a40009d093c57 +:1001700000202925017889400000093c010029253b +:1001800000000a2444492a7d01608a408000093c1d +:1001900000688940008008408005097d404c0900c6 +:1001a000006008405800013c24400101254028011e +:1001b00000608840029d083c0cf9082509f8000100 +:1001c0000000000000600840bfff013cffff213439 +:1001d0002440010100608840000084300000a53008 +:1001e000029d083c20f408250800000100000000e2 +:020000040000fa +:020000041fc01b +:10038000029d1a3cb8f45a27080040030000000000 +:020000040000fa +:020000041d00dd +:10218000029d1a3c98e55a27080040030000000011 +:020000040000fa +:020000041d00dd +:08220000727d400b000000009c +:020000040000fa +:020000041d00dd +:08222000727d400b000000007c +:020000040000fa +:020000041d00dd +:08224000727d400b000000005c +:020000040000fa +:020000041d00dd +:08226000e16f400b00000000db +:020000040000fa +:020000041d00dd +:08228000b653400b0000000002 +:020000040000fa +:020000041d00dd +:0822a000727d400b00000000fc +:020000040000fa +:020000041d00dd +:0822c000727d400b00000000dc +:020000040000fa +:020000041d00dd +:0822e000727d400b00000000bc +:020000040000fa +:020000041d00dd +:08230000727d400b000000009b +:020000040000fa +:020000041d00dd +:08232000727d400b000000007b +:020000040000fa +:020000041d00dd +:08234000727d400b000000005b +:020000040000fa +:020000041d00dd +:08236000727d400b000000003b +:020000040000fa +:020000041d00dd +:08238000727d400b000000001b +:020000040000fa +:020000041d00dd +:0823a000727d400b00000000fb +:020000040000fa +:020000041d00dd +:0823c000727d400b00000000db +:020000040000fa +:020000041d00dd +:0823e000727d400b00000000bb +:020000040000fa +:020000041d00dd +:08240000727d400b000000009a +:020000040000fa +:020000041d00dd +:08242000727d400b000000007a +:020000040000fa +:020000041d00dd +:08244000727d400b000000005a +:020000040000fa +:020000041d00dd +:08246000727d400b000000003a +:020000040000fa +:020000041d00dd +:08248000727d400b000000001a +:020000040000fa +:020000041d00dd +:0824a000727d400b00000000fa +:020000040000fa +:020000041d00dd +:0824c000727d400b00000000da +:020000040000fa +:020000041d00dd +:0824e000727d400b00000000ba +:020000040000fa +:020000041d00dd +:08250000f745400b000000004c +:020000040000fa +:020000041d00dd +:08252000727d400b0000000079 +:020000040000fa +:020000041d00dd +:08254000727d400b0000000059 +:020000040000fa +:020000041d00dd +:08256000727d400b0000000039 +:020000040000fa +:020000041d00dd +:08258000727d400b0000000019 +:020000040000fa +:020000041d00dd +:0825a000727d400b00000000f9 +:020000040000fa +:020000041d00dd +:0825c000727d400b00000000d9 +:020000040000fa +:020000041d00dd +:0825e000727d400b00000000b9 +:020000040000fa +:020000041d00dd +:082600008646400b00000000bb +:020000040000fa +:020000041d00dd +:08262000727d400b0000000078 +:020000040000fa +:020000041d00dd +:08264000727d400b0000000058 +:020000040000fa +:020000041d00dd +:08266000727d400b0000000038 +:020000040000fa +:020000041d00dd +:08268000727d400b0000000018 +:020000040000fa +:020000041d00dd +:0826a000727d400b00000000f8 +:020000040000fa +:020000041d00dd +:0826c000727d400b00000000d8 +:020000040000fa +:020000041d00dd +:0826e000727d400b00000000b8 +:020000040000fa +:020000041d00dd +:08270000727d400b0000000097 +:020000040000fa +:020000041d00dd +:08272000727d400b0000000077 +:020000040000fa +:020000041d00dd +:08274000727d400b0000000057 +:020000040000fa +:020000041d00dd +:08276000727d400b0000000037 +:020000040000fa +:020000041d00dd +:08278000727d400b0000000017 +:020000040000fa +:020000041d00dd +:0827a000727d400b00000000f7 +:020000040000fa +:020000041d00dd +:0827c000727d400b00000000d7 +:020000040000fa +:020000041d00dd +:0827e000727d400b00000000b7 +:020000040000fa +:020000041d00dd +:08280000727d400b0000000096 +:020000040000fa +:020000041d00dd +:08282000727d400b0000000076 +:020000040000fa +:020000041d00dd +:08284000727d400b0000000056 +:020000040000fa +:020000041d00dd +:08286000727d400b0000000036 +:020000040000fa +:020000041d00dd +:08288000727d400b0000000016 +:020000040000fa +:020000041d00dd +:0828a000727d400b00000000f6 +:020000040000fa +:020000041d00dd +:0828c000727d400b00000000d6 +:020000040000fa +:020000041d00dd +:0828e000727d400b00000000b6 +:020000040000fa +:020000041d00dd +:08290000727d400b0000000095 +:020000040000fa +:020000041d00dd +:08292000727d400b0000000075 +:020000040000fa +:020000041d00dd +:08294000727d400b0000000055 +:020000040000fa +:020000041d00dd +:08296000727d400b0000000035 +:020000040000fa +:020000041d00dd +:08298000727d400b0000000015 +:020000040000fa +:020000041d00dd +:0829a000727d400b00000000f5 +:020000040000fa +:020000041d00dd +:0829c000727d400b00000000d5 +:020000040000fa +:020000041d00dd +:0829e000727d400b00000000b5 +:020000040000fa +:020000041fc01b +:1004800000f89b40c0000000029d1b3c00f57b274c +:10049000020060130000000000c09b4000f81b40f9 +:0c04a000c00000001f000042000000002f +:020000040000fa +:020000041d00dd +:1038000038ffbd27c400bfafc000beaf21f0a0038a +:10381000211880002110a000d000c6afc800c3a3ab +:10382000cc00c2a7c800c3932c0002241500621468 +:10383000000000002000c227d000c48f21284000d3 +:103840000400062421380000c930400f00000000a9 +:10385000d2014014000000009c80828fcf014010f4 +:10386000000000009c80828f2000c3272c000424cd +:103870002128600009f8400000000000e70f400b1d +:1038800000000000c800c3931d000224150062144c +:10389000000000002400c227d000c48f212840006f +:1038a0000800062421380000c930400f0000000045 +:1038b000ba014014000000009c80828fb7014010c4 +:1038c000000000009c80828f2400c3271d00042478 +:1038d0002128600009f8400000000000e70f400bbd +:1038e00000000000c800c393080002241500621401 +:1038f000000000005400c227d000c48f21284000df +:103900003000062401000724c930400f00000000e9 +:10391000a2014014000000009c80828f9f01401093 +:10392000000000009c80828f5400c32708000424fc +:103930002128600009f8400000000000e70f400b5c +:1039400000000000c800c39310000224930162101d +:1039500000000000c800c393320002241500621466 +:10396000000000002c00c227d000c48f2128400096 +:103970001000062421380000c930400f000000006c +:1039800086014014000000009c80828f830140105b +:10399000000000009c80828f2c00c327320004248a +:1039a0002128600009f8400000000000e70f400bec +:1039b00000000000c800c3932f0002241b00621403 +:1039c000000000005400c2272120400021280000f0 +:1039d00068000624836a400f000000005400c227dc +:1039e000d000c48f21284000680006242138000040 +:1039f000c930400f000000006801401400000000c2 +:103a00009c80828f65014010000000009c80828fa6 +:103a10005400c3272f0004242128600009f8400027 +:103a200000000000e70f400b00000000c800c39337 +:103a30003400022414006214000000003c00c2277d +:103a4000d000c48f21284000040006242138000043 +:103a5000c930400f00000000500140140000000079 +:103a60009c80828f4d014010000000009c80828f5e +:103a7000340004242128000009f840000000000060 +:103a8000e70f400b00000000c800c393130002249e +:103a900017006214000000004000c227d000c48f4d +:103aa000212840000400062421380000c930400fbe +:103ab0000000000039014014000000004000c293e3 +:103ac000988082a39c80828f340140100000000007 +:103ad0009c80828f4000c3271300042421286000ab +:103ae00009f8400000000000e70f400b0000000054 +:103af000c800c393150002241500621400000000e2 +:103b00005400c227d000c48f212840002c00062476 +:103b100021380000c930400f000000001f01401490 +:103b2000000000009c80828f1c01401000000000fb +:103b30009c80828f5400c327150004242128600034 +:103b400009f8400000000000e70f400b00000000f3 +:103b5000c800c39304000224150062140000000092 +:103b60001800c227d000c48f21284000040006247a +:103b700021380000c930400f000000000701401448 +:103b8000000000009c80828f0401401000000000b3 +:103b90009c80828f1800c327040004242128600021 +:103ba00009f8400000000000e70f400b0000000093 +:103bb000c800c393790002241500621400000000bd +:103bc0001800c227d000c48f21284000040006241a +:103bd00021380000c930400f00000000ef00401401 +:103be000000000009c80828fec004010000000006c +:103bf0009c80828f1800c32779000424212860004c +:103c000009f8400000000000e70f400b0000000032 +:103c1000c800c3930b0002241500621400000000ca +:103c20005400c227d000c48f21284000640006241d +:103c300001000724c930400f00000000d7004014e5 +:103c4000000000009c80828fd40040100000000023 +:103c50009c80828f5400c3270b000424212860001d +:103c600009f8400000000000e70f400b00000000d2 +:103c7000c800c3932a00022415006214000000004b +:103c80004400c227d000c48f21284000040006242d +:103c900001000724c930400f00000000bf0040149d +:103ca000000000009c80828fbc00401000000000db +:103cb0009c80828f4400c3272a00042421286000ae +:103cc00009f8400000000000e70f400b0000000072 +:103cd000c800c393220002243600621400000000d2 +:103ce0001800c227d000c48f2128400002000624fb +:103cf00021380000c930400f00000000a700401428 +:103d0000000000001900c29300120200ffff4330c0 +:103d10001800c293211062001000c2a71000c297c1 +:103d20000200422421204000d971400f0000000011 +:103d30001400c2af1400c28f9800401000000000b1 +:103d40001400c28f1000c397000043a4d000c28f9c +:103d5000020044241400c28f020043241400c28fc6 +:103d60000000429421286000213040000100072417 +:103d7000c930400f0000000009004014000000009e +:103d80009c80828f06004010000000009c80828f83 +:103d9000220004241400c58f09f840000000000030 +:103da0001400c48f8c7d400f00000000e70f400b13 +:103db00000000000c800c3933c00022420006214ed +:103dc000000000004800c227d000c48f2128400016 +:103dd0000800062421380000c930400f0000000010 +:103de0006e00401400000000d000c28f0800442480 +:103df0004800c38f4c00c29721286000213040004a +:103e000001000724c930400f000000006300401487 +:103e1000000000009c80828f6000401000000000c5 +:103e20009c80828f4800c3273c0004242128600026 +:103e300009f8400000000000e70f400b0000000000 +:103e4000c800c3932400022415006214000000007f +:103e50005000c227d000c48f21284000040006244f +:103e600021380000c930400f000000004b00401412 +:103e7000000000009c80828f48004010000000007d +:103e80009c80828f5000c3272400042421286000d6 +:103e900009f8400000000000e70f400b00000000a0 +:103ea000c800c393370002243c00621400000000e5 +:103eb000cc00c2972400422c3800401400000000bf +:103ec0005400c227d000c48f2128400024000624bb +:103ed00021380000c930400f000000002f004014be +:103ee00000000000cc00c297dcff4224cc00c2a737 +:103ef000cc00c2971f00401000000000a480828ff9 +:103f00001c00401000000000cc00c397aa808297dc +:103f100021204000a8808297211082002a104300af +:103f20000300401000000000aa808297cc00c2a7c6 +:103f3000a880829721184000d000c28f2110620013 +:103f400024004224d000c2afa480838fcc00c2974b +:103f5000d000c48f212860002130400001000724d8 +:103f6000c930400f000000000200401000000000b7 +:103f7000cc00c0a7a080828f080040100000000085 +:103f8000a080828fa480858fcc00c3975400c42763 +:103f90002130600009f840000000000021e8c00363 +:103fa000c400bf8fc000be8fc800bd270800e0035b +:103fb00000000000e0ffbd271c00bfaf1800beaf2f +:103fc00021f0a0031000c0a3212000003d5e400f9f +:103fd000000000001000c2a31000c28305004014be +:103fe000000000003228400f00000000fe0f400bd0 +:103ff00000000000000000001000c28321e8c003a0 +:104000001c00bf8f1800be8f2000bd270800e003f2 +:1040100000000000e0ffbd271c00bfaf1800beafce +:1040200021f0a0032000c4af1000c0a32000c28f65 +:104030000500401400000000f4ff02241000c2a399 +:104040008110400b000000002000c28f21204000a2 +:10405000a16a400f000000000800401000000000ae +:104060002000c28f21204000a16a400f0000000004 +:104070002100422c0500401400000000f4ff02243f +:104080001000c2a38110400b000000002000c28f6e +:10409000210042900f00422c05004010000000005b +:1040a0002000c28f21004290050040140000000053 +:1040b000f4ff02241000c2a38110400b0000000096 +:1040c0002000c28f410042900d004014000000000b +:1040d0002000c28f420042900900401400000000fe +:1040e0002000c28f430042900500401400000000f1 +:1040f000f4ff02241000c2a38110400b0000000056 +:104100002000c28f3f004390010002243c00621057 +:10411000000000002000c28f3f00439003000224f3 +:1041200033006214000000002000c28f2200429081 +:1041300006004010000000002000c28f22004290c4 +:104140000500422c0500401400000000f4ff02248a +:104150001000c2a38110400b000000002000c28f9d +:10416000230043900a0002240a00621000000000ad +:104170002000c28f230043901a0002240500621021 +:1041800000000000f4ff02241000c2a38110400bc5 +:10419000000000002000c28f2400422410004010c4 +:1041a000000000002000c28f240042242120400093 +:1041b000a16a400f0000000009004010000000004c +:1041c0002000c28f2400422421204000a16a400f19 +:1041d000000000001b00422c0a00401400000000f8 +:1041e000f4ff02241000c2a38110400b0000000065 +:1041f000f4ff02241000c2a38110400b0000000055 +:10420000000000001000c28321e8c0031c00bf8f23 +:104210001800be8f2000bd270800e003000000004a +:10422000f0ffbd270c00beaf21f0a0031000c4af0b +:104230000000c0a31000c28f050040140000000061 +:10424000f4ff02240000c2a3b710400b00000000de +:104250001000c28f000042900300401400000000d4 +:10426000f4ff02240000c2a31000c28f010042909c +:104270000a00422c06004014000000001000c28f0b +:1042800001004290fb00422c03004014000000009b +:10429000f4ff02240000c2a31000c28f020042906b +:1042a00006004010000000001000c28f0200429083 +:1042b0000300422c0300401400000000f4ff02241d +:1042c0000000c2a31000c28f03004280030040041c +:1042d00000000000f4ff02240000c2a30000c2831b +:1042e00021e8c0030c00be8f1000bd270800e003ca +:1042f00000000000d0ffbd272c00bfaf2800beafdc +:1043000021f0a003211080003000c2a3f4ff02249a +:104310002000c2a32400c0af3000c2932400c2a377 +:104320002400c2271000a0af1400a0af1800a0af57 +:104330000100042423000524213040000400072448 +:10434000462e400f000000002000c2a32000c283c0 +:1043500021e8c0032c00bf8f2800be8f3000bd278e +:104360000800e00300000000e0ffbd271c00bfaf15 +:104370001800beaf21f0a003f4ff02241000c2a376 +:10438000212000005c5e400f000000001000c2a36e +:104390001000c28321e8c0031c00bf8f1800be8f2d +:1043a0002000bd270800e00300000000c8ffbd2773 +:1043b0003400bfaf3000beaf21f0a0033800c4af5f +:1043c0001000c0a33800c28f050040140000000098 +:1043d000f4ff02241000c2a33711400b00000000bc +:1043e0003800c28f0000428c9c8082af3800c28fa0 +:1043f0000400428ca08082af21200000875e400f25 +:10440000000000001000c2a31000c2832c00401462 +:104410000000000021200000712d400f000000006e +:104420001000c2a31000c2831f004014000000004f +:1044300001000424009d023c003845246031400ff7 +:10444000000000001400c227212040003116400f58 +:10445000000000001000c2a31400c2272120400069 +:104460006516400f000000001000c28317004014c2 +:1044700000000000c22d400f000000001000c2a389 +:104480001000c28314004014000000003800c28fe6 +:104490001800429021204000bd10400f0000000095 +:1044a0003711400b00000000000000002120000038 +:1044b000ed5e400f000000003711400b00000000cf +:1044c000000000003711400b000000000000000059 +:1044d0003711400b00000000000000001000c283f4 +:1044e00021e8c0033400bf8f3000be8f3800bd27e5 +:1044f0000800e00300000000e0ffbd271c00bfaf84 +:104500001800beaf21f0a0032000c4af1000c0a36c +:10451000da10400f000000001000c2a31000c28398 +:1045200005004014000000002000c48feb10400f75 +:10453000000000001000c2a31000c28321e8c003e5 +:104540001c00bf8f1800be8f2000bd270800e003ad +:1045500000000000e8ffbd271400bfaf1000beaf91 +:1045600021f0a0031800c4af212000008c2d400fc3 +:104570000000000021200000ed5e400f0000000060 +:104580002110000021e8c0031400bf8f1000be8f6f +:104590001800bd270800e00300000000e8ffbd2769 +:1045a0001400bfaf1000beaf21f0a0032120000017 +:1045b0005511400f00000000da10400f000000000d +:1045c00021e8c0031400bf8f1000be8f1800bd2764 +:1045d0000800e00300000000e8ffbd271400bfafa3 +:1045e0001000beaf21f0a0031800c4af1800c48fa4 +:1045f000eb10400f0000000021e8c0031400bf8f43 +:104600001000be8f1800bd270800e0030000000066 +:10461000e0ffbd271c00bfaf1800beaf21f0a00314 +:104620002000c4aff4ff02241000c2a36711400fa2 +:10463000000000001000c2a31000c2830500401457 +:10464000000000002000c48f7611400f0000000021 +:104650001000c2a31000c28321e8c0031c00bf8f5a +:104660001800be8f2000bd270800e00300000000f6 +:10467000e8ffbd271400bfaf1000beaf21f0a003bc +:104680008c30400f0000000021e8c0031400bf8ff1 +:104690001000be8f1800bd270800e00300000000d6 +:1046a000e8ffbd271400bfaf1000beaf21f0a0038c +:1046b0001800c4af9630400f0000000021e8c0038e +:1046c0001400bf8f1000be8f1800bd270800e00344 +:1046d00000000000d8ffbd272400bfaf2000beaf00 +:1046e00021f0a0031000a0af1400a0af1800a0afed +:1046f0000100042429000524213000002138000095 +:10470000462e400f0000000021e8c0032400bf8fa8 +:104710002000be8f2800bd270800e0030000000035 +:10472000d8ffbd272400bfaf2000beaf21f0a003fb +:104730002800c4af2120a0002118c0003400c7af5a +:104740003800c28f2c00c4a33000c3a31800c2a736 +:104750002c00c3933000c2931800c4971000a4af7c +:104760001400a0af2800c48f212860002130400031 +:104770003400c78fe511400f0000000021e8c0039e +:104780002400bf8f2000be8f2800bd270800e00353 +:104790000000000048ffbd27b400bfafb000beafaf +:1047a00021f0a003b800c4af2120c000c400c7afef +:1047b000c800c38fcc00c28fbc00c5a3c000c4a377 +:1047c000a800c3a7ac00c2a32000c0a3c000c3932d +:1047d000010002244e00621000000000c400c28fdd +:1047e0000500401400000000f4ff02242000c2a3d2 +:1047f000ef12400b00000000c000c393020002242f +:104800004300621400000000c400c28f2120400059 +:10481000a16a400f0000000021184000400002245f +:104820003b006214000000002100c0a3c400c28f3e +:104830002400c2af4012400b000000002100c293d0 +:104840002400c38f21106200000042903000422cef +:1048500024004014000000002100c2932400c38ff4 +:1048600021106200000042903a00422c08004014df +:10487000000000002100c2932400c38f21106200b9 +:10488000000042904100422c16004014000000003d +:104890002100c2932400c38f2110620000004290c7 +:1048a0004700422c08004014000000002100c29381 +:1048b0002400c38f21106200000042906100422c4e +:1048c00008004014000000002100c2932400c38fa0 +:1048d00021106200000042906700422c0500401445 +:1048e00000000000f4ff02242000c2a3ef12400bde +:1048f000000000002100c293010042242100c2a355 +:104900002100c2934000422cccff40140000000064 +:10491000bc00c2930500401000000000bc00c29320 +:104920002100422c0500401400000000f4ff022486 +:104930002000c2a3ef12400b00000000a800c297a5 +:104940000500401000000000a800c2970f00422c94 +:104950000900401400000000a800c397ff000224d3 +:104960000500621000000000f4ff02242000c2a332 +:10497000ef12400b00000000b800c38fbc00c293d0 +:104980003800c427460084242128600021304000dc +:10499000466a400f00000000bc00c2932000c327fd +:1049a000211062005e0040a0a800c2977c00c2a750 +:1049b000ac00c2932b100200ff0042309f00c2a344 +:1049c0003800c2272800c2af2800c28fc000c3939e +:1049d000410043a0c000c3930300022439006214c5 +:1049e00000000000c400c28f2c00c2af2800c28f9c +:1049f0003000c2af2c00c28f00004290ffff422463 +:104a0000ff0043303000c28f000043a03000c28f4f +:104a1000000042900400422c0500401400000000f9 +:104a2000f4ff02242000c2a3ef12400b000000009c +:104a30002c00c28f01004290ffff4224ff00433050 +:104a40003000c28f010043a03000c28f01004390ac +:104a50000a0002240a006210000000003000c28f29 +:104a6000010043901a0002240500621000000000bb +:104a7000f4ff02242000c2a3ef12400b000000004c +:104a80003000c28f020044242c00c28f0200432455 +:104a90002c00c28f0100429021286000213040008c +:104aa000466a400f000000002c00c28f01004290b7 +:104ab0003000c38f21106200020040a0e412400bbe +:104ac00000000000c000c393020002241b00621417 +:104ad00000000000c400c28f21204000a16a400fe6 +:104ae000000000003400c2a73400c2970500401047 +:104af000000000003400c2974100422c0500401421 +:104b000000000000f4ff02242000c2a3ef12400bbb +:104b1000000000002800c48fc400c38f3400c29777 +:104b2000010042242128600021304000466a400fe5 +:104b300000000000e412400b00000000c000c3931e +:104b4000040002240a006214000000002800c38f41 +:104b5000c400c28f212060002128400040000624ac +:104b6000466a400f00000000e412400b0000000005 +:104b7000c000c39301000224050062100000000081 +:104b8000f4ff02242000c2a3ef12400b000000003b +:104b90003800c2271000a0af1400a0af1800a0afcb +:104ba0000100042428000524213040006c00072463 +:104bb000462e400f000000002000c2a32000c28348 +:104bc00021e8c003b400bf8fb000be8fb800bd277e +:104bd0000800e00300000000d8ffbd272400bfaf9d +:104be0002000beaf21f0a0031000a0af1400a0afc2 +:104bf0001800a0af010004242b0005242130000080 +:104c000021380000462e400f0000000021e8c003bc +:104c10002400bf8f2000be8f2800bd270800e003be +:104c200000000000d0ffbd272c00bfaf2800beafa2 +:104c300021f0a0033000c4af2000c2272120400093 +:104c40003000c58f06000624466a400f00000000b1 +:104c50001000a0af1400a0af1800a0af0100042402 +:104c6000020005242000c22721304000080007244c +:104c7000462e400f0000000021e8c0032c00bf8f2b +:104c80002800be8f3000bd270800e00300000000b0 +:104c9000d8ffbd272400bfaf2000beaf21f0a00386 +:104ca0002800c4af2800c28f0800438c2800c28fa0 +:104cb000080043ac2800c28f0400438c2800c28f38 +:104cc000040043ac2800c28f0000438c2800c28f30 +:104cd000000043ac2800c28f0c00438c2800c28f18 +:104ce0000c0043ac2800c28f1000a0af1400a0af8e +:104cf0001800a0af020004240a000524213040005f +:104d000010000724462e400f0000000021e8c003d9 +:104d10002400bf8f2000be8f2800bd270800e003bd +:104d200000000000f8ffbd270400beaf21f0a00383 +:104d30002110000021e8c0030400be8f0800bd2739 +:104d40000800e00300000000f8ffbd270400beaf2c +:104d500021f0a0030800c4af2110000021e8c00327 +:104d60000400be8f0800bd270800e003000000001b +:104d7000d0ffbd272c00bfaf2800beaf21f0a0039d +:104d8000211080003000c2a33000c2930400401004 +:104d9000000000000b0002246913400b000000001b +:104da0000c0002242000c2a32000c2931000a0af78 +:104db0001400a0af1800a0af020004242128400076 +:104dc0002130000021380000462e400f0000000076 +:104dd00021e8c0032c00bf8f2800be8f3000bd2704 +:104de0000800e00300000000d8ffbd272400bfaf8b +:104df0002000beaf21f0a0032800c4af2800c28f5e +:104e00001000a0af1400a0af1800a0af0100042450 +:104e1000390005242130400004000724462e400fad +:104e20000000000021e8c0032400bf8f2000be8fd7 +:104e30002800bd270800e00300000000d8ffbd27c0 +:104e40002400bfaf2000beaf21f0a0032800c4aff4 +:104e50002800c28f0000429001004224ffff423030 +:104e60001000a0af1400a0af1800a0af01000424f0 +:104e7000110005242800c68f21384000462e400f1f +:104e80000000000021e8c0032400bf8f2000be8f77 +:104e90002800bd270800e00300000000d0ffbd2768 +:104ea0002c00bfaf2800beaf21f0a0033000c4af7c +:104eb000f4ff02242000c2a33000c48f8810400fea +:104ec000000000000c004014000000003000c28f01 +:104ed0001000a0af1400a0af1800a0af0100042480 +:104ee000160005242130400008000724462e400ffc +:104ef000000000002000c2a32000c28321e8c003fc +:104f00002c00bf8f2800be8f3000bd270800e003b3 +:104f100000000000d0ffbd272c00bfaf2800beafaf +:104f200021f0a003211080003000c2a7f4ff02246a +:104f30002000c2a33000c2972400c2a72400c227c9 +:104f40001000a0af1400a0af1800a0af010004240f +:104f5000170005242130400004000724462e400f8e +:104f6000000000002000c2a32000c28321e8c0038b +:104f70002c00bf8f2800be8f3000bd270800e00343 +:104f800000000000d0ffbd272c00bfaf2800beaf3f +:104f900021f0a003211080003000c2a32000c0a394 +:104fa0003000c29305004010000000003000c293a2 +:104fb0000f00422c05004014000000003000c39395 +:104fc000ff00022410006214000000003000c293b1 +:104fd0002400c2a32400c2271000a0af1400a0af79 +:104fe0001800a0af01000424120005242130400065 +:104ff00004000724462e400f000000002000c2a33a +:105000000414400b00000000f1ff02242000c2a3a2 +:105010002000c28321e8c0032c00bf8f2800be8f70 +:105020003000bd270800e00300000000d0ffbd27ce +:105030002c00bfaf2800beaf21f0a00321108000dc +:105040003000c2a32000c0a33000c293050040106e +:10505000000000003000c2930f00422c05004014f5 +:10506000000000003000c393ff000224100062140f +:10507000000000003000c2932400c2a32400c22715 +:105080001000a0af1400a0af1800a0af01000424ce +:10509000250005242130400004000724462e400f3f +:1050a000000000002000c2a32e14400b00000000ee +:1050b000f1ff02242000c2a32000c28321e8c00324 +:1050c0002c00bf8f2800be8f3000bd270800e003f2 +:1050d00000000000c8ffbd273400bfaf3000beafe6 +:1050e00021f0a003211080003c00c5af3800c2a30e +:1050f0003800c2932000c2a33800c29308004014b5 +:10510000000000002100c3273c00c28f2120600066 +:105110002128400008000624466a400f00000000d5 +:105120001000a0af1400a0af1800a0af010004242d +:105130002f0005242000c227213040000c00072446 +:10514000462e400f0000000021e8c0033400bf8f4e +:105150003000be8f3800bd270800e00300000000cb +:10516000d0ffbd272c00bfaf2800beaf21f0a003a9 +:105170002000c0a31000a0af1400a0af1800a0af83 +:1051800001000424310005242130000021380000f2 +:10519000462e400f000000002000c2a32000c28362 +:1051a00021e8c0032c00bf8f2800be8f3000bd2730 +:1051b0000800e00300000000d0ffbd272c00bfafb7 +:1051c0002800beaf21f0a003211080003000c2a350 +:1051d0002000c0a33000c393010002240900621024 +:1051e000000000003000c393060002240500621096 +:1051f000000000003000c3930b0002241000621472 +:10520000000000003000c2932400c2a32400c22783 +:105210001000a0af1400a0af1800a0af010004243c +:105220005b0005242130400004000724462e400f77 +:10523000000000002000c2a39214400b00000000f8 +:10524000f4ff02242000c2a32000c28321e8c0038f +:105250002c00bf8f2800be8f3000bd270800e00360 +:1052600000000000d0ffbd272c00bfaf2800beaf5c +:1052700021f0a0032000c0a31000a0af1400a0af35 +:105280001800a0af010004245c00052421300000b8 +:1052900021380000462e400f000000002000c2a36d +:1052a0002000c28321e8c0032c00bf8f2800be8fde +:1052b0003000bd270800e00300000000d0ffbd273c +:1052c0002c00bfaf2800beaf21f0a0033000c4af58 +:1052d000f4ff02242000c2a33000c48f0510400f49 +:1052e000000000000c004014000000003000c28fdd +:1052f0001000a0af1400a0af1800a0af010004245c +:10530000460005242130400048000724462e400f67 +:10531000000000002000c2a32000c28321e8c003d7 +:105320002c00bf8f2800be8f3000bd270800e0038f +:1053300000000000d0ffbd272c00bfaf2800beaf8b +:1053400021f0a0032000c0a31000a0af1400a0af64 +:105350001800a0af010004244700052421300000fc +:1053600021380000462e400f000000002000c2a39c +:105370002000c28321e8c0032c00bf8f2800be8f0d +:105380003000bd270800e00300000000d0ffbd276b +:105390002c00bfaf2800beaf21f0a0032000c0a3a7 +:1053a0001000a0af1400a0af1800a0af01000424ab +:1053b000030005242130000021380000462e400f54 +:1053c000000000002000c2a32000c28321e8c00327 +:1053d0002c00bf8f2800be8f3000bd270800e003df +:1053e00000000000d0ffbd272c00bfaf2800beafdb +:1053f00021f0a0032000c0a31000a0af1400a0afb4 +:105400001800a0af0100042405000524213000008d +:1054100021380000462e400f000000002000c2a3eb +:105420002000c28321e8c0032c00bf8f2800be8f5c +:105430003000bd270800e00300000000d0ffbd27ba +:105440002c00bfaf2800beaf21f0a0032000c0a3f6 +:105450001000a0af1400a0af1800a0af01000424fa +:10546000060005242130000021380000462e400fa0 +:10547000000000002000c2a32000c28321e8c00376 +:105480002c00bf8f2800be8f3000bd270800e0032e +:1054900000000000d0ffbd272c00bfaf2800beaf2a +:1054a00021f0a0033000c4af2110a0003400c2a737 +:1054b000ffff02242000c2a33000c28f160040105c +:1054c000000000003400c2971300401000000000ec +:1054d0003400c2972400c2a70e0002242600c2a7ef +:1054e0002400c2273400c3973000c48f1000a4af3b +:1054f0001400a3af1a0003241800a3af0100042472 +:105500009e0005242130400004000724462e400f51 +:10551000000000002000c2a32000c28321e8c003d5 +:105520002c00bf8f2800be8f3000bd270800e0038d +:1055300000000000e0ffbd271c00bfaf1800beaf99 +:1055400021f0a0032000c4af2400c5af1000c0a309 +:10555000df2c400f000000001000c2a31000c28327 +:105560000c004014000000002000c48f2400c58ff0 +:10557000f92b400f000000001000c2a31000c283ee +:105580000400401400000000282d400f000000001f +:105590001000c2a31000c28321e8c0031c00bf8f0b +:1055a0001800be8f2000bd270800e00300000000a7 +:1055b000e0ffbd271c00bfaf1800beaf21f0a00365 +:1055c0002000c4af1000c0a3df2c400f000000007b +:1055d0001000c2a31000c2830b00401400000000a2 +:1055e0002000c48f512c400f000000001000c2a307 +:1055f0001000c2830400401400000000282d400f5a +:10560000000000001000c2a31000c28321e8c00304 +:105610001c00bf8f1800be8f2000bd270800e003cc +:1056200000000000d0ffbd272c00bfaf2800beaf98 +:1056300021f0a003211080003000c2a32000c0a3ed +:105640003000c2932400c2a32400c2271000a0afe0 +:105650001400a0af1800a0af01000424140005241a +:105660002130400004000724462e400f00000000b7 +:105670002000c2a32000c28321e8c0032c00bf8ffa +:105680002800be8f3000bd270800e00300000000a6 +:10569000f8ffbd270400beaf21f0a00398808293dd +:1056a000ff00423021e8c0030400be8f0800bd2780 +:1056b0000800e00300000000e8ffbd271400bfafb2 +:1056c0001000beaf21f0a0031e2d400f000000000f +:1056d00021e8c0031400bf8f1000be8f1800bd2743 +:1056e0000800e00300000000d0ffbd272c00bfaf82 +:1056f0002800beaf21f0a003211880002110a000d7 +:105700003000c3a33400c2a32000c0a33000c29362 +:105710002400c2a33400c2932500c2a32400c227e0 +:105720001000a0af1400a0af1800a0af0100042427 +:105730002d0005242130400004000724462e400f90 +:10574000000000002000c2a33000c29321204000ce +:10575000122d400f000000002000c28321e8c0038a +:105760002c00bf8f2800be8f3000bd270800e0034b +:1057700000000000d0ffbd272c00bfaf2800beaf47 +:1057800021f0a0033000c4af2000c0a31e2d400fa5 +:10579000000000002100c2a32100c39304000224e2 +:1057a0000e006214000000003000c28f2400c2af5f +:1057b0002400c2271000a0af1400a0af1800a0afb3 +:1057c000010004243a00052421304000040007248d +:1057d000462e400f000000002000c2a32000c2831c +:1057e00021e8c0032c00bf8f2800be8f3000bd27ea +:1057f0000800e00300000000a8ffbd275400bfaf71 +:105800005000beaf21f0a0035800c4af2110a0008b +:105810005c00c2a35c00c2933000422c0300401421 +:1058200000000000300002245c00c2a35c00c293b0 +:10583000010042245c00c2a35c00c2932000c32785 +:10584000212060005800c58f21304000466a400f7b +:10585000000000001000a0af1400a0af1800a0af1f +:1058600001000424090005242000c2272130400043 +:1058700030000724462e400f0000000021e8c0033e +:105880005400bf8f5000be8f5800bd270800e003b2 +:1058900000000000e8ffbd271400bfaf1000beaf3e +:1058a00021f0a003d328400f0000000021e8c0032e +:1058b0001400bf8f1000be8f1800bd270800e00342 +:1058c00000000000e0ffbd271c00bfaf1800beaf06 +:1058d00021f0a0032000c4af1000c0a3df2c400fb4 +:1058e000000000001000c2a31000c2830700401493 +:1058f000000000002000c48f735d400f0000000016 +:105900001000c2a3282d400f000000001000c28329 +:1059100021e8c0031c00bf8f1800be8f2000bd27e8 +:105920000800e00300000000e0ffbd271c00bfaf3f +:105930001800beaf21f0a0031000c0a31200c0a742 +:105940001200c22721200000212840004b5d400f9b +:10595000000000001000c2a31000c2830600401423 +:10596000000000001200c29721204000a42d400f2b +:10597000000000001000c2a31000c28321e8c00391 +:105980001c00bf8f1800be8f2000bd270800e00359 +:1059900000000000e0ffbd271c00bfaf1800beaf35 +:1059a00021f0a0032000c4af1000c0a3df2c400fe3 +:1059b000000000001000c2a31000c28307004014c2 +:1059c000000000002000c48fd85d400f00000000e0 +:1059d0001000c2a3282d400f000000001000c28359 +:1059e00021e8c0031c00bf8f1800be8f2000bd2718 +:1059f0000800e00300000000d0ffbd272c00bfaf6f +:105a00002800beaf21f0a0033000c4af3400c5af02 +:105a10002118c0002110e0003800c3a73c00c2a735 +:105a2000ffff02242000c2a33000c28f000042907a +:105a300017004010000000003000c28f00004290ac +:105a40000f00422c12004010000000003400c28ff2 +:105a5000a48082af3800c297aa8082a73c00c29778 +:105a6000a88082a73000c28f1000a0af1400a0afa2 +:105a70001800a0af010004243500052421304000a7 +:105a800018000724462e400f000000002000c2a38b +:105a90002000c28321e8c0032c00bf8f2800be8fe6 +:105aa0003000bd270800e00300000000d8ffbd273c +:105ab0002400bfaf2000beaf21f0a0031000a0afb4 +:105ac0001400a0af1800a0af010004243600052484 +:105ad0002130000021380000462e400f0000000059 +:105ae00021e8c0032400bf8f2000be8f2800bd27ff +:105af0000800e00300000000d0ffbd272c00bfaf6e +:105b00002800beaf21f0a0033000c4af2118a000d0 +:105b10002110c0003400c3a73800c2a7ffff022431 +:105b20002000c2a33000c28f13004010000000000c +:105b30003800c2972400c2a73400c2972600c2a72b +:105b40002400c2273800c3973000c48f1000a4afd0 +:105b50001400a3af040003241800a3af0100042421 +:105b6000b80005242130400004000724462e400fd1 +:105b7000000000002000c2a32000c28321e8c0036f +:105b80002c00bf8f2800be8f3000bd270800e00327 +:105b90000000000048ffbd27b400bfafb000beaf9b +:105ba00021f0a003b800c4afbc00c5af2110c000f5 +:105bb000c000c2a3f4ff02242000c2a3b800c28f19 +:105bc0002b00401000000000b800c48f0510400feb +:105bd000000000002600401400000000b800c28f42 +:105be0002400c3272120600021284000480006240b +:105bf000466a400f00000000bc00c28f2120400018 +:105c0000a16a400f000000001900401000000000d1 +:105c1000bc00c28f16004010000000002400c22704 +:105c200048004324bc00c28f21206000212840008e +:105c300040000624466a400f00000000c000c293e6 +:105c4000ac00c2a32400c2271000a0af1400a0af74 +:105c50001800a0af010004248a0005242130400070 +:105c60008c000724462e400f000000002000c2a335 +:105c70002000c28321e8c003b400bf8fb000be8ff4 +:105c8000b800bd270800e00300000000d8ffbd27d2 +:105c90002400bfaf2000beaf21f0a0031000a0afd2 +:105ca0001400a0af1800a0af010004240c000524cc +:105cb0002130000021380000462e400f0000000077 +:105cc00021e8c0032400bf8f2000be8f2800bd271d +:105cd0000800e00300000000d8ffbd272400bfaf8c +:105ce0002000beaf21f0a0031000a0af1400a0afb1 +:105cf0001800a0af01000424070005242130000093 +:105d000021380000462e400f0000000021e8c003ab +:105d10002400bf8f2000be8f2800bd270800e003ad +:105d200000000000d8ffbd272400bfaf2000beaf99 +:105d300021f0a0032800c4af2800c2271000a0afa4 +:105d40001400a0af1800a0af010004240d0005242a +:105d50002130400008000724462e400f00000000bc +:105d600021e8c0032400bf8f2000be8f2800bd277c +:105d70000800e00300000000d8ffbd272400bfafeb +:105d80002000beaf21f0a0031000a0af1400a0af10 +:105d90001800a0af010004241c00052421300000dd +:105da00021380000462e400f0000000021e8c0030b +:105db0002400bf8f2000be8f2800bd270800e0030d +:105dc00000000000d0ffbd272c00bfaf2800beaff1 +:105dd00021f0a003211080003000c2a33000c29344 +:105de00004004010000000000e0002247e17400b4b +:105df000000000000f0002242000c2a32000c29374 +:105e00001000a0af1400a0af1800a0af0100042440 +:105e1000212840002130000021380000462e400f8c +:105e20000000000021e8c0032c00bf8f2800be8fb7 +:105e30003000bd270800e00300000000d0ffbd27b0 +:105e40002c00bfaf2800beaf21f0a00321108000be +:105e50003000c2a32000c0a33000c2932400c2a31c +:105e60002400c2271000a0af1400a0af1800a0affc +:105e700001000424180005242130400004000724f8 +:105e8000462e400f000000002000c2a32000c28365 +:105e900021e8c0032c00bf8f2800be8f3000bd2733 +:105ea0000800e00300000000d0ffbd272c00bfafba +:105eb0002800beaf21f0a003211080003000c2a353 +:105ec0002000c0a33000c2932400c2a32400c22734 +:105ed0001000a0af1400a0af1800a0af0100042470 +:105ee000190005242130400004000724462e400fed +:105ef000000000002000c2a32000c28321e8c003ec +:105f00002c00bf8f2800be8f3000bd270800e003a3 +:105f100000000000d0ffbd272c00bfaf2800beaf9f +:105f200021f0a003211080003000c2a32000c0a3f4 +:105f30003000c2932400c2a32400c2271000a0afe7 +:105f40001400a0af1800a0af010004241b0005241a +:105f50002130400004000724462e400f00000000be +:105f60002000c2a32000c28321e8c0032c00bf8f01 +:105f70002800be8f3000bd270800e00300000000ad +:105f8000d0ffbd272c00bfaf2800beaf21f0a0037b +:105f9000211080003000c2a72000c0a32400c0afa1 +:105fa0003000c2972400c2a72400c2271000a0af6f +:105fb0001400a0af1800a0af010004241a000524ab +:105fc0002130400004000724462e400f000000004e +:105fd0002000c2a32000c28321e8c0032c00bf8f91 +:105fe0002800be8f3000bd270800e003000000003d +:105ff000c8ffbd273400bfaf3000beaf21f0a00303 +:106000003800c4af2110a0003c00c2a7f4ff022456 +:106010002000c2a32400c0af2800c0af3c00c2973c +:106020003406422c13004010000000003800c28fdc +:1060300010004010000000003c00c2972800c2a7da +:106040003800c28f2400c2af2400c2271000a0afc6 +:106050001400a0af1800a0af01000424bb00052469 +:106060002130400008000724462e400f00000000a9 +:106070002000c2a32000c28321e8c0033400bf8fe8 +:106080003000be8f3800bd270800e003000000008c +:10609000d0ffbd272c00bfaf2800beaf21f0a0036a +:1060a0003000c4af3400c5af3400c28fffff4230b0 +:1060b0002000c2a72000c2273400c38fffff633037 +:1060c0003000c48f1000a4af1400a3af020003245b +:1060d0001800a3af01000424a100052421304000d2 +:1060e00002000724462e400f0000000021e8c003f4 +:1060f0002c00bf8f2800be8f3000bd270800e003b2 +:1061000000000000d0ffbd272c00bfaf2800beafad +:1061100021f0a0033400c5af2118c0003c00c7af78 +:106120004000c28f3000c4a33800c3a32000c2a720 +:106130003c00c28f1400c2af3400c28f2000c3974e +:10614000060043a42000c2977d004010000000001c +:106150003000c38300a0023c00190300b4014224b4 +:10616000211062000000428c750040100000000009 +:106170003000c38300a0023c00190300b401422494 +:106180002110620004004294ffff42306c00401076 +:10619000000000003000c38300a0023c001903008f +:1061a000b4014224211062000a004290ff004330f3 +:1061b0000100022462006214000000002000c29767 +:1061c0001000c2a73000c38300a0023c00190300e6 +:1061d000b40142242110620004004294ffff4230c7 +:1061e0001000c39723106200ffff42301800c2a7bf +:1061f0001800c28708004018000000003000c38368 +:1062000000a0023c00190300b401422421106200e6 +:10621000040042941000c2a73000c38300a0023cd7 +:1062200000190300b4014224211062000000438cd5 +:106230001000c2971400c48f212860002130400054 +:1062400001000724c930400f000000003c0040144a +:10625000000000003000c38300a0023c00190300ce +:10626000b4014224211062000000438c3400c28f2c +:10627000000043ac1000c3873400c28f040043a465 +:106280003400c28f060043941000c29723106200ae +:10629000ffff43303400c28f060043a43000c483a4 +:1062a0003000c38300a0023c00190300b401422463 +:1062b0002110620004004294ffff43301000c29797 +:1062c00023106200ffff433000a0023c00210400c5 +:1062d000b401422421108200040043a43000c3838f +:1062e00000a0023c00190300b40142242110620006 +:1062f00004004294ffff42300700401400000000f9 +:106300003000c38300a0023c00190300b401422402 +:1063100021106200000040ac3881828f08004010dc +:10632000000000003881828f3000c4833800c3939e +:10633000212860003400c68f09f8400000000000ea +:1063400021e8c0032c00bf8f2800be8f3000bd277e +:106350000800e00300000000e8febd271401bfaf05 +:106360001001beaf21f0a003211880002110a00071 +:106370002001c6af1801c3a31c01c2a71801c39313 +:106380004100022419006214000000002800c22706 +:106390002001c48f21284000040006242138000079 +:1063a000c930400f000000009e01401400000000b2 +:1063b0002900c2832c00c2a33881828f990140102a +:1063c000000000003881828f2800c38321206000f4 +:1063d0002c00c327010005242130600009f840008b +:1063e00000000000891a400b000000001801c39350 +:1063f0004200022419006214000000003000c2278d +:106400002001c48f21284000040006242138000008 +:10641000c930400f0000000082014014000000005d +:106420003100c2833400c2a33881828f7d014010c5 +:10643000000000003881828f3000c383212060007b +:106440003400c327020005242130600009f8400011 +:1064500000000000891a400b000000001801c393df +:106460004300022448006214000000003800c227e4 +:106470002001c48f212840000c0006242138000090 +:10648000c930400f00000000660140140000000009 +:106490004100c28327004004000000004100c28385 +:1064a0002118400000a0023c00190300b40142245e +:1064b000211062000b0040a04100c283211840005f +:1064c00000a0023c00190300b40142242110620024 +:1064d000010003240a0043a0b2808297ffff4230ec +:1064e00001004224ffff4230b28082a7b28082972f +:1064f000ffff42300600401400000000b280829787 +:10650000ffff423001004224ffff4230b28082a7e9 +:106510004100c28321204000b2808297ffff4330b8 +:1065200000a0023c00210400b4014224211082009a +:10653000060043a44100c2834400c2a30200022417 +:106540004800c2a73a00c2974a00c2a73c00c28fc7 +:106550004c00c2af3881828f320140100000000031 +:106560003881828f4000c383212060004400c3270c +:10657000040005242130600009f8400000000000fc +:10658000891a400b000000001801c3934400022444 +:1065900005006210000000001801c3934b000224a4 +:1065a00028006214000000005800c2272001c48f98 +:1065b000212840000400062421380000c930400f83 +:1065c0000000000001014014000000005800c283d8 +:1065d0005c00c2a35900c2835d00c2a35900c283fc +:1065e0000b004014000000005800c283212040002e +:1065f0005a00c297f8ff4224ffff433000a0023c3c +:1066000000210400b401422421108200080043a4a8 +:106610003881828ff0004010000000003881828fa6 +:106620005800c383212060005c00c32705000524b7 +:106630002130600009f8400000000000891a400b7a +:10664000000000001801c3934a00022417006214de +:1066500000000000a800c2272001c48f21284000ac +:106660006800062421380000c930400f00000000f7 +:10667000ec004014000000000c01c28f0c01c2affe +:106680003081828fe7004010000000003081828f4f +:10669000a800c4270c01c38f2128600009f840001e +:1066a00000000000891a400b000000001801c3938d +:1066b0004600022409006210000000001801c39384 +:1066c0004800022405006210000000001801c39376 +:1066d0004d0002246800621400000000060002243d +:1066e0001800c2a31801c3934800022403006214d7 +:1066f00000000000090002241800c2a310000224b8 +:106700001e00c2a76000c3271e00c2972001c48fcd +:10671000212860002130400021380000c930400f9e +:1067200000000000af004014000000002000c0a7df +:106730006c00c2932200c2a36e00c2972000c2a7c1 +:106740002200c38300a0023c00190300b4014224cc +:10675000211062000c0040a06800c2972400c2a76c +:106760006a00c2972600c2a76200c2977a00c2a739 +:106770006400c28f7c00c2af2200c38300a0023c31 +:1067800000190300b4014224211062000600429463 +:10679000ffff42302000c3972a006214000000006f +:1067a0002400c28718004018000000002400c3879e +:1067b0001c01c2972a106200130040100000000064 +:1067c0002600c2972001c38f211062002001c2afb2 +:1067d0002400c2971e00c2a72200c4831800c293df +:1067e0001e00c5977000c3271000a5af21286000c8 +:1067f000213040002001c78f4118400f00000000e9 +:10680000891a400b000000002400c2977400c2a740 +:106810007000c0af3881828f75004010000000000a +:106820003881828f2200c4831800c5937000c3276b +:106830002130600009f8400000000000891a400b78 +:10684000000000001e00c3971c01c2972b106200bd +:106850006a004010000000002120000021280000f4 +:106860002130000001000724c930400f0000000063 +:10687000891a400b000000001801c3934500022450 +:1068800009006210000000001801c39347000224b1 +:1068900005006210000000001801c3934c000224a0 +:1068a0002f00621400000000070002241900c2a398 +:1068b0001801c39347000224030062140000000083 +:1068c000080002241900c2a38c00c2272001c48f33 +:1068d000212840000800062421380000c930400f5c +:1068e0000000000048004014000000001a00c0a78b +:1068f0008c00c2931c00c2a39000c2971a00c2a7ca +:106900008e00c2878800c2a71c00c38300a0023c7f +:1069100000190300b40142242110620006004294d1 +:10692000ffff42301a00c3973a00621400000000d3 +:106930003881828f3a004010000000003881828f39 +:106940001c00c4831900c5938800c3272130600050 +:1069500009f8400000000000891a400b0000000008 +:106960001801c393520002242e006214000000009c +:106970009400c2272001c48f21284000140006245f +:1069800001000724c930400f00000000250040141a +:10699000000000009800c28f408182af4081828f4a +:1069a00020004010000000004081828f9400c48fbe +:1069b0009c00c58fa400c3932130600009f84000fb +:1069c00000000000891a400b0000000000000000d9 +:1069d000891a400b0000000000000000891a400bdb +:1069e0000000000000000000891a400b00000000b9 +:1069f00000000000891a400b0000000000000000a9 +:106a0000891a400b0000000000000000891a400baa +:106a10000000000000000000891a400b0000000088 +:106a20000000000021e8c0031401bf8f1001be8fd9 +:106a30001801bd270800e00300000000e8ffbd27a3 +:106a40001400bfaf1000beaf21f0a003b48082934a +:106a5000ff004230100040140000000000a0023c83 +:106a6000b40142242120400021280000b000062467 +:106a7000836a400f0000000002000424009d023cd5 +:106a8000586345246031400f0000000001000224db +:106a9000b48082a3b28080a721e8c0031400bf8f16 +:106aa0001000be8f1800bd270800e00300000000a2 +:106ab000e8ffbd271400bfaf1000beaf21f0a00358 +:106ac00000a0023cb4014224212040002128000003 +:106ad000b0000624836a400f000000000200042476 +:106ae000212800006031400f00000000388180af95 +:106af000308180afb48080a321e8c0031400bf8f31 +:106b00001000be8f1800bd270800e0030000000041 +:106b1000f8ffbd270400beaf21f0a0030800c4affa +:106b20000c00c5af0800c28f388182af0c00c28f45 +:106b3000308182af21e8c0030400be8f0800bd276a +:106b40000800e00300000000c0ffbd273c00bfaf0d +:106b50003800beaf21f0a0032118a0002110c00012 +:106b60004000c4a74400c3a34800c2a3ffff0224ff +:106b70002000c2a34000c397020002248d006214cb +:106b8000000000004400c3930100022429006214a5 +:106b9000000000002100c0a3071b400b0000000004 +:106ba000b58082932800c2a3b5808293ff00423053 +:106bb0000019020000a0023cb4014224211062002e +:106bc0002400c2afb5808293ff004230010043240d +:106bd000070002241a006200f401400010100000b7 +:106be000ff004230b58082a32400c28f0a00429089 +:106bf000ff00423006004014000000002800c2934d +:106c00002000c2a3000000003b1b400b000000005e +:106c10002100c293010042242100c2a32100c2939b +:106c20000700422cdeff4014000000003b1b400b1d +:106c3000000000004400c393020002242b006214f1 +:106c40000000000000a0023c240242242c00c2af3d +:106c50002100c0a3371b400b00000000b6808293c8 +:106c60002800c2a3b6808293ff00423000110200c8 +:106c70002c00c38f211062002400c2afb680829323 +:106c8000ff00423001004324c317030082170200b3 +:106c9000211862000300633023106200ff004230bd +:106ca000b68082a32400c28f0a004290ff004230c7 +:106cb00007004014000000002800c293070042248f +:106cc000ff0042302000c2a33b1b400b000000002d +:106cd0002100c293010042242100c2a32100c293db +:106ce0000400422cddff4014000000002000c2839d +:106cf00030004004000000002400c28f212040002a +:106d00002128000010000624836a400f00000000c4 +:106d10002400c28f010003240a0043a0b28082979e +:106d2000ffff423001004224ffff4230b28082a7c1 +:106d3000b2808297ffff423006004014000000003e +:106d4000b2808297ffff423001004224ffff4230b1 +:106d5000b28082a7b2808297ffff43302400c28fa7 +:106d6000060043a44800c29301004230ff004230b5 +:106d700010004010000000002000c2933000c2a3a9 +:106d80002400c28f010003240b0043a03000c2275f +:106d90001000a0af1400a0af1800a0af02000424a0 +:106da000500005242130400004000724462e400fe7 +:106db000000000002000c28321e8c0033c00bf8f18 +:106dc0003800be8f4000bd270800e003000000002f +:106dd000c8ffbd273400bfaf3000beaf21f0a00315 +:106de000211880003c00c5af2110c0003800c3a3ab +:106df0004000c2a3faff02242000c2a33c00c28fbd +:106e000038004010000000003800c2833500400404 +:106e1000000000003800c38300a0023c00190300fa +:106e2000b4014224211062000a004290ff00433066 +:106e3000010002242b006214000000004000c293f5 +:106e400028004010000000003800c2932c00c2a3ac +:106e50002400c3273c00c28f21206000212840006d +:106e600008000624466a400f000000002400c29774 +:106e70002400c2a72600c2972600c2a72800c28ffe +:106e80002800c2af3800c38300a0023c00190300f1 +:106e9000b40142242110620006004294ffff4230f8 +:106ea0002e00c2a72400c2271000a0af1400a0af7c +:106eb0001800a0af02000424410005242130400046 +:106ec0000c000724462e400f000000002000c2a343 +:106ed0002000c2830300401000000000f7ff0224de +:106ee0002000c2a32000c28321e8c0033400bf8f6a +:106ef0003000be8f3800bd270800e003000000000e +:106f0000d0ffbd272c00bfaf2800beaf21f0a003eb +:106f1000211880002110a0003000c3a33400c2a3b8 +:106f2000faff02242000c2a33000c28327004004dd +:106f3000000000003000c38300a0023c00190300e1 +:106f4000b4014224211062000a004290ff00433045 +:106f5000010002241d006214000000003000c293f2 +:106f60002400c2a33400c2932500c2a33000c3830f +:106f700000a0023c00190300b40142242110620069 +:106f800006004294ffff42302600c2a72400c22719 +:106f90001000a0af1400a0af1800a0af020004249e +:106fa000420005242130400004000724462e400ff3 +:106fb000000000002000c2a32000c2830300401094 +:106fc00000000000f7ff02242000c2a32000c283bb +:106fd00021e8c0032c00bf8f2800be8f3000bd27e2 +:106fe0000800e00300000000f0ffbd270c00beaf6a +:106ff00021f0a003211080001400c5af1800c6af17 +:107000001000c2a3faff02240000c2a31000c28332 +:107010000c004004000000001000c38300a0023cec +:1070200000190300b4014224211062000a004290ba +:10703000ff0043300100022402006214000000003f +:107040000000c0a30000c28321e8c0030c00be8f73 +:107050001000bd270800e00300000000c8ffbd27a6 +:107060003400bfaf3000beaf21f0a0032118800074 +:107070003c00c5af2110c0003800c3a34000c2a32c +:10708000faff02242000c2a33800c2834a00400451 +:10709000000000003c00c28f4700401000000000cc +:1070a0003800c38300a0023c00190300b40142244d +:1070b000211062000a004290ff00433001000224c8 +:1070c0003d006214000000004000c2933a004010ee +:1070d00000000000440002242100c2a33800c38342 +:1070e00000a0023c00190300b401422421106200f8 +:1070f0000b004290ff00423001004230ff0042305e +:107100000b004010000000004b0002242100c2a32d +:107110003800c38300a0023c00190300b4014224dc +:10712000211062000b004290ff0042302d00c2a3ec +:107130003800c2932c00c2a32400c3273c00c28f96 +:10714000212060002128400008000624466a400fe4 +:10715000000000003800c38300a0023c00190300b7 +:10716000b40142242110620006004294ffff423025 +:107170002e00c2a72100c3932400c2271000a0af95 +:107180001400a0af1800a0af020004242128600062 +:10719000213040000c000724462e400f0000000064 +:1071a0002000c2a32000c2830300401000000000a2 +:1071b000f7ff02242000c2a32000c28321e8c003fd +:1071c0003400bf8f3000be8f3800bd270800e003b9 +:1071d00000000000c0ffbd273c00bfaf3800beafbd +:1071e00021f0a0034400c5af2118c0002110e00029 +:1071f0004000c4a34800c3a74c00c2a7faff022462 +:107200002000c2a74000c2835400400400000000d8 +:107210004400c28f51004010000000004800c29797 +:107220007905422c4d004010000000004000c3834f +:1072300000a0023c00190300b401422421106200a6 +:107240000a004290ff004330010002244300621410 +:1072500000000000450002242400c2a350000224c4 +:107260002200c2a74000c2932800c2a34800c297d0 +:107270002a00c2a74000c38300a0023c00190300fb +:10728000b40142242110620006004294ffff423004 +:107290003400c2a74000c283070042280300401404 +:1072a00000000000440002242200c2a74000c38363 +:1072b00000a0023c00190300b40142242110620026 +:1072c0000b004290ff00423001004230ff0042308c +:1072d0000a004010000000004c0002242400c2a359 +:1072e0004000c38300a0023c00190300b401422403 +:1072f00021106200080042942200c2a72400c39318 +:1073000080ff022425106200ff0042302118400057 +:107310002800c2274400c68f4800c5972200c497a2 +:107320001000a6af1400a5af1800a4af02000424fb +:10733000212860002130400010000724462e400f15 +:10734000000000002000c2a72000c28703004010f8 +:1073500000000000f2ff02242000c2a72000c28724 +:1073600021e8c0033c00bf8f3800be8f4000bd271e +:107370000800e00300000000b8ffbd274400bfafd5 +:107380004000beaf21f0a003214080004c00c5affb +:107390002120c0002118e0005c00c28f4800c8a373 +:1073a0005000c4a75400c3a73800c2a3faff0224a8 +:1073b0002000c2a74800c2834e0040040000000025 +:1073c0004c00c28f4b004010000000005000c297dc +:1073d0007905422c47004010000000004800c3839c +:1073e00000a0023c00190300b401422421106200f5 +:1073f0000a004290ff004330010002243d00621465 +:10740000000000004800c38300a0023c00190300f4 +:10741000b4014224211062000a004290ff00423071 +:1074200034004010000000002800c2272120400046 +:107430002128000010000624836a400f000000008d +:107440004800c2932800c2a35000c2972a00c2a7d6 +:107450004800c38300a0023c00190300b401422489 +:107460002110620006004294ffff42303400c2a7a0 +:107470005800c28f0c004010000000005800c28f5e +:107480002400c2af2400c28f000042942c00c2a787 +:107490002400c28f020042942e00c2a72400c28f93 +:1074a0000400428c3000c2af2800c2274c00c48fb9 +:1074b0005000c3971000a4af1400a3af44000324ee +:1074c0001800a3af02000424c700052421304000a7 +:1074d00010000724462e400f000000002000c2a725 +:1074e0002000c2870300401000000000f2ff0224c9 +:1074f0002000c2a72000c28721e8c0034400bf8f3c +:107500004000be8f4800bd270800e00300000000d7 +:10751000c8ffbd273400bfaf3000beaf21f0a003cd +:10752000211880003c00c5af2110c0004400c7af47 +:107530003800c3a34000c2a7faff02242000c2a75c +:107540003800c28365004004000000003c00c28f88 +:1075500062004010000000004000c2975f00401031 +:10756000000000003800c38300a0023c00190300a3 +:10757000b4014224211062000a004290ff0043300f +:107580000100022455006214000000002000c0a782 +:107590003800c4833c00c38f00a0023c00210400db +:1075a000b401422421108200000043ac3800c383a0 +:1075b00000a0023c00190300b40142242110620023 +:1075c0004000c397040043a43800c38300a0023cda +:1075d00000190300b4014224211062000c00429003 +:1075e000ff0042303d00401400000000460002242d +:1075f0002200c2a33800c38300a0023c001903008c +:10760000b401422421106200010003240c0043a0b5 +:107610003800c38300a0023c00190300b4014224d7 +:10762000211062000b004290ff0042300100423006 +:10763000ff00423003004010000000004d00022413 +:107640002200c2a34400c28f0500401400000000c5 +:10765000ffff02242400c2af9a1d400b000000006f +:107660004400c28f2400c2af3800c2932800c2a3d6 +:107670003800c38300a0023c00190300b401422477 +:107680002110620006004294ffff42302a00c2a788 +:107690004000c2972c00c2a72200c3932400c22737 +:1076a0001000a0af1400a0af1800a0af0200042487 +:1076b00021286000213040000c000724462e400f96 +:1076c000000000002000c2a72000c2870300401075 +:1076d00000000000f2ff02242000c2a72000c287a1 +:1076e00021e8c0033400bf8f3000be8f3800bd27b3 +:1076f0000800e00300000000d0ffbd272c00bfaf52 +:107700002800beaf21f0a003211080003000c2a3ea +:10771000faff02242000c2a33000c2833f004004cd +:10772000000000003000c38300a0023c00190300e9 +:10773000b4014224211062000a004290ff0043304d +:1077400001000224350062140000000049000224f8 +:107750002100c2a33000c2932400c2a33000c3831f +:1077600000a0023c00190300b40142242110620071 +:1077700006004294ffff42302600c2a73000c383b8 +:1077800000a0023c00190300b40142242110620051 +:107790000b004290ff00423001004230ff004230b7 +:1077a00003004010000000004e0002242100c2a38c +:1077b0002100c3932400c2271000a0af1400a0af83 +:1077c0001800a0af020004242128600021304000ee +:1077d00004000724462e400f000000002000c2a332 +:1077e0002000c2830300401000000000f7ff0224c5 +:1077f0002000c2a300a0023cb40143243000c28395 +:107800000011020021106200212040002128000008 +:1078100010000624836a400f000000002000c2838d +:1078200021e8c0032c00bf8f2800be8f3000bd2789 +:107830000800e00300000000c8ffbd273400bfaf10 +:107840003000beaf21f0a003211880003c00c5af7e +:107850002110c0004400c7af3800c3a34000c2a736 +:107860002000c0a73800c283600040040000000070 +:107870003c00c28f5d004010000000004000c29735 +:107880005a004010000000003800c38300a0023cf2 +:1078900000190300b4014224211062000a00429042 +:1078a000ff00433001000224500062140000000079 +:1078b0003800c38300a0023c00190300b401422435 +:1078c000211062000a004290ff0042304f00401039 +:1078d000000000002000c0a73800c4833c00c38f14 +:1078e00000a0023c00210400b401422421108200c7 +:1078f000000043ac3800c38300a0023c0019030021 +:10790000b4014224211062004000c397040043a444 +:107910003800c38300a0023c00190300b4014224d4 +:10792000211062000c004290ff00423033004014ee +:10793000000000003800c38300a0023c00190300cf +:10794000b401422421106200010003240c0043a072 +:107950004400c28f0500401400000000ffff022415 +:107960002400c2af5d1e400b000000004400c28f27 +:107970002400c2af3800c2932800c2a33800c383da +:1079800000a0023c00190300b4014224211062004f +:1079900006004294ffff42302a00c2a74000c2976f +:1079a0002c00c2a72400c2271000a0af1400a0af73 +:1079b0001800a0af02000424480005242130400034 +:1079c0000c000724462e400f000000002000c2a734 +:1079d0002000c2870c00401000000000f2ff0224cb +:1079e0002000c2a7831e400b00000000faff022403 +:1079f0002000c2a7831e400b000000000000000012 +:107a0000831e400b00000000000000002000c28721 +:107a100021e8c0033400bf8f3000be8f3800bd277f +:107a20000800e00300000000d8ffbd272400bfaf1e +:107a30002000beaf21f0a0032800c4af1400c0afe7 +:107a40001000c0a31100c0a3d51e400b0000000011 +:107a50001200c0a32800c28f000042801300c2a3fe +:107a60001200c293010042241200c2a31200c2936a +:107a70000500422c0400401400000000211000000a +:107a8000e11e400b000000001300c3932e000224ef +:107a900004006210000000001300c29309004014ab +:107aa000000000001100c2931000c32721106200e3 +:107ab0001000c393080043a01000c0a3c81e400bd1 +:107ac000000000001300c2933000422c110040144b +:107ad000000000001300c2933a00422c0d00401039 +:107ae000000000001000c293401002008018020045 +:107af00021104300ff0043301300c29321106200a5 +:107b0000ff004230d0ff42241000c2a3c81e400b29 +:107b10000000000021100000e11e400b00000000ea +:107b20002800c28f010042242800c2af1300c39373 +:107b30002e00022404006210000000001300c29313 +:107b4000c4ff4014000000001100c2930100422451 +:107b50001100c2a31100c2930400422cbcff4014c8 +:107b6000000000001400c3271800c2272120600075 +:107b70002128400004000624466a400f000000004f +:107b80001400c28f21e8c0032400bf8f2000be8fe5 +:107b90002800bd270800e00300000000d0ffbd273b +:107ba0002c00bfaf2800beaf21f0a0033000c4af4f +:107bb000faff02242000c2a33000c48fa16a400f44 +:107bc000000000002100c2a32100c2936500422ce6 +:107bd00014004010000000002100c293ffff42305b +:107be00001004224ffff42301000a0af1400a0affc +:107bf0001800a0af02000424ca0005243000c68f7c +:107c000021384000462e400f000000002000c2a393 +:107c10002000c2830300401000000000f7ff022490 +:107c20002000c2a32000c28321e8c0032c00bf8f24 +:107c30002800be8f3000bd270800e00300000000d0 +:107c400058ffbd27a400bfafa000beaf21f0a00326 +:107c50002118a000b000c6af2110e000a800c4a306 +:107c6000ac00c3a3b400c2a7faff02242000c2a341 +:107c7000a800c28307004228cf0040100000000087 +:107c8000a800c38300a0023c00190300b4014224f1 +:107c9000211062000b004290ff0042300100423090 +:107ca000ff004230c400401000000000ac00c3934d +:107cb000010002242b00621400000000b000c28ffb +:107cc0000000428c2400c2af2400c28f120040107a +:107cd00000000000a800c483a800c38300a0023ce9 +:107ce00000190300b4014224211062000b004290ed +:107cf000ff00423002004234ff00433000a0023c4b +:107d000000210400b4014224211082000b0043a092 +:107d1000561f400b00000000a800c483a800c383c6 +:107d200000a0023c00190300b401422421106200ab +:107d30000b004290ff004330fdff0224241062003c +:107d4000ff00433000a0023c00210400b4014224a3 +:107d5000211082000b0043a02000c0a3ee1f400ba7 +:107d600000000000ac00c393030002242b00621447 +:107d700000000000b000c28f0000428c2800c2af9b +:107d80002800c28f1200401000000000a800c48329 +:107d9000a800c38300a0023c00190300b4014224e0 +:107da000211062000b004290ff004230100042346c +:107db000ff00433000a0023c00210400b401422433 +:107dc000211082000b0043a0841f400b0000000024 +:107dd000a800c483a800c38300a0023c00190300cc +:107de000b4014224211062000b004290ff00433096 +:107df000efff022424106200ff00433000a0023c89 +:107e000000210400b4014224211082000b0043a091 +:107e10002000c0a3ee1f400b00000000ac00c39385 +:107e2000040002242b00621400000000b000c28f86 +:107e30000000428c2c00c2af2c00c28f12004010f8 +:107e400000000000a800c483a800c38300a0023c77 +:107e500000190300b4014224211062000b0042907b +:107e6000ff00423040004234ff00433000a0023c9b +:107e700000210400b4014224211082000b0043a021 +:107e8000b21f400b00000000a800c483a800c383f9 +:107e900000a0023c00190300b4014224211062003a +:107ea0000b004290ff004330bfff02242410620009 +:107eb000ff00433000a0023c00210400b401422432 +:107ec000211082000b0043a02000c0a3ee1f400b36 +:107ed00000000000ac00c3930200022436006214cc +:107ee00000000000b400c2976400422c3200401031 +:107ef00000000000b000c28f3000c2afa800c293e3 +:107f00003400c2a3a800c38300a0023c00190300f0 +:107f1000b40142242110620006004294ffff423067 +:107f20003600c2a7ac00c2933500c2a3b400c2970a +:107f30003800c2af3400c22708004224212040008c +:107f40003000c58f64000624466a400f0000000020 +:107f50003400c2271000a0af1400a0af1800a0afdb +:107f60000200042451000524213040006c00072445 +:107f7000462e400f0000000021184000fdff0224a3 +:107f80000c006214000000003400c2271000a0aff3 +:107f90001400a0af1800a0af02000424d1000524f3 +:107fa000213040006c000724462e400f00000000e6 +:107fb0002000c2a32000c0a32000c28321e8c00388 +:107fc000a400bf8fa000be8fa800bd270800e0035b +:107fd00000000000c0ffbd273c00bfaf3800beafaf +:107fe00021f0a003214080002120a0002118c00022 +:107ff0004c00c7af5000c28f4000c8a34400c4a3c8 +:108000004800c3a33000c2a7faff02242000c2a385 +:108010004000c2834b004004000000004c00c28faf +:1080200048004010000000004000c38300a0023c54 +:1080300000190300b4014224211062000a0042909a +:10804000ff004330010002243e00621400000000e3 +:108050004400c393020002241400621400000000d4 +:108060004800c393020002240500621000000000d3 +:108070003000c397040002243200621400000000a4 +:108080004000c4834800c3933000c2972128600099 +:108090004c00c68f21384000101f400f0000000028 +:1080a0002000c2a35120400b000000003000c39705 +:1080b0000400022423006214000000004f00022488 +:1080c0002100c2a34800c2932900c2a34000c2936a +:1080d0002800c2a34c00c28f0000428c2400c2af13 +:1080e0004000c38300a0023c00190300b4014224f5 +:1080f0002110620006004294ffff42302a00c2a70e +:108100002100c3932400c2271000a0af1400a0af29 +:108110001800a0af02000424212860002130400094 +:1081200008000724462e400f000000002000c2a3d4 +:108130002000c2830300401000000000f7ff02246b +:108140002000c2a32000c28321e8c0033c00bf8fef +:108150003800be8f4000bd270800e003000000008b +:10816000f8ffbd270400beaf21f0a0032118a00036 +:108170002110c0001400c7af0800c4a30c00c3a3a3 +:108180001000c2a3faff022421e8c0030400be8f3e +:108190000800bd270800e00300000000c8ffbd275d +:1081a0003400bfaf3000beaf21f0a0033800c4af31 +:1081b0002110a0004000c6af3c00c2a3f1ff022482 +:1081c0002000c2a33800c28f17004010000000003a +:1081d0004000c28f14004010000000000100022483 +:1081e0002c00c2a73800c28f2400c2af4000c28f4b +:1081f0002800c2af3c00c2932e00c2a32400c227b5 +:108200001000a0af1400a0af1800a0af020004241b +:1082100052000524213040000c000724462e400f58 +:10822000000000002000c2a32000c28321e8c00398 +:108230003400bf8f3000be8f3800bd270800e00338 +:1082400000000000e0ffbd271c00bfaf1800beaf5c +:1082500021f0a003ab43400f0000000000a0023c4f +:10826000980844242128000020060624357a400f6f +:10827000000000001000c0af1e21400b00000000f5 +:1082800000a0043c1000c28f2118400040110300e0 +:1082900021184000c010030023104300c018020042 +:1082a000231862009808822421106200080040ac64 +:1082b0001000c28f21184000401103002118400017 +:1082c000c010030023104300c018020023186200ee +:1082d0000800632400a0023c980842242110620098 +:1082e0000400442400a0033c1000c28f98086524b9 +:1082f000211840004011030021184000c010030065 +:1083000023104300c0180200231062002110a200b5 +:108310000c0444ac1000c28f21184000401103002f +:1083200021184000c010030023104300c0180200b1 +:10833000231862000800632400a0023c980842242d +:10834000211062000400442400a0053c1000c28fec +:10835000211840004011030021184000c010030004 +:1083600023104300c0180200231862009808a224ba +:1083700021106200100444ac1000c28f211840008c +:108380004011030021184000c010030023104300d7 +:10839000c0180200231862001004632400a0023ced +:1083a00098084224211062000400442400a0053ce7 +:1083b0001000c28f21184000401103002118400016 +:1083c000c010030023104300c018020023186200ed +:1083d0009808a22421106200180644ac00a0043cb6 +:1083e0001000c28f211840004011030021184000e6 +:1083f000c010030023104300c018020023186200bd +:1084000098088224211062001806448c00a0033cc6 +:108410001000c28f98086524211840004011030005 +:1084200021184000c010030023104300c0180200b0 +:10843000231062002110a200140644ac00a0033ceb +:108440001000c28f980864242118400040110300d6 +:1084500021184000c010030023104300c018020080 +:1084600023106200211082001c0640ac1000c28f55 +:10847000010042241000c2af1000c28f80ff4018dc +:108480000000000000a0023c01000324980843ac57 +:1084900000a0023c9808422401000324040043acdd +:1084a00000a0023c6033442421280000d47d400f0a +:1084b0000000000000a0023c60334424d87a400f42 +:1084c000000000002120000080250524213000004c +:1084d00021380000ea21400f0000000021e8c0031d +:1084e0001c00bf8f1800be8f2000bd270800e003ce +:1084f00000000000e8ffbd271400bfaf1000beafb2 +:1085000021f0a0031800c4af1800c28f0200422857 +:10851000040040140000000021100000e421400b82 +:108520000000000000a0043c1800c28f2118400089 +:108530004011030021184000c01003002310430025 +:10854000c0180200231862009808822421106200db +:10855000080040ac1800c28f2118400040110300f1 +:1085600021184000c010030023104300c01802006f +:10857000231862000800632400a0023c98084224eb +:10858000211062000400442400a0033c1800c28fa4 +:10859000980865242118400040110300211840006c +:1085a000c010030023104300c01802002310620013 +:1085b0002110a2000c0444ac1800c28f2118400006 +:1085c0004011030021184000c01003002310430095 +:1085d000c0180200231862000800632400a0023cb7 +:1085e00098084224211062000400442400a0053ca5 +:1085f0001800c28f211840004011030021184000cc +:10860000c010030023104300c018020023186200aa +:108610009808a22421106200100444ac1800c28ff4 +:10862000211840004011030021184000c010030031 +:1086300023104300c01802002318620010046324b2 +:1086400000a0023c98084224211062000400442447 +:1086500000a0053c1800c28f211840004011030003 +:1086600021184000c010030023104300c01802006e +:10867000231862009808a22421106200180644ac56 +:1086800000a0043c1800c28f2118400040110300d4 +:1086900021184000c010030023104300c01802003e +:1086a0002318620098088224211062001806448c66 +:1086b00000a0033c1800c28f9808652421184000d0 +:1086c0004011030021184000c01003002310430094 +:1086d000c0180200231062002110a200140644ac4e +:1086e00000a0033c1800c28f9808642421184000a1 +:1086f0004011030021184000c01003002310430064 +:10870000c018020023106200211082001c0640ac39 +:1087100000a0023c9808438c010002241b00621454 +:108720000000000000a0033c1800c28f98086424d9 +:10873000211840004011030021184000c010030020 +:1087400023104300c0180200231062002110820091 +:108750000400428c060040100000000001000324c9 +:108760000700431000000000e321400b0000000060 +:108770000e47400f00000000e321400b0000000006 +:108780005047400f000000000000000001000224dc +:1087900021e8c0031400bf8f1000be8f1800bd2752 +:1087a0000800e00300000000c8ffbd273400bfaf91 +:1087b0003000beaf21f0a0033800c4af3c00c5af0d +:1087c0004000c6af4400c7af3800c28f0400401c51 +:1087d000000000003800c28f0400410400000000c7 +:1087e000050002246022400b0000000000a0043cb1 +:1087f0003800c28f211840004011030021184000aa +:10880000c010030023104300c018020023186200a8 +:1088100098088224211062000000438c0100022489 +:1088200056006214000000004000c28f0f00400498 +:108830000000000002004328060060140000000051 +:108840000200032406004310000000001b22400b1e +:10885000000000002000c0af1b22400b0000000001 +:10886000010002242000c2af000000004400c28fbb +:10887000010003240900431000000000020003244b +:108880000a004310000000000b004014000000002c +:108890002400c0af2e22400b000000000100022483 +:1088a0002400c2af2e22400b000000000200022470 +:1088b0002400c2af0000000000a0033c3800c28fbb +:1088c000980864242118400040110300211840003a +:1088d000c010030023104300c018020023106200e0 +:1088e000211082000400448c3800c28f21184000ff +:1088f0004011030021184000c01003002310430062 +:10890000c0180200231862000800632400a0023c83 +:108910009808422421106200040046243800c28fc7 +:10892000211840004011030021184000c01003002e +:1089300023104300c01802002318620007046324b8 +:1089400000a0023c98084224211062000400422446 +:108950003c00c38f1000a3af2000c38f1400a3af4f +:108960002400c38f1800a3af3800c58f2138400002 +:108970005944400f000000002800c2af2800c28ff9 +:1089800021e8c0033400bf8f3000be8f3800bd2700 +:108990000800e00300000000e0ffbd271c00bfaf9f +:1089a0001800beaf21f0a0032000c4af2400c5af63 +:1089b0002800c6af2000c28f2118400040110300dc +:1089c00021184000c010030023104300c01802000b +:1089d0002318620000a0023c980842242110620083 +:1089e0001400c2af2000c28f070041040000000045 +:1089f0002000c28f04004018000000002110000079 +:108a0000b322400b000000001000c0af9e22400bbc +:108a1000000000001400c28f1406428c2400c38f93 +:108a200000006380000043a0010043241400c28fb3 +:108a3000140643ac2400c28f010042242400c2afbc +:108a40001400c28f1406438c1400c28f13064224f4 +:108a50002b10430005004010000000001400c28fde +:108a6000140443241400c28f140643ac1000c28fb8 +:108a7000010042241000c2af1000c38f2800c28f33 +:108a80002a106200e3ff4014000000001400c28faf +:108a90001c06438c2800c28f211862001400c28f6c +:108aa0001c0643ac1400c28f1c06428c00024228f4 +:108ab0000500401400000000029d023c20f7442401 +:108ac000517d400f000000000100022421e8c00396 +:108ad0001c00bf8f1800be8f2000bd270800e003d8 +:108ae00000000000f0ffbd270c00beaf21f0a00386 +:108af0001000c4af1000c28f2118400040110300c5 +:108b000021184000c010030023104300c0180200c9 +:108b10002318620000a0023c980842242110620041 +:108b20000000c2af0000c28f1406438c0000c28f49 +:108b30001806428c0400621400000000211000009e +:108b4000f222400b000000000000c28f1806438c88 +:108b50000000c28f1406428c2b10620009004010e6 +:108b6000000000000000c28f1406428c2118400053 +:108b70000000c28f1806428c23106200f222400bc4 +:108b8000000000000000c28f13064224211840009c +:108b90000000c28f1806428c231062000400c2af8e +:108ba0000000c28f1406428c211840000000c28fc2 +:108bb00014044224231062000400c38f21106200b9 +:108bc0000400c2af0400c28f21e8c0030c00be8fb6 +:108bd0001000bd270800e00300000000f0ffbd27e3 +:108be0000c00beaf21f0a0031000c4af1400c5af4d +:108bf0001800c6af0400c0af00a0043c1000c28f34 +:108c0000211840004011030021184000c01003004b +:108c100023104300c0180200231862009808822421 +:108c2000211062001004448c00a0033c1000c28f8d +:108c300098086524211840004011030021184000c5 +:108c4000c010030023104300c0180200231062006c +:108c50002110a2000c04428c2b1082007d004010d9 +:108c60000000000000a0043c1000c28f211840004a +:108c70004011030021184000c010030023104300de +:108c8000c018020023186200980882242110620094 +:108c90001004428c212040001000c28f2118400097 +:108ca0004011030021184000c010030023104300ae +:108cb000c0180200231862000800632400a0023cd0 +:108cc00098084224211062000400422423208200dc +:108cd0001000c28f211840004011030021184000ed +:108ce000c010030023104300c018020023186200c4 +:108cf0000704632400a0023c98084224211062006b +:108d0000040042242128400000a0033c1000c28f30 +:108d100098086624211840004011030021184000e3 +:108d2000c010030023104300c0180200231062008b +:108d30002110c2000c04428c2310a20021188200d2 +:108d40001800c28f2a1062000101401000000000cc +:108d500000a0043c1000c28f211840004011030005 +:108d600021184000c010030023104300c018020067 +:108d7000231862009808822421106200080040ac89 +:108d80001000c28f2118400040110300211840003c +:108d9000c010030023104300c01802002318620013 +:108da0000800632400a0023c9808422421106200bd +:108db0000400442400a0033c1000c28f98086524de +:108dc000211840004011030021184000c01003008a +:108dd00023104300c0180200231062002110a200db +:108de0000c0444ac1000c28f211840004011030055 +:108df00021184000c010030023104300c0180200d7 +:108e0000231862000800632400a0023c9808422452 +:108e1000211062000400442400a0053c1000c28f11 +:108e2000211840004011030021184000c010030029 +:108e300023104300c0180200231862009808a224df +:108e400021106200100444ac04000224c324400b2f +:108e50000000000000a0033c1000c28f98086424aa +:108e6000211840004011030021184000c0100300e9 +:108e700023104300c018020023106200211082005a +:108e80000c04448c00a0053c1000c28f2118400047 +:108e90004011030021184000c010030023104300bc +:108ea000c0180200231862009808a2242110620052 +:108eb0001004428c2b108200600040100000000063 +:108ec00000a0043c1000c28f211840004011030094 +:108ed00021184000c010030023104300c0180200f6 +:108ee0002318620098088224211062001004428c2a +:108ef0002120400000a0033c1000c28f9808652488 +:108f0000211840004011030021184000c010030048 +:108f100023104300c0180200231062002110a20099 +:108f20000c04428c231882001800c28f2a106200a1 +:108f3000870040100000000000a0043c1000c28f19 +:108f4000211840004011030021184000c010030008 +:108f500023104300c01802002318620098088224de +:108f600021106200080040ac1000c28f21184000a0 +:108f70004011030021184000c010030023104300db +:108f8000c0180200231862000800632400a0023cfd +:108f900098084224211062000400442400a0033ced +:108fa0001000c28f9808652421184000401103006a +:108fb00021184000c010030023104300c018020015 +:108fc000231062002110a2000c0444ac1000c28fd8 +:108fd000211840004011030021184000c010030078 +:108fe00023104300c0180200231862000800632405 +:108ff00000a0023c9808422421106200040044248e +:1090000000a0053c1000c28f211840004011030051 +:1090100021184000c010030023104300c0180200b4 +:10902000231862009808a22421106200100444aca6 +:1090300004000224c324400b000000001800c28f6b +:1090400000044228420040140000000000a0043c3c +:109050001000c28f21184000401103002118400069 +:10906000c010030023104300c01802002318620040 +:109070009808822421106200080040ac1000c28fc2 +:10908000211840004011030021184000c0100300c7 +:1090900023104300c0180200231862000800632454 +:1090a00000a0023c980842242110620004004424dd +:1090b00000a0033c1000c28f9808652421184000ce +:1090c0004011030021184000c0100300231043008a +:1090d000c0180200231062002110a2000c0444ac4e +:1090e0001000c28f211840004011030021184000d9 +:1090f000c010030023104300c018020023186200b0 +:109100000800632400a0023c980842242110620059 +:109110000400442400a0053c1000c28f2118400028 +:109120004011030021184000c01003002310430029 +:10913000c0180200231862009808a22421106200bf +:10914000100444ac04000224c324400b00000000bf +:109150000000c0afb024400b000000001000c28f20 +:10916000211840004011030021184000c0100300e6 +:1091700023104300c018020023186200080463246f +:1091800000a0023c980842242110620004004424fc +:1091900000a0033c1000c28f9808652421184000ed +:1091a0004011030021184000c010030023104300a9 +:1091b000c0180200231062002110a2000c04428c8f +:1091c0001400c38f00006380000043a0010042240c +:1091d000000082ac1400c28f010042241400c2af10 +:1091e00000a0033c1000c28f98086424211840009e +:1091f0004011030021184000c01003002310430059 +:10920000c018020023106200211082000c04448c5c +:109210001000c28f211840004011030021184000a7 +:10922000c010030023104300c0180200231862007e +:109230000704632400a0023c980842242110620025 +:10924000040042242b1044001a00401000000000cb +:109250001000c28f21184000401103002118400067 +:10926000c010030023104300c0180200231862003e +:109270000800632400a0023c9808422421106200e8 +:109280000400442400a0033c1000c28f9808652409 +:10929000211840004011030021184000c0100300b5 +:1092a00023104300c0180200231062002110a20006 +:1092b0000c0444ac0000c28f010042240000c2af85 +:1092c0000000c38f1800c28f2a106200a3ff401451 +:1092d0000000000000a0043c1000c28f21184000d4 +:1092e0004011030021184000c01003002310430068 +:1092f000c01802002318620098088224211062001e +:1093000001000324080043ac0400c28f21e8c0031d +:109310000c00be8f1000bd270800e0030000000015 +:10932000f8ffbd270400beaf21f0a0030800c4afc2 +:109330000c00c5af00a0043c0800c28f21184000fb +:109340004011030021184000c01003002310430007 +:10935000c0180200231862009808822421106200bd +:109360001004438c0c00c28f212062000800c28fc1 +:10937000211840004011030021184000c0100300d4 +:1093800023104300c0180200231862000800632461 +:1093900000a0023c980842242110620004004224ec +:1093a000000442242b1082001d0040100000000029 +:1093b00000a0043c0800c28f2118400040110300a7 +:1093c00021184000c010030023104300c018020001 +:1093d0002318620098088224211062001004438c34 +:1093e0000c00c28f2120620000a0053c0800c28f43 +:1093f000211840004011030021184000c010030054 +:1094000023104300c0180200231862009808a22409 +:1094100021106200100444ac4225400b0000000003 +:1094200000a0043c0800c28f211840004011030036 +:1094300021184000c010030023104300c018020090 +:109440002318620098088224211062001004428cc4 +:10945000212040000800c28f211840004011030065 +:1094600021184000c010030023104300c018020060 +:10947000231862000800632400a0023c98084224dc +:1094800021106200040042240004422423108200c0 +:109490000c00c38f211062000c00c2af0800c28f05 +:1094a000211840004011030021184000c0100300a3 +:1094b00023104300c0180200231862000800632430 +:1094c00000a0023c980842242110620004004324ba +:1094d0000c00c28f2120620000a0053c0800c28f52 +:1094e000211840004011030021184000c010030063 +:1094f00023104300c0180200231862009808a22419 +:1095000021106200100444ac00a0043c0800c28f8b +:10951000211840004011030021184000c010030032 +:1095200023104300c0180200231862009808822408 +:10953000211062001004448c00a0033c0800c28f7c +:1095400098086524211840004011030021184000ac +:10955000c010030023104300c01802002310620053 +:109560002110a2000c04428c1000821000000000a8 +:1095700000a0043c0800c28f2118400040110300e5 +:1095800021184000c010030023104300c01802003f +:10959000231862009808822421106200010003242d +:1095a000080043ac7725400b0000000000a0043cfd +:1095b0000800c28f2118400040110300211840000c +:1095c000c010030023104300c018020023186200db +:1095d0009808822421106200080040ac0100022497 +:1095e00021e8c0030400be8f0800bd270800e00387 +:1095f00000000000c0fdbd273c02bfaf3802beaf77 +:1096000021f0a0031800c0afcd45400f00000000be +:109610001800c0afe926400b0000000000a0043c89 +:109620001800c28f2118400040110300211840008b +:10963000c010030023104300c0180200231862006a +:1096400098088224211062000800428ccd0040104e +:109650000000000000a0033c1800c28f980864249a +:10966000211840004011030021184000c0100300e1 +:1096700023104300c0180200231062002110820052 +:109680000c04428c2800c2af00a0043c1800c28f1a +:10969000211840004011030021184000c0100300b1 +:1096a00023104300c0180200231862009808822487 +:1096b000211062001004438c2800c28f2b1062001e +:1096c00012004010000000002800c48f00a0053cdc +:1096d0001800c28f211840004011030021184000db +:1096e000c010030023104300c018020023186200ba +:1096f0009808a224211062001004428c23108200da +:109700002000c2aff025400b000000001800c28fff +:10971000211840004011030021184000c010030030 +:1097200023104300c01802002318620008006324bd +:1097300000a0023c98084224211062000400422448 +:10974000000442242120400000a0053c1800c28fe4 +:10975000211840004011030021184000c0100300f0 +:1097600023104300c0180200231862009808a224a6 +:10977000211062001004428c232082002800c58f33 +:109780001800c28f2118400040110300211840002a +:10979000c010030023104300c01802002318620009 +:1097a0000800632400a0023c9808422421106200b3 +:1097b000040042242310a200211082002000c2af26 +:1097c00000a0043c1800c28f211840004011030083 +:1097d00021184000c010030023104300c0180200ed +:1097e0002318620098088224211062000000428c35 +:1097f000440040100000000000a0043c1800c28f8c +:10980000211840004011030021184000c01003003f +:1098100023104300c0180200231862009808822415 +:1098200021106200080040ac00a0043c1800c28f68 +:10983000211840004011030021184000c01003000f +:1098400023104300c01802002318620098088224e5 +:10985000211062001004448c00a0033c1800c28f49 +:109860009808652421184000401103002118400089 +:10987000c010030023104300c01802002310620030 +:109880002110a2000400468c1800c28f211840004d +:109890004011030021184000c010030023104300b2 +:1098a000c0180200231862000800632400a0023cd4 +:1098b0009808422421106200040047241800c28f37 +:1098c000211840004011030021184000c01003007f +:1098d00023104300c0180200231862000704632409 +:1098e00000a0023c98084224211062000400422497 +:1098f0001000a2af2000c58fe144400f000000001f +:109900001c00c2af1c00c28f020003240a004310d7 +:10991000000000000300432816006014000000004f +:109920000300032416004310000000000400032479 +:10993000140043140000000000a0043c1800c28f73 +:10994000211840004011030021184000c0100300fe +:1099500023104300c01802002318620098088224d4 +:109960002110620001000324080043ac6126400b73 +:1099700000000000000000006126400b0000000015 +:10998000000000001800c48fb922400f0000000042 +:109990002c00c2af2c00c28f7f00401800000000d6 +:1099a0002400c0afc226400b000000001800c28f88 +:1099b000211840004011030021184000c01003008e +:1099c00023104300c0180200231862001806632405 +:1099d00000a0023c980842242120620000a0053c1f +:1099e0001800c28f211840004011030021184000c8 +:1099f000c010030023104300c018020023186200a7 +:109a00009808a224211062001806428c00004580ac +:109a10002400c38f1800c6272118c3001c0065a0ae +:109a200001004224000082ac00a0043c1800c28f58 +:109a3000211840004011030021184000c01003000d +:109a400023104300c01802002318620098088224e3 +:109a5000211062001806448c1800c28f21184000a3 +:109a60004011030021184000c010030023104300e0 +:109a7000c0180200231862000f06632400a0023cf5 +:109a80009808422421106200040042242b10440054 +:109a90001a004010000000001800c28f211840007a +:109aa0004011030021184000c010030023104300a0 +:109ab000c0180200231862001004632400a0023cb6 +:109ac00098084224211062000400442400a0053cb0 +:109ad0001800c28f211840004011030021184000d7 +:109ae000c010030023104300c018020023186200b6 +:109af0009808a22421106200180644ac2400c28fea +:109b0000010042242400c2af2400c38f2c00c28f66 +:109b10002a106200a5ff40140000000000a0033cd2 +:109b20001800c28f980864242118400040110300d7 +:109b300021184000c010030023104300c018020089 +:109b400023106200211082001c06438c2c00c28f5f +:109b50002320620000a0033c1800c28f98086524ef +:109b6000211840004011030021184000c0100300dc +:109b700023104300c0180200231062002110a2002d +:109b80001c0644ac1800c28f030040140000000003 +:109b90003000c0af3000c0af1800c28f01004224b7 +:109ba0001800c2af1800c28f9cfe401800000000d1 +:109bb0000100022421e8c0033c02bf8f3802be8f9f +:109bc0004002bd270800e00300000000e0ffbd27c1 +:109bd0001c00bfaf1800beaf21f0a0032000c4af2f +:109be0001000c0af0027400b000000007d25400f93 +:109bf000000000001000c28f010042241000c2af1c +:109c00001000c38f2000c28f2b106200f7ff40149a +:109c10000000000021e8c0031c00bf8f1800be8fa9 +:109c20002000bd270800e00300000000e8ffbd277a +:109c30001400bfaf1000beaf21f0a0031800c4afe6 +:109c40001800c28f0800401800000000211000001a +:109c50002a27400b000000007d25400f0000000077 +:109c60001b27400b000000000000000000a0043c87 +:109c70001800c28f21184000401103002118400035 +:109c8000c010030023104300c01802002318620014 +:109c900098088224211062000800428ceeff4014d4 +:109ca000000000000100022421e8c0031400bf8f5f +:109cb0001000be8f1800bd270800e0030000000060 +:109cc000d8ffbd272400bfaf2000beaf21f0a00306 +:109cd0002800c4af1000c0a32800c28f1400c2af78 +:109ce0003e27400b00000000000000003e27400b14 +:109cf0000000000000000000a01404241400c58f20 +:109d00006968400f000000001400c28f110040106d +:109d1000000000001800c0af1800c227a0140424df +:109d2000212840005968400f000000001000c2a325 +:109d30001000c283ecff4014000000001800c38f25 +:109d40001400c28febff6214000000005627400b86 +:109d500000000000000000002110000021e8c00306 +:109d60002400bf8f2000be8f2800bd270800e0031d +:109d700000000000d0ffbd272c00bfaf2800beaf01 +:109d800021f0a0031000c0a31400c0afc80002243b +:109d90001800c2af010004246270400f00000000f0 +:109da0001c00c22701000424212840005968400fec +:109db000000000001000c2a31000c2830400401085 +:109dc000000000001000c283e727400b00000000e5 +:109dd0001c00c28f020042340100042421284000ec +:109de0006968400f000000001800c28f0400401096 +:109df000000000001800c28fffff42241800c2af0d +:109e0000010004246270400f000000002080838f56 +:109e10002000c22721206000212840005968400fff +:109e2000000000001000c2a31000c283070040140d +:109e3000000000001000c2831b004014000000005e +:109e40002000c28f18004014000000002080828f84 +:109e50000f00032408004310000000001300032437 +:109e600009004314000000000f000224208082af8c +:109e7000a427400b000000000e000224208082afc7 +:109e8000a427400b00000000208080af00000000ed +:109e90002080828f04004010000000001800c28f54 +:109ea000d1ff4014000000002080828f0400401485 +:109eb000000000001000c283e727400b00000000f4 +:109ec0001400c0afbf27400b000000001800c28f75 +:109ed000ffff42241800c2af020004246270400f4a +:109ee000000000002080838f2000c2272120600016 +:109ef000212840005968400f000000002000c28f58 +:109f0000040042300e004014000000001400c28f14 +:109f1000010042241400c2af1400c38f03000224c6 +:109f20001b006200f4014000101000000400401407 +:109f3000000000001800c28fe4ff40140000000081 +:109f40002000c28f040042300700401400000000cf +:109f50001c00c28f0200423401000424212840006a +:109f60006968400f000000002000c28f04004230ea +:109f700004004014000000001800c28f94ff401439 +:109f8000000000001800c28f030040140000000011 +:109f9000fbff02241000c2a31000c28321e8c0030b +:109fa0002c00bf8f2800be8f3000bd270800e003c3 +:109fb00000000000e0ffbd271c00bfaf1800beafcf +:109fc00021f0a0031000c0af010004241000c2273c +:109fd000212840005968400f000000001000c28f87 +:109fe000020042300a004010000000001000c38f41 +:109ff000fdff0224241062001000c2af1000c28fc7 +:10a0000001000424212840006968400f000000007e +:10a0100021e8c0031c00bf8f1800be8f2000bd27a1 +:10a020000800e00300000000e8ffbd271400bfaff8 +:10a030001000beaf21f0a00306000424db000524bd +:10a040006968400f00000000070004240600052492 +:10a050006968400f000000000a0004246270400f8d +:10a060000000000080140424212800006968400fcb +:10a070000000000084140424212800006968400fb7 +:10a08000000000000a0004246270400f000000007d +:10a0900006000424212800006968400f0000000029 +:10a0a00007000424212800006968400f0000000018 +:10a0b00021e8c0031400bf8f1000be8f1800bd2719 +:10a0c0000800e00300000000e0ffbd271c00bfaf58 +:10a0d0001800beaf21f0a0031400c2270814042406 +:10a0e000212840005968400f000000001000c2a362 +:10a0f0001000c2830400401000000000faff022498 +:10a100006e28400b000000001400c28f0001423492 +:10a110001400c2af1400c28f081404242128400088 +:10a120006968400f000000001000c2a31000c28345 +:10a130000400401000000000faff02246e28400bcb +:10a14000000000001400c227001a04242128400047 +:10a150005968400f000000001000c2a31000c28325 +:10a160000400401000000000faff02246e28400b9b +:10a17000000000001400c38f0100023c25106200a3 +:10a180001400c2af1400c28f001a0424212840001a +:10a190006968400f000000001000c2a31000c283d5 +:10a1a0000400401000000000faff02246e28400b5b +:10a1b000000000002110000021e8c0031c00bf8f38 +:10a1c0001800be8f2000bd270800e003000000003b +:10a1d000e0ffbd271c00bfaf1800beaf21f0a003f9 +:10a1e0000c00023c0c004434212800006968400f38 +:10a1f000000000008c100424212800006968400f32 +:10a20000000000000200023cac074434212800009a +:10a210006968400f000000001400c22718110424d0 +:10a22000212840005968400f000000001000c2a320 +:10a230001000c2830300401000000000faff022457 +:10a240001000c2a31400c28f010042341400c2af38 +:10a250001400c28f18110424212840006968400f9f +:10a26000000000001000c2a31500023c140044349a +:10a27000010005246968400f000000001000c2a31f +:10a280001400c22700140424212840005968400ffc +:10a2900000000000ff0043301000c2932110620054 +:10a2a000ff0042301000c2a31400c28f00044230ed +:10a2b0000f004010000000001400c38ffffb0224b9 +:10a2c000241062001400c2af1400c28f00140424d2 +:10a2d000212840006968400f00000000ff00433063 +:10a2e0001000c29321106200ff0042301000c2a390 +:10a2f0001400c28f000442341400c2af1400c28f95 +:10a3000000140424212840006968400f0000000068 +:10a31000ff0043301000c29321106200ff00423062 +:10a320001000c2a3010004246270400f000000006e +:10a330001000c28321e8c0031c00bf8f1800be8f2d +:10a340002000bd270800e00300000000e0ffbd275b +:10a350001c00bfaf1800beaf21f0a003ac80828ffd +:10a36000790040140000000000100424ac80852710 +:10a370005968400f00000000050040100000000078 +:10a38000ac8080af211000005329400b000000007a +:10a39000f41304241000c227212840005968400ffc +:10a3a000000000000500401000000000ac8080affd +:10a3b000211000005329400b00000000ac80838f67 +:10a3c0001000023ca00242340a00621400000000a7 +:10a3d0001000c38f01000224410062100000000041 +:10a3e0001000023ca1024234ac8082af3829400bfd +:10a3f00000000000ac80838f1000023cb0024234a9 +:10a4000013006214000000001000c38f0300022438 +:10a4100033006210000000001000c38f040002240b +:10a4200006006214000000001000023cb102423439 +:10a43000ac8082af3829400b000000001000023cc5 +:10a44000b2024234ac8082af3829400b00000000d9 +:10a45000ac80838f1000023cf00042342000621474 +:10a46000000000003b00043cac8085275968400f89 +:10a47000000000000500401000000000ac8080af2c +:10a48000211000005329400b00000000ac80838f96 +:10a490003000023cd0004234110062140000000081 +:10a4a0001000c38f060002240600621400000000a2 +:10a4b0003000023cd1004234ac8082af3829400bde +:10a4c000000000001000c38f020002240400621488 +:10a4d000000000003000023cd2004234ac8082af69 +:10a4e000ac80838ff000023c241862003000023cf4 +:10a4f0000c00621400000000ac80838ff0ff023c6f +:10a50000ffff423424106200ac8082afac80838fa6 +:10a510000400023c25106200ac8082af5229400b3f +:10a5200000000000ac80838ff0ff023cffff42344c +:10a5300024106200ac8082afac80838f0500023ca7 +:10a5400025106200ac8082afac80828f21e8c0030e +:10a550001c00bf8f1800be8f2000bd270800e0033d +:10a5600000000000e0ffbd271c00bfaf1800beaf19 +:10a5700021f0a003f41304241000c2272128400076 +:10a580005968400f00000000050040100000000066 +:10a590001000c0af211000006929400b000000002e +:10a5a0001000c28f21e8c0031c00bf8f1800be8faf +:10a5b0002000bd270800e00300000000e8ffbd27e1 +:10a5c0001400bfaf1000beaf21f0a003d328400f8e +:10a5d00000000000ff0f4230b002422c0600401481 +:10a5e00000000000481e042484b7023cce694534b4 +:10a5f0006968400f0000000021e8c0031400bf8f0d +:10a600001000be8f1800bd270800e0030000000006 +:10a61000e0ffbd271c00bfaf1800beaf21f0a003b4 +:10a62000281404244b68400f000000001000c2af43 +:10a630001000c38ffeff0224241062001000c2af7e +:10a64000281404241000c58f6968400f0000000022 +:10a650001000c28f010042341000c2af281404243d +:10a660001000c58f6968400f0000000021e8c0039a +:10a670001c00bf8f1800be8f2000bd270800e0031c +:10a6800000000000e0ffbd271c00bfaf1800beaff8 +:10a6900021f0a0031c1404244b68400f00000000ac +:10a6a0001000c2af1000c28f040042341000c2afcd +:10a6b0001c1404241000c58f6968400f00000000be +:10a6c0008429400f0000000021e8c0031c00bf8f58 +:10a6d0001800be8f2000bd270800e0030000000026 +:10a6e000e0ffbd271c00bfaf1800beaf21f0a003e4 +:10a6f0001000c0a35d27400f000000001000c2a39f +:10a700001000c28304004010000000001000c2834b +:10a71000c729400b000000001000c28321e8c003dd +:10a720001c00bf8f1800be8f2000bd270800e0036b +:10a7300000000000e0ffbd271c00bfaf1800beaf47 +:10a7400021f0a0031000c0a31400c0afb829400f2f +:10a75000000000001000c2a31000c28304004010db +:10a76000000000001000c2832c2a400b00000000f3 +:10a77000322a400f000000001400c22718110424e0 +:10a78000212840005968400f000000001000c2a3bb +:10a790001000c2830300401000000000faff0224f2 +:10a7a0001000c2a31400c28f010042341400c2afd3 +:10a7b0001400c28f18110424212840006968400f3a +:10a7c000000000001000c2a31400c22700140424db +:10a7d000212840005968400f00000000ff0043306e +:10a7e0001000c29321106200ff0042301000c2a38b +:10a7f0001400c28f00044230190040100000000015 +:10a800001400c38ffffb0224241062001400c2afa7 +:10a810001400c28f00140424212840006968400fee +:10a8200000000000ff0043301000c29321106200be +:10a83000ff0042301000c2a31400c22700140424f9 +:10a84000212840005968400f00000000ff004330fd +:10a850001000c29321106200ff0042301000c2a31a +:10a860000c00023c0c004434212800006968400fb1 +:10a87000000000008c100424212800006968400fab +:10a88000000000000200023cac0744342128000014 +:10a890006968400f00000000081404241111023cf4 +:10a8a000001045346968400f000000001000c283aa +:10a8b00021e8c0031c00bf8f1800be8f2000bd27f9 +:10a8c0000800e00300000000e0ffbd271c00bfaf50 +:10a8d0001800beaf21f0a0031000c0a30014042490 +:10a8e000212800006968400f00000000ff0043308d +:10a8f0001000c29321106200ff0042301000c2a37a +:10a90000320004246270400f000000006f29400fe5 +:10a91000000000001000c28321e8c0031c00bf8fac +:10a920001800be8f2000bd270800e00300000000d3 +:10a93000d8ffbd272400bfaf2000beaf21f0a00389 +:10a94000211080002800c2a31000c0a31400c0afd3 +:10a950001800c0af1400c0af141004244b68400f9f +:10a96000000000001400c2af1400c28f0e004104aa +:10a97000000000000200023cbc0744344b68400f5a +:10a98000000000001400c2af1400c28f010042306a +:10a990001400c2af1400c28f080040100000000075 +:10a9a0008a2a400b00000000010004246270400f5e +:10a9b00000000000562a400b000000001400c0af49 +:10a9c000852a400b00000000010004246270400f43 +:10a9d000000000000c00023c0c0044344b68400fa7 +:10a9e000000000001400c2af1800c28f0100422412 +:10a9f0001800c2af1800c28fd107422c05004014c6 +:10aa000000000000fbff02241000c2a3a82a400b94 +:10aa1000000000001400c38fad10023c9ed04234f1 +:10aa2000e9ff6214000000002800c3930200022422 +:10aa300007006214000000000200023cac0744342e +:10aa40001c3c023c7dd545346968400f0000000085 +:10aa5000d328400f00000000ff0f4330a003022462 +:10aa60000600621400000000020004243027400f9a +:10aa700000000000a22a400b00000000212000007e +:10aa80003027400f000000000c00023c0c00443452 +:10aa900052ef023c612f45346968400f000000000e +:10aaa0001000c28321e8c0032400bf8f2000be8fa6 +:10aab0002800bd270800e00300000000d0ffbd27ec +:10aac0002c00bfaf2800beaf21f0a00321108000f2 +:10aad0003000c2a31000c0a31800c0af1400c0af64 +:10aae0008c1002241c00c2af5302023c36264234b2 +:10aaf0002000c2af3000c39302000224220062147f +:10ab0000000000000200023cac0742341c00c2af4f +:10ab10005dd7023cc3c142342000c2afe32a400be0 +:10ab200000000000020004246270400f00000000da +:10ab30001c00c38f1800c22721206000212840007c +:10ab40005968400f000000000400401000000000a1 +:10ab50002000c28f0100422c1800c2af1400c28f27 +:10ab6000010042241400c2af1400c28fd107422c4e +:10ab70000600401400000000fbff02241000c2a3e6 +:10ab8000f02a400b00000000000000002000c38fee +:10ab90001800c28fe3ff6214000000002000c38f82 +:10aba0005302023c362642340500621400000000c5 +:10abb0008c100424212800006968400f0000000068 +:10abc0001000c28321e8c0032c00bf8f2800be8f75 +:10abd0003000bd270800e00300000000e0ffbd27b3 +:10abe0001c00bfaf1800beaf21f0a0031400c0af1f +:10abf0000a0002241100c2a31400c2270014042476 +:10ac0000212840005968400f000000001000c2a336 +:10ac10001400c38ffffb0224241062001400c2af93 +:10ac20001400c28f00140424212840006968400fda +:10ac3000000000001000c2a31000c28304004010f6 +:10ac4000000000001000c283382b400b0000000001 +:10ac50001400c22700140424212840005968400f22 +:10ac6000000000001000c2a31000c28304004010c6 +:10ac7000000000001000c283382b400b00000000d1 +:10ac80001400c28f00044230130040100000000086 +:10ac90001400c38ffffb0224241062001400c2af13 +:10aca0001400c28f00140424212840006968400f5a +:10acb000000000001000c2a31100c293ffff422455 +:10acc0001100c2a31100c293e1ff40140000000074 +:10acd000372b400b00000000000000001000c28372 +:10ace00021e8c0031c00bf8f1800be8f2000bd27c5 +:10acf0000800e00300000000e0ffbd271c00bfaf1c +:10ad00001800beaf21f0a003211880002110a00080 +:10ad10002000c3a32400c2a31400c2270200033ce6 +:10ad200008016434212840005968400f00000000e9 +:10ad30001000c2a31000c2831c00401400000000d9 +:10ad40002400c29309004010000000002000c293bc +:10ad500001000324041843001400c28f2510620070 +:10ad60001400c2af622b400b000000002000c29311 +:10ad70000100032404104300271802001400c28fae +:10ad8000241062001400c2af1400c28f0200033c02 +:10ad900008016434212840006968400f0000000069 +:10ada0001000c2a36c2b400b00000000000000004c +:10adb0001000c28321e8c0031c00bf8f1800be8fa3 +:10adc0002000bd270800e00300000000e0ffbd27d1 +:10add0001c00bfaf1800beaf21f0a00321188000f7 +:10ade0002110a0002000c3a32400c2a31400c22786 +:10adf0000200033c00016434212840005968400fe0 +:10ae0000000000001000c2a31000c2831c00401408 +:10ae1000000000002400c293090040100000000060 +:10ae20002000c29301000324041843001400c28fc1 +:10ae3000251062001400c2af972b400b00000000e9 +:10ae40002000c293010003240410430027180200cd +:10ae50001400c28f241062001400c2af1400c28f0d +:10ae60000200033c00016434212840006968400f5f +:10ae7000000000001000c2a3a12b400b0000000046 +:10ae8000000000001000c28321e8c0031c00bf8f37 +:10ae90001800be8f2000bd270800e003000000005e +:10aea000e0ffbd271c00bfaf1800beaf21f0a0031c +:10aeb000211080002400c5af2000c2a31400c227c7 +:10aec0000200033c04016434212840005968400f0b +:10aed000000000001000c2a31000c2830b00401449 +:10aee000000000001400c38f2000c293061043002e +:10aef000ff00423001004230ff0043302400c28f87 +:10af0000000043a0c42b400b000000000000000024 +:10af10001000c28321e8c0031c00bf8f1800be8f41 +:10af20002000bd270800e00300000000e0ffbd276f +:10af30001c00bfaf1800beaf21f0a0032000c4afbb +:10af40002110a0002400c2a31400c2272c14042442 +:10af5000212840005968400f000000001000c2a3e3 +:10af60001000c28317004014000000002400c293a8 +:10af700008004010000000002000c28f27180200c7 +:10af80001400c28f241062001400c2afe92b400be2 +:10af9000000000001400c38f2000c28f2510620043 +:10afa0001400c2af1400c28f2c14042421284000c6 +:10afb0006968400f000000001000c2a3f22b400b94 +:10afc00000000000000000001000c28321e8c00360 +:10afd0001c00bf8f1800be8f2000bd270800e003b3 +:10afe00000000000d0ffbd272c00bfaf2800beaf7f +:10aff00021f0a0033000c4af3400c5af2000c0afc3 +:10b000002400c0af1400c2279c140424212840004f +:10b010005968400f000000001000c2a31000c28356 +:10b0200038004014000000001400c38f0300023ced +:10b03000251862002000c22721206000212840003e +:10b04000080006248d68400f000000001000c2a315 +:10b050001000c2832e004014000000002000c28fa8 +:10b060001400c2af1400c38fffff023c2410620023 +:10b0700008004014000000003000c48f21280000a8 +:10b0800006000624836a400f00000000452c400b98 +:10b09000000000001400c28f021402001400c2afae +:10b0a0001400c38f0300023c251862001800c22759 +:10b0b0002120600021284000060006248d68400ff2 +:10b0c000000000001000c2a31800c2273000c48f87 +:10b0d0002128400006000624466a400f00000000b8 +:10b0e0003400c28f04004010000000003400c28f02 +:10b0f00001000324000043a01000c2834b2c400b2e +:10b100000000000000000000452c400b0000000083 +:10b11000000000003400c28f030040100000000057 +:10b120003400c28f000040a01000c28321e8c00399 +:10b130002c00bf8f2800be8f3000bd270800e00321 +:10b1400000000000d0ffbd272c00bfaf2800beaf1d +:10b1500021f0a0033000c4af2000c0af2400c0af76 +:10b160001400c2279c140424212840005968400f71 +:10b17000000000001000c2a31000c283260040148b +:10b18000000000001400c38f0300023c2518620079 +:10b190002000c2272120600021284000080006244a +:10b1a0008d68400f000000001000c2a31000c28391 +:10b1b0001c004014000000002000c28f1400c2af29 +:10b1c0001400c28fffff42301400c2af1400c38fbf +:10b1d0000300023c251862001800c22721206000ed +:10b1e00021284000060006248d68400f0000000062 +:10b1f0001000c2a31800c2273000c48f21284000cd +:10b2000006000624466a400f000000001000c283ba +:10b210008b2c400b00000000000000008a2c400b2b +:10b2200000000000000000001000c28321e8c003fd +:10b230002c00bf8f2800be8f3000bd270800e00320 +:10b2400000000000f8ffbd270400beaf21f0a003fe +:10b250006b808293ff00423001004224ff004230a5 +:10b260006b8082a321e8c0030400be8f0800bd27c5 +:10b270000800e00300000000e0ffbd271c00bfaf96 +:10b280001800beaf21f0a0031000c0a301000424e9 +:10b290007b70400f00000000d328400f000000002a +:10b2a00021184000f0ff023c00f0423424186200f4 +:10b2b0003000023c0800621400000000a8100424c2 +:10b2c000010005246968400f000000001000c2a3bf +:10b2d000cb2c400b000000001400c2277010042487 +:10b2e000212840005968400f000000001000c2a350 +:10b2f0001000c2830c004014000000001400c28f34 +:10b30000020042341400c2af1400c28f7010042433 +:10b31000212840006968400f000000001000c2a30f +:10b32000cb2c400b00000000000000001000c28386 +:10b3300021e8c0031c00bf8f1800be8f2000bd276e +:10b340000800e00300000000f8ffbd270400beafc6 +:10b3500021f0a003211880002110a0001000c6af2a +:10b360000800c3a30c00c2a721e8c0030400be8fdd +:10b370000800bd270800e00300000000e0ffbd2733 +:10b380001c00bfaf1800beaf21f0a0031000c0a387 +:10b3900069808293ff0042301900401400000000d1 +:10b3a00068808293ff00433003000224060062108d +:10b3b0000000000068808293ff00433004000224f4 +:10b3c0000f006214000000005d27400f0000000025 +:10b3d0001000c2a31000c28310004014000000003f +:10b3e00074100424785605246968400f000000009a +:10b3f0001000c2a31000c2830b0040140000000024 +:10b4000069808293ff00423001004224ff004230f5 +:10b41000698082a30b2d400b00000000000000009b +:10b420000b2d400b00000000000000001000c28344 +:10b4300021e8c0031c00bf8f1800be8f2000bd276d +:10b440000800e00300000000f8ffbd270400beafc5 +:10b4500021f0a003211080000800c2a30800c293bd +:10b46000688082a321e8c0030400be8f0800bd27c6 +:10b470000800e00300000000f8ffbd270400beaf95 +:10b4800021f0a00368808293ff00423021e8c003ce +:10b490000400be8f0800bd270800e0030000000084 +:10b4a000e0ffbd271c00bfaf1800beaf21f0a00316 +:10b4b0001000c0a369808293ff0042300600401054 +:10b4c0000000000069808293ff004230ffff4224a9 +:10b4d000ff004230698082a369808293ff0042307e +:10b4e000310040140000000068808293ff00433068 +:10b4f00003000224060062100000000068808293ae +:10b50000ff00433004000224270062140000000002 +:10b510001400c0af74100424214305246968400f4f +:10b52000000000001000c2a31000c2831a004014e3 +:10b53000000000001400c22701000424212840005c +:10b540005968400f000000001000c2a31000c28321 +:10b5500014004014000000001400c28f02004230aa +:10b5600011004010000000001400c38ffdff0224f2 +:10b57000241062001400c2af1400c28f0100042422 +:10b58000212840006968400f000000001000c2a39d +:10b590006a2d400b00000000000000006a2d400be7 +:10b5a00000000000000000001000c28321e8c0037a +:10b5b0001c00bf8f1800be8f2000bd270800e003cd +:10b5c00000000000e8ffbd271400bfaf1000beafb1 +:10b5d00021f0a0031800c4af708080af748080afea +:10b5e000698080a3688080a36b8080a3019d023c5a +:10b5f00044b244247070400f000000006d8080a3ae +:10b6000003000424019d023c48b345246031400fef +:10b61000000000002110000021e8c0031400bf8fcb +:10b620001000be8f1800bd270800e00300000000d6 +:10b63000e0ffbd271c00bfaf1800beaf21f0a00384 +:10b640002000c4af1000c0a3df2c400f000000009a +:10b650001000c2a3688080a3698080a36a8080a351 +:10b660006b8080a3708080af748080af788080af63 +:10b67000808080af1000c28321e8c0031c00bf8f10 +:10b680001800be8f2000bd270800e0030000000066 +:10b69000f0ffbd270c00beaf21f0a00321108000f9 +:10b6a0001000c2a7f3ff02240000c2a31000c2973b +:10b6b00082130200ffff4230ff004230030043309c +:10b6c000020002240a006214000000001000c29769 +:10b6d00002120200ffff4230ff0042303f004330c1 +:10b6e0000100022402006214000000000000c0a358 +:10b6f0000000c28321e8c0030c00be8f1000bd27ec +:10b700000800e00300000000e0ffbd271c00bfaf01 +:10b710001800beaf21f0a0031000c0a31200c0a704 +:10b720001200c22721204000212800004b5d400f5d +:10b73000000000001000c2a31000c28333004014b8 +:10b74000000000001200c29721204000a42d400fed +:10b75000000000001000c2a31000c2832a004014a1 +:10b76000000000001200c297ff00423001000324d5 +:10b770001400431000000000020043280500601080 +:10b78000000000000b00401000000000fe2d400be8 +:10b7900000000000020003240e004310000000001f +:10b7a000030003240f00431000000000fe2d400b97 +:10b7b00000000000010002246d8082a3032e400bd4 +:10b7c00000000000020002246d8082a3032e400bc3 +:10b7d00000000000020002246d8082a3032e400bb3 +:10b7e00000000000030002246d8082a3000000001e +:10b7f000032e400b00000000030002246d8082a392 +:10b80000032e400b000000006d8080a31000c28357 +:10b8100021e8c0031c00bf8f1800be8f2000bd2789 +:10b820000800e00300000000f0ffbd270c00beafe1 +:10b8300021f0a003211880002110a0001000c3a354 +:10b840001400c2a31000c29300120200201e027c4a +:10b850001400c2932016027c251062002016027c80 +:10b860000200c2a70200c397690402240500621007 +:10b87000000000000200c397680402240400621460 +:10b880000000000021100000412e400b00000000cd +:10b890006d8082930400401400000000ffff02242a +:10b8a000412e400b000000006d8082930000c2a377 +:10b8b0003c2e400b000000000000c2934018020024 +:10b8c0001480822721106200000042940200c39776 +:10b8d0000400621400000000ffff0224412e400b10 +:10b8e000000000000000c293010042240000c2a337 +:10b8f0000000c2930300422cefff40140000000040 +:10b900002110000021e8c0030c00be8f1000bd27ed +:10b910000800e00300000000c8ffbd273400bfafef +:10b920003000beaf21f0a003214080004000c6af30 +:10b930002120e0004c00c38f5000c28f3800c8a304 +:10b940003c00c5a34400c4a72800c3a72c00c2a77d +:10b95000ffff02241000c2a33c00c2937f004230cc +:10b96000ff0042301500c2a33800c2931400c2a3e6 +:10b97000080002241600c2a74800c28f0c00401025 +:10b98000000000001600c297ffff43302c00c49750 +:10b990002800c29721108200ffff42302110620070 +:10b9a000ffff42301600c2a7722e400b00000000bd +:10b9b0001600c297ffff43304400c2972110620077 +:10b9c000ffff42301600c2a71400c293ff004230ae +:10b9d000211840001500c293ff0042302120600072 +:10b9e000212840000a2e400f000000001000c2a3d2 +:10b9f0001000c283e200401400000000df2c400f62 +:10ba0000000000001000c2a31000c283df00401439 +:10ba1000000000001c00c0af2000c0a71800c0af8d +:10ba20003800c3931800c28f251062001800c2afff +:10ba30003c00c293001a02001800c28f2510620059 +:10ba40001800c2af1600c297ffff4230001c020070 +:10ba50001800c28f251062001800c2af1800c28ff4 +:10ba60008c100424212840006968400f0000000069 +:10ba70001000c2a31000c283c700401400000000e1 +:10ba80001800c0af1800c28f020042341800c2afc5 +:10ba90001800c28f78100424212840006968400fe4 +:10baa000000000001000c2a31000c283bd004014bb +:10bab00000000000d328400f0000000021184000c3 +:10bac000f0ff023c00f04234241862003000023cd7 +:10bad0000900621400000000ac10042401000524d9 +:10bae0006968400f000000001000c2a31000c2836c +:10baf000af004014000000001c00c0af2000c0a731 +:10bb0000e92e400b000000001800c2277810042422 +:10bb1000212840005968400f000000001000c2a317 +:10bb20001000c28326004014000000001800c28fdd +:10bb3000020042300e004014000000001c00c2272a +:10bb40001500033c00046434212840005968400f6c +:10bb5000000000001000c2a31000c2831b004010b0 +:10bb6000000000001c00c0aff42e400b00000000dd +:10bb70002000c297ffff4230e803422c040040142b +:10bb800000000000050004246270400f0000000067 +:10bb90002000c297ffff423001004224ffff4230e5 +:10bba0002000c2a72000c297ffff42308813422c1a +:10bbb000d5ff401400000000f42e400b00000000f0 +:10bbc00000000000f42e400b000000000000000008 +:10bbd0001c00c28f61004010000000001c00c28fda +:10bbe0002400c2af1600c297ffff42301600c2a762 +:10bbf0002400c38f1400c2272120600021284000a8 +:10bc000008000624ea68400f000000001000c2a3ec +:10bc10001000c28369004014000000002400c28f9d +:10bc2000080042242400c2af4000c28f1000401020 +:10bc3000000000002400c38f4400c2972120600050 +:10bc40004000c58f21304000ea68400f000000002e +:10bc50001000c2a31000c2835b004014000000006b +:10bc60004400c3972400c28f211062002400c2af99 +:10bc70004800c28f17004010000000002c00c3973e +:10bc80004400c29723106200211840002400c28f94 +:10bc9000211062002400c2af2400c38f2800c29785 +:10bca000212060004800c58f21304000ea68400f25 +:10bcb000000000001000c2a31000c2834500401421 +:10bcc000000000002800c3972400c28f21106200ea +:10bcd0002400c2af1c00c28f801002001800c2af47 +:10bce0001800c28f020042341800c2af1800c28f81 +:10bcf0006c100424212840006968400f00000000f7 +:10bd00001000c2a31000c2833500401400000000e0 +:10bd1000d328400f0000000021184000f0ff023c33 +:10bd200000f04234241862003000023c0f0062141c +:10bd300000000000b0100424010005246968400fd1 +:10bd4000000000001000c2a31000c28307004010d2 +:10bd500000000000792f400b00000000fdff0224ce +:10bd60001000c2a3792f400b00000000282d400fc7 +:10bd7000000000001000c2a3792f400b000000005b +:10bd800000000000792f400b0000000000000000c0 +:10bd9000792f400b0000000000000000792f400bbd +:10bda0000000000000000000792f400b00000000a0 +:10bdb00000000000792f400b000000000000000090 +:10bdc000792f400b0000000000000000792f400b8d +:10bdd0000000000000000000792f400b0000000070 +:10bde000000000001000c28321e8c0033400bf8fb0 +:10bdf0003000be8f3800bd270800e00300000000bf +:10be0000d8ffbd272400bfaf2000beaf21f0a003a4 +:10be10001000c0a31400c227701004242128400081 +:10be20005968400f000000001000c2a31000c28338 +:10be3000f8004014000000001400c28f01004230de +:10be4000ff004230f30040100000000021200000fd +:10be50007b70400f000000001400c2277010042403 +:10be6000212840005968400f000000001000c2a3c4 +:10be70001000c283e3004014000000001400c38fd0 +:10be8000feff0224241062001400c2af1400c28f0f +:10be900070100424212840006968400f0000000051 +:10bea0001000c2a31000c283d9004014000000009b +:10beb0001400c22770100424212840005968400f44 +:10bec000000000001000c2a31000c2830600401052 +:10bed00000000000010004247b70400f00000000ff +:10bee0008530400b000000006a8080a31400c28fe0 +:10bef00082100200ffff4230ff0f42301200c2a743 +:10bf00001200c297bb004010000000001c00c0af30 +:10bf10001c00c22784100424212840005968400fc7 +:10bf2000000000001000c2a31000c28306004010f1 +:10bf300000000000010004247b70400f000000009e +:10bf40008530400b000000001c00c38f1800c22782 +:10bf50002120600021284000040006248d68400f45 +:10bf6000000000001000c2a31a00c297ffff423079 +:10bf70001a00c2a71000c283060040100000000093 +:10bf8000010004247b70400f000000008530400b4e +:10bf9000000000001a00c297ffff42301200c39752 +:10bfa0000f006210000000001200c3971a00c29731 +:10bfb000ffff4230231062000500422808004014b1 +:10bfc00000000000010004247b70400f000000000e +:10bfd000faff02241000c2a38530400b00000000cd +:10bfe0001800c293ff0043300100022414006214c1 +:10bff000000000007080828f75004010000000007b +:10c000007080828f1900c393ff006330212060008d +:10c010001a00c397ffff6330f8ff6324ffff63300c +:10c02000212860001c00c38f0800632421306000b9 +:10c0300009f84000000000007430400b00000000d0 +:10c040001800c293ff00433002000224140062145f +:10c05000000000007480828f5d004010000000002e +:10c060007480828f1900c393ff0063302120600029 +:10c070001a00c397ffff6330f8ff6324ffff6330ac +:10c08000212860001c00c38f080063242130600059 +:10c0900009f84000000000007430400b0000000070 +:10c0a0001800c293ff0043300400022414006214fd +:10c0b000000000007880828f4500401000000000e2 +:10c0c0007880828f1900c393ff00633021206000c5 +:10c0d0001a00c397ffff6330f8ff6324ffff63304c +:10c0e000212860001c00c38f0800632421306000f9 +:10c0f00009f84000000000007430400b0000000010 +:10c100001800c293ff00433006000224140062149a +:10c11000000000007c80828f2d0040100000000095 +:10c120007c80828f1900c393ff0063302120600060 +:10c130001a00c397ffff6330f8ff6324ffff6330eb +:10c14000212860001c00c38f080063242130600098 +:10c1500009f84000000000007430400b00000000af +:10c160001800c293ff00433005000224140062143b +:10c17000000000008480828f150040100000000045 +:10c180008480828f1900c393ff00633021206000f8 +:10c190001a00c397ffff6330f8ff6324ffff63308b +:10c1a000212860001c00c38f080063242130600038 +:10c1b00009f84000000000007430400b000000004f +:10c1c000faff02241000c2a38530400b00000000db +:10c1d0006a808293ff0042300e004014000000008d +:10c1e0009e2c400f000000001000c2a38530400bc1 +:10c1f00000000000feff02241000c2a38530400ba7 +:10c2000000000000000000008530400b000000002e +:10c21000000000001000c28321e8c0032400bf8f8b +:10c220002000be8f2800bd270800e00300000000aa +:10c23000f8ffbd270400beaf21f0a00301000224d7 +:10c240006c8082a321e8c0030400be8f0800bd27d4 +:10c250000800e00300000000e0ffbd271c00bfafa6 +:10c260001800beaf21f0a0031000c0a36b80829322 +:10c27000ff0042302400401000000000df2c400f7f +:10c28000000000001000c2a31000c2831e00401472 +:10c29000000000006c8080a3b730400b000000005d +:10c2a0006b808293ff004230ffff4224ff00423048 +:10c2b0006b8082a3b030400b000000000000000043 +:10c2c000802f400f000000001000c2a31000c283a6 +:10c2d000faff401400000000000000006b80829311 +:10c2e000ff00423005004010000000006c80829387 +:10c2f000ff004230eaff401000000000282d400ff0 +:10c30000000000001000c2a31000c28321e8c00397 +:10c310001c00bf8f1800be8f2000bd270800e0035f +:10c3200000000000d8ffbd272400bfaf2000beaf33 +:10c3300021f0a0032800c4af2c00c5af2118c00015 +:10c340002110e0003000c3a73400c2a31000c0a336 +:10c350002800c28f07004010000000002c00c28f90 +:10c3600004004010000000003000c2971900401483 +:10c37000000000003400c2931200401000000000d2 +:10c38000010002246a8082a39e2c400f000000005e +:10c390001000c2a32800c28f0a0040140000000051 +:10c3a0002c00c28f07004014000000003000c2972c +:10c3b0000400401400000000211000005a31400b1e +:10c3c00000000000f4ff02241000c2a35931400b0a +:10c3d000000000001800c22770100424212840002b +:10c3e0005968400f000000001000c2a31000c28373 +:10c3f00055004014000000001800c28f8210020097 +:10c40000ffff4230ff0f42301200c2a71400c227c4 +:10c4100084100424212840005968400f00000000c7 +:10c420001000c2a31000c2834a00401400000000a4 +:10c430003000c2972800c48f2c00c58f21304000e7 +:10c440008d68400f000000001000c2a31000c283de +:10c4500043004014000000003000c3971200c29750 +:10c460002b1043000500401000000000f4ff0224e0 +:10c470001000c2a35931400b000000001400c28f0d +:10c480002800c38f2b1062000a0040140000000037 +:10c490003000c3972800c28f211862001200c49791 +:10c4a0001400c28f211082002b10430005004010a1 +:10c4b00000000000f4ff02241000c2a35931400b19 +:10c4c000000000003400c293180040140000000077 +:10c4d0001200c3971400c28f211862003000c49765 +:10c4e0002800c28f2110820010006210000000009e +:10c4f0003000c3972800c28f211062000300423031 +:10c5000004000324231862001200c4971400c28f91 +:10c51000212082003000c5972800c28f2110a20080 +:10c52000231082000f0062140000000001000224aa +:10c530006a8082a39e2c400f000000001000c2a35e +:10c540005931400b00000000000000005931400b41 +:10c5500000000000000000005931400b0000000006 +:10c56000000000001000c28321e8c0032400bf8f38 +:10c570002000be8f2800bd270800e0030000000057 +:10c58000f0ffbd270c00beaf21f0a00321108000fa +:10c590001400c5af1000c2a30000c0a31000c293d6 +:10c5a0000700432c270060100000000080180200e4 +:10c5b000019d023cc8c54224211062000000428c4b +:10c5c000080040000000000044c6009df4c5009d26 +:10c5d000e4c5009d14c6009d04c6009d34c6009da0 +:10c5e00024c6009d1400c28f748082af9431400b2a +:10c5f000000000001400c28f708082af9431400ba5 +:10c60000000000001400c28f788082af9431400b8c +:10c61000000000001400c28f808082af9431400b74 +:10c62000000000001400c28f7c8082af9431400b68 +:10c63000000000001400c28f848082af9431400b50 +:10c6400000000000f4ff02240000c2a3000000006c +:10c650000000c28321e8c0030c00be8f1000bd277c +:08c660000800e00300000000e7 +:020000040000fa +:020000041d00dd +:10c6680098ffbd27211000004800b2af4400b1afc9 +:10c678004000b0af6400bfaf6000beaf5c00b7afb2 +:10c688005800b6af5400b5af5000b4af4c00b3afcc +:10c69800219080002188a0007000a6af3000a2afd2 +:10c6a80021800000000024826b0080101000a4a3e9 +:10c6b80025000224380282140100332602002426b1 +:10c6c800ffff82802d000624211800003000082476 +:10c6d800200007242b0009242c024610ffff912478 +:10c6e8002e0045282202a010000000003302475007 +:10c6f800010063342f02495002006334029d053c57 +:10c70800b4e1a5242120a20002006630feff6530b6 +:10c71800010084900b18a60008006630fbff653006 +:10c7280004008430270280100b18a60021a0000006 +:10c7380040201400c0a0140021a09400010031265c +:10c7480021a08202029d073c00002282b4e1e72476 +:10c758002120e2000100849004008430f4ff80145a +:10c76800d0ff94262e0004241c02445001003126d8 +:10c77800001063342198000010000724008006246c +:10c78800ff0044307900852c1000a2a33f00a014bc +:10c79800010031261000b52701001624040060129c +:10c7a8002b10d4022b1076020bb062022b10d4028d +:10c7b8000200405021a0000023a096020800773014 +:10c7c8001300e016ffff1324fc31400bffff9426f3 +:10c7d8008977400f21284002271002000100032614 +:10c7e8000b806200ffff9426f9ff931620000424b3 +:10c7f8000632400bffff13248977400f212840029f +:10c8080027100200010003260100b5260b806200f4 +:10c81800ffffd626f8ffd3560000a482a2ffe052fd +:10c82800000024821232400bffff13248977400f47 +:10c838002128400227100200010003260b80620015 +:10c84800ffff9426f9ff9316200004240000248299 +:10c8580097ff80141000a4a36400bf8f211000026a +:10c868006000be8f5c00b78f5800b68f5400b58f3c +:10c878005000b48f4c00b38f4800b28f4400b18f82 +:10c888004000b08f0800e0036800bd27019d023c0e +:10c89800b0c8422480200400212044000000828c7b +:10c8a800080040000000000060c8009d9cc7009d73 +:10c8b8009cc7009d9cc7009d9cc7009d9cc7009d70 +:10c8c8009cc7009d9cc7009d9cc7009d9cc7009d60 +:10c8d8009cc7009d9cc7009d9cc7009d9cc7009d50 +:10c8e8009cc7009d9cc7009d9cc7009d9cc7009d40 +:10c8f8009cc7009d9cc7009d9cc7009d9cc7009d30 +:10c908009cc7009d9cc7009d9cc7009d9cc7009d1f +:10c918009cc7009d9cc7009d9cc7009d9cc7009d0f +:10c928009cc7009d9cc7009d9cc7009d9cc7009dff +:10c938009cc7009d9cc7009d9cc7009d9cc7009def +:10c948009cc7009d9cc7009d9cc7009d9cc7009ddf +:10c958009cc7009d9cc7009d9cc7009d9cc7009dcf +:10c968009cc7009d9cc7009d9cc7009d9cc7009dbf +:10c978009cc7009d9cc7009d9cc7009d9cc7009daf +:10c988009cc7009d9cc7009d9cc7009d9cc7009d9f +:10c998009cc7009d9cc7009d9cc7009d9cc7009d8f +:10c9a8009cc7009d9cc7009d9cc7009d9cc7009d7f +:10c9b8009cc7009d9cc7009d9cc7009d9cc7009d6f +:10c9c8009cc7009d9cc7009d9cc7009d9cc7009d5f +:10c9d8009cc7009d9cc7009d9cc7009d9cc7009d4f +:10c9e8009cc7009d9cc7009d9cc7009d9cc7009d3f +:10c9f8009cc7009d9cc7009d9cc7009d9cc7009d2f +:10ca08009cc7009d9cc7009d78cc009d9cc7009d3d +:10ca18009cc7009d9cc7009d9cc7009d9cc7009d0e +:10ca28009cc7009d9cc7009d9cc7009d9cc7009dfe +:10ca38009cc7009dccce009d98ca009d9cc7009db8 +:10ca4800c4ce009d9cc7009d9cc7009d98ca009db0 +:10ca58009cc7009d9cc7009d5ccf009d9cc7009d06 +:10ca68009cc7009d54cf009d78cc009d9cc7009d1d +:10ca78009cc7009d14cf009d9cc7009d94ca009d33 +:10ca88009cc7009d9cc7009d7ccc009dc000633462 +:10ca9800000762307b00401021f060000010653014 +:10caa80006000424100062303b0240100b988500f9 +:10cab8007000a28f07004424f8ff0224241082008b +:10cac8000000448c0400458c080042243c00a3afbd +:10cad8008c73400f7000a2af3c00a38f21a84000c8 +:10cae8002120a00221280000b17a400f3c00a3af0a +:10caf800040041043c00a38f0080023c26a8550096 +:10cb080003007e342120a00221280000b17a400fc2 +:10cb18001800a0aff402401421b000001900622ae6 +:10cb28003e0040100a00c22aff0077326e00e22e53 +:10cb3800320240140b00e22eeb51033c1f85633494 +:10cb48001900e302029d063c10180000dcf1c6241f +:10cb580042190300120062248010020021104600ce +:10cb68000000448c029d023c90e5458c3c00a3af3c +:10cb78001474400f3800a6af3c00a38f3800a68f6e +:10cb88008020030000190300211883008028030077 +:10cb9800212865002328e502cccc033ccdcc6334a6 +:10cba800ff00a5301900a300212040001028000034 +:10cbb8003c00a3afc2100500090042248010020007 +:10cbc800211046001474400f0000458c3c00a38fd0 +:10cbd800212040001900e3023800a68f1018000039 +:10cbe800c218030040100300c018030021104300be +:10cbf8002310e202ff00423080100200213046007c +:10cc08001474400f0000c58c2120a0023d71400f14 +:10cc18002128400021a840000a00c22a1101401022 +:10cc2800029d023c2120a002b17a400f2128000079 +:10cc38000401401400000000847b400f2120a00262 +:10cc480021204000212800009d79400f21b8400094 +:10cc5800212840003b71400f2120a00221b0400054 +:10cc680021a8e0021800a0af3034400b21180000c2 +:10cc780020006334800063340007623087ff40146b +:10cc880021f06000c0006230c80140142016037c07 +:10cc98002c03400410006230f80140107000a78f88 +:10cca8007000a58f0000a48c0400a524c3170400fd +:10ccb8007000a5af21a880000302400421f04000c5 +:10ccc80003006016c00077302598be020100732e5d +:10ccd80040000224c502e2124100e22a7c02401010 +:10cce800800002241600e0161000a283010002242e +:10ccf8004603c0131000a2a3029d043cf8e4842458 +:10cd080002000724020002244733400b14000824c1 +:10cd1800213840000400858c2b30c5032c03c054f7 +:10cd28001000a7a32603be500000858c01004224f2 +:10cd38002014027cf6ff4814080084241000a2a3e3 +:10cd48002a2053005e0280102a2062022014137cdd +:10cd58001000a2a305008012004064300300653073 +:10cd6800ffff84260ba08500004064300600801079 +:10cd78002a2054002a2074020200805021a00000ba +:10cd880023a093022a205400160280500400623027 +:10cd9800231082022000a2af040062301402401067 +:10cda8002000a28f02006230d202401001006230df +:10cdb800010065302d0002242b0004240b204500bf +:10cdc800212840028977400f3c00a3af27100200ba +:10cdd800010004263c00a38f0b8082002000a28f54 +:10cde800c001401430000424080064303400a4afab +:10cdf800ffff7326029d023cc0201300e8e456247e +:10ce080021b0c4024010130040201e004100e52a52 +:10ce18002000633080a013002800a4af219853009d +:10ce28002400a5afa433400b2c00a3af0e00e016de +:10ce38001000a4830000c68e0400c78e2120a00223 +:10ce48003369400f2128c0032120400021286000b9 +:10ce58000a0006240767400f2138000030004224ea +:10ce68002024027c1000a4a38977400f21284002c7 +:10ce780027100200010003260b806200f8ffd62667 +:10ce8800fcff9426fdff7326fdff0224c3016212f6 +:10ce980040000224b301e2122400a78fe3ffe0144c +:10cea800800002249d01e212c0000224e1ffe21288 +:10ceb8001000a4839c33400b00000000a632400bf6 +:10cec800000463347000a78f100066300100e28010 +:10ced8000000e58c0400e4247601c0101000a2a331 +:10cee800750140501400a5a3ffff062472014650a7 +:10cef8001400a5a31400a2a31500a5a302001624dc +:10cf08001400b527e931400b7000a4af7000a58f5d +:10cf18000000a48c0400a524a002801021a8800091 +:10cf280000008280b20240507000a5af21b000001e +:10cf38000100d6262110960000004280fdff4054d3 +:10cf48000100d626e931400b7000a5afa632400b90 +:10cf580040006334100062302120c0000a20e20043 +:10cf680025188300ffff6330e231400b0000228266 +:10cf7800e3fd4814029d053c040063340100842449 +:10cf8800ffff8280d6fd4614ffff9124080063341a +:10cf9800e233400b010084248977400f21284002a6 +:10cfa800ffff0324bffd431021886002ab31400b13 +:10cfb80001001026e233400b01008424e233400bc9 +:10cfc800010084242a000424020144102e000424b1 +:10cfd800e7fd441421a00000010031260000228250 +:10cfe8002a000424e001441000406334029d053cfb +:10cff800b4e1a5242120a20001008490040084301b +:10d00800dcfd80102198000040201300c098130018 +:10d01800219893000100312621986202029d053c67 +:10d0280000002282b4e1a5242120a20001008490fe +:10d0380004008430f4ff8014d0ff7326e131400be4 +:10d0480010000724847b400f2120a002fdfe40141d +:10d05800212040000200c32afbfe601421280000a2 +:10d06800029d023c94e542243000a48fb17a400f1f +:10d078000000458cdf004004edffc326eeffc32609 +:10d088001800a3af2024037c9370400f3c00a3af8b +:10d09800212840002120a0027772400f3000a2af63 +:10d0a800847b400f212040003c00a38f21b8400022 +:10d0b80021a8400021b00000010004240a00e22e4b +:10d0c800490240141000a4a3029d043cf8e48424ff +:10d0d8002110000002000524020007243c34400b04 +:10d0e800120009242138a0000400868c7601c0149f +:10d0f800020048240000868c2b30e6027201c0141e +:10d10800010042240100e524202c057cf5ff491488 +:10d11800080084241000a5a31400082423b883025f +:10d1280023b8f30223b8e802ffffe2260bb8530046 +:10d138000300c433ffffe3260400c2334501401057 +:10d148000bb864000200c233e60140100100c2338c +:10d158000100c4332d0002242b0003240a106400ac +:10d16800212040008977400f212840022710020023 +:10d17800010003260b8062000a00e05a0800de3333 +:10d18800300004248977400f21284002271002002c +:10d1980001000326fffff726f9ffe0160b80620067 +:10d1a8000800de332000beaf029d043c8134400bf2 +:10d1b800e8e49424c0180300211883020000668c58 +:10d1c8000400678c2120a0023369400f2128000049 +:10d1d80021204000212860000a0006240767400f2c +:10d1e80021380000300044248977400f212840026c +:10d1f80027100200010003260b8062001000a283a2 +:10d20800ffff4324201c037ceaff40141000a3a363 +:10d218001800a28f0c0040181300622a3000042462 +:10d228008977400f212840021800a48f01000326a7 +:10d2380027100200ffff84240b806200f7ff801c88 +:10d248001800a4af1300622afc0040142014137cb9 +:10d25800120002241000a2a3eeff73262e0004245d +:10d268008977400f21284002ffff03240200431062 +:10d278001000b483010010269370400f2120800213 +:10d28800212040001474400f2128c002847b400fe5 +:10d298002120400021a84000ffff82262014027ca4 +:10d2a80021f00000230080121000a2a3029d053c7b +:10d2b800e8e4b624c01002002110c2020000468c27 +:10d2c8000400478c2120a0023369400f2128c003a5 +:10d2d800212040000a000624213800000767400f7b +:10d2e80021286000300044248977400f212840021b +:10d2f8001000b48327100200c01814002118c302bc +:10d308000000668c0400678c2128c00301000326f6 +:10d318002120a0020767400f0b80620021a840006f +:10d32800ffff82262014027c21f06000e1ff8016b6 +:10d338001000a2a30a0060122000a78f3000042466 +:10d348008977400f21284002271002000100032698 +:10d35800ffff7326f9ff60160b8062002000a78f7d +:10d36800d1fce05000002482cffce05a0000248267 +:10d37800200004248977400f21284002271002004a +:10d3880001000326fffff726f9ffe0160b80620075 +:10d39800ac31400b000024827000a48f0000958cf3 +:10d3a80004008424ba32400b7000a4af5c0140042e +:10d3b800100062303a0040107000a78f7000a58fef +:10d3c80021f000000000b58c0400a5243233400b86 +:10d3d8007000a5af7000a48f7000a28f01003126e5 +:10d3e800040084240000548c00002282db31400bae +:10d3f8007000a4af2334400b1800a3af5e01405463 +:10d40800029d023ccccc033ccdcc63341900e30232 +:10d41800029d063c10180000dcf1c624c218030067 +:10d428000900622480100200211046000000448c8c +:10d43800029d023c90e5458c3c00a3af1474400f5c +:10d448003800a6af3c00a38f3800a68f4020030009 +:10d45800c0180300211883002318e302ff0063307b +:10d4680080180300213066000000c58c1474400f3a +:10d47800212040000533400b2120a0020000e48c4d +:10d488000400e724c31704007000a7af21a8800098 +:10d498000bfe410421f040003535400b23a8040061 +:10d4a80021f000000000f58c0400e7243233400b23 +:10d4b8007000a7af1400a5a3010016241400b52717 +:10d4c800e931400b7000a4af23a804002b201500fd +:10d4d80023100200030063343233400b23f044006e +:10d4e80030000424212840028977400f3c00a3af74 +:10d4f8002000a58f2710020001000426ffffa524a5 +:10d508002000a5af0b808200f5ffa0143c00a38f7c +:10d51800080067307e33400b3400a7af2c00a28f81 +:10d528001c004050029d053c029d043cc0e483243d +:10d538002800a78f272014000420870006109502d2 +:10d54800251082002000853206209e020b108500df +:10d558000f00423021106200000044809c33400bd1 +:10d568001000a4a32800a38f271013000410430061 +:10d5780006207502252044002000633206107e0232 +:10d588000b20430007008430300084249c33400b78 +:10d598001000a4a34e35400bd4e4a3243400a48f78 +:10d5a80041fc8050000024822000a58f3efca0583a +:10d5b80000002482200004248977400f212840029b +:10d5c8002000a78f2710020001000326ffffe72491 +:10d5d8002000a7aff7ffe0140b806200ac31400bce +:10d5e80000002482effd40142000a0af2000a28f8d +:10d5f8009c00401408006530080064303400a4af73 +:10d608000200623093004010010062300100653072 +:10d618002d0002242b0004240b2045002128400261 +:10d628008977400f3c00a3af2710020001000426b1 +:10d638000b8082007e33400b3c00a38f1000a2a316 +:10d6480006ff401423986202ffff0224cf34400be8 +:10d658001000a2a30800c3330b0060142000a3af7e +:10d668000a00e01a0200c233200004248977400f20 +:10d67800212840022710020001000326fffff72699 +:10d68800f9ffe0160b8062000200c233910040509f +:10d698000100de330100c4332d0002242b000324d3 +:10d6a8000a106400212040008977400f2128400299 +:10d6b80027100200010003266c34400b0b80620027 +:10d6c8005733400b0b9844004934400b1000a5a376 +:10d6d8002c00e212c000022484fde2121000a28392 +:10d6e8005333400b2a2053001800a527227b400ff4 +:10d6f8002120a0021800a28f6666043cffff422486 +:10d708004018020021106200676684241800440053 +:10d71800c3170200102000008320040023b08200f9 +:10d728000000c32affffc2260bb0430023201600c7 +:10d738009370400f2024047c212040001474400f73 +:10d748002128a0023000a2af029d023c88e5458c4a +:10d75800b17a400f3000a48f6a004104029d023c58 +:10d76800c932400bffffd6267000a78f0100312673 +:10d778000000f38c0400e72400002282e031400b13 +:10d788007000a7af01000224a500c0131000a2a3d7 +:10d7980002000224020007240001042421280000ba +:10d7a800f235400b10000824003105000039040050 +:10d7b800253026012120e0002128c0002138400022 +:10d7c8002b30c5035efdc0541000a2a38200c51310 +:10d7d8002b30a4020100e2242014027cf2ff48143a +:10d7e800024f04005233400b1000a8a3010002248a +:10d7f8008100c0131000a2a3020008240200022422 +:10d8080040000424212800000c36400b1500072492 +:10d81800c0300500c0400400253026012120000149 +:10d828002128c000214040002b30c5036200c054ad +:10d838001000a8a35d00c5132b30a40201004224e8 +:10d848002014027cf2ff4714424f04005233400b6d +:10d858001000a2a367fd4050ffff73268935400bd7 +:10d868002000042466ffa0143400a5af200004247f +:10d87800212840028977400f3c00a3af2000a78fe2 +:10d888002710020001000426ffffe7242000a7afad +:10d898000b8082005affe0103c00a38f2000042474 +:10d8a800212840028977400f3c00a3af2000a78fb2 +:10d8b8002710020001000426ffffe7242000a7af7d +:10d8c8000b808200e9ffe0143c00a38f8335400bf6 +:10d8d8000200623035fec053029d043cac35400b5b +:10d8e8002000042424fe4010200004245b34400b54 +:10d8f800000000003afd40102000a28f7233400b58 +:10d90800200004248ce5448cb17a400f3000a58fa8 +:10d91800010042280100c326c932400b0bb0620047 +:10d928007000a28f07004424f8ff0224241082000c +:10d93800080044247000a4af0000558c3233400b1b +:10d9480004005e8c7000a28f07004524f8ff0224b3 +:10d958002428a2000000a48c0400a28c0800a5249e +:10d968007000a5af21a88000d5fc410421f040003b +:10d978003535400b23a80400dcf1422480b8170099 +:10d9880021b8e202029d023c0000e48e1474400fac +:10d9980090e5458c0533400b2120a002029d153ce3 +:10d9a800b8e4b526ca33400b2120a002a4ffc0501a +:10d9b800010042241000a8a35233400b211000019b +:10d9c8002b28a502dafca050010042241000a7a3ce +:10d9d8005233400b2110e0007fffc0500100e224c9 +:10d9e8005233400b1000a2a34934400b0100082415 +:10d9f800e931400b21b000000800a22e7fff405003 +:10da0800020008245233400b010002240a00a22e0f +:10da1800bafc4010029d043c5233400b0100022422 +:10da28001000a22e5bff4050020002245233400b2c +:04da380001000224c3 +:020000040000fa +:020000041d00dd +:10da3c00e0ffbd271c00bfaf1800beaf21f0a00354 +:10da4c002000c4af2400c5af2400c28fe48082af95 +:10da5c0001000224f08082af2400c28fff00453009 +:10da6c002400c28f02120200ff0043302400c28f38 +:10da7c0002140200ff0042302400c48f022604006e +:10da8c001000a4af029d043c64d8842421306000b3 +:10da9c0021384000627d400f00000000029d023cd6 +:10daac0080d844242000c58f627d400f0000000008 +:10dabc0021e8c0031c00bf8f1800be8f2000bd27bb +:10dacc000800e00300000000d8ffbd272400bfaf12 +:10dadc002000beaf21f0a003211880002110a0006f +:10daec003000c6af2800c3a32c00c2a32c00c293e5 +:10dafc00020003243e0043100000000003004328f2 +:10db0c000600601000000000010003240b0043100d +:10db1c0000000000df37400b00000000040003246d +:10db2c00470043100000000006000324a10043102e +:10db3c0000000000df37400b000000003000c28ff7 +:10db4c001000c2af1000c28f0000428022004014af +:10db5c0000000000488082832800c3830800621400 +:10db6c000000000048808283212040002128000012 +:10db7c00c01b400f00000000df37400b000000000e +:10db8c004a8082832800c3830800621400000000ce +:10db9c004a8082832120400021280000c01b400fb6 +:10dbac0000000000df37400b000000004c80828337 +:10dbbc002800c383e7006214000000004c808283bd +:10dbcc002120400021280000c01b400f0000000055 +:10dbdc00df37400b00000000029d023c94d8442427 +:10dbec00517d400f00000000df37400b00000000ab +:10dbfc003000c28f1400c2af1400c28f00004280ec +:10dc0c000900401000000000029d023ca0d84424f2 +:10dc1c00009d023c486b4524627d400f00000000d3 +:10dc2c00df37400b0000000021200000010005241c +:10dc3c00a56f400f00000000df37400b0000000014 +:10dc4c003000c28f1800c2af1800c28f0000428093 +:10dc5c005000400400000000488082832800c383e9 +:10dc6c001e0062140000000000a0023c601344245b +:10dc7c002128000000040624357a400f0000000023 +:10dc8c001800c28f00004280478082a347808283a5 +:10dc9c002120400000a0023c60134524000406240f +:10dcac0021380000441d400f00000000029d023c82 +:10dcbc00bcd84224212040005f0005245c3a400f70 +:10dccc00000000000100042401000524a56f400f92 +:10dcdc0000000000df37400b000000004a80828308 +:10dcec002800c383140062140000000000a0023c52 +:10dcfc00601744242128000000040624357a400fc4 +:10dd0c00000000001800c28f00004280498082a3ee +:10dd1c00498082832120400000a0023c60174524ea +:10dd2c000004062421380000441d400f00000000b0 +:10dd3c00df37400b000000004c8082832800c38337 +:10dd4c00870062140000000000a0023c600f442415 +:10dd5c002128000000040624357a400f0000000042 +:10dd6c001800c28f000042804b8082a34b808283bc +:10dd7c002120400000a0023c600f45240004062432 +:10dd8c0021380000441d400f00000000df37400b1d +:10dd9c00000000002800c283029d033c1cd96424af +:10ddac0021284000627d400f00000000df37400b4f +:10ddbc00000000003000c28f1c00c2af1c00c28fdc +:10ddcc000000428c37004010000000001c00c28f85 +:10dddc000400428433004018000000004780828316 +:10ddec002800c38313006214000000001c00c28fc3 +:10ddfc000000438c1c00c28f040042842120600070 +:10de0c0021284000cd47400f00000000478082834e +:10de1c002120400000a0023c60134524000406248d +:10de2c0021380000441d400f00000000d537400b86 +:10de3c0000000000498082832800c3830b00621419 +:10de4c0000000000498082832120400000a0023c99 +:10de5c00601745240004062421380000441d400f9f +:10de6c0000000000d537400b000000004b8082837f +:10de7c002800c38333006214000000004b808283af +:10de8c002120400000a0023c600f45240004062421 +:10de9c0021380000441d400f00000000d537400b16 +:10deac0000000000478082832800c3830d006214a9 +:10debc00000000004780828321204000be1d400fdf +:10decc0000000000ffff0224478082a3010004240d +:10dedc0021280000a56f400f00000000df37400b29 +:10deec0000000000498082832800c383090062146b +:10defc00000000004980828321204000be1d400f9d +:10df0c0000000000ffff0224498082a3df37400b92 +:10df1c00000000004b8082832800c383130062142e +:10df2c00000000004b80828321204000be1d400f6a +:10df3c0000000000ffff02244b8082a3df37400b60 +:10df4c00000000000000000000000000df37400b64 +:10df5c000000000000000000df37400b0000000054 +:10df6c0000000000df37400b000000000000000044 +:10df7c0021e8c0032400bf8f2000be8f2800bd27de +:10df8c000800e00300000000e0ffbd271c00bfaf4d +:10df9c001800beaf21f0a0032000c4af2400c5af11 +:10dfac002000c48fa16a400f000000001000c2a71f +:10dfbc001000c2970500422c7500401400000000b0 +:10dfcc001000c297ffff42242000c38f211862006b +:10dfdc002400c28f05004224000042900f00423002 +:10dfec000a0042280a004014000000002400c28fde +:10dffc0005004224000042900f004230ff004230e6 +:10e00c0037004224ff0042300e38400b0000000065 +:10e01c002400c28f05004224000042900f004230c1 +:10e02c00ff00423030004224ff004230000062a06a +:10e03c001000c297feff42242000c38f21186200fb +:10e04c002400c28f050042240000429002110200fd +:10e05c00ff0042300f0042300a0042280a004014f0 +:10e06c00000000002400c28f0500422400004290f2 +:10e07c0002110200ff00423037004224ff00423000 +:10e08c002c38400b000000002400c28f05004224f5 +:10e09c000000429002110200ff0042303000422486 +:10e0ac00ff004230000062a01000c297fcff422427 +:10e0bc002000c38f211862002400c28f0400422468 +:10e0cc00000042900f0042300a0042280a0040141f +:10e0dc00000000002400c28f040042240000429083 +:10e0ec000f004230ff00423037004224ff00423024 +:10e0fc004838400b000000002400c28f040042246a +:10e10c00000042900f004230ff00423030004224a9 +:10e11c00ff004230000062a01000c297fbff4224b7 +:10e12c002000c38f211862002400c28f04004224f7 +:10e13c000000429002110200ff0042300f004230fa +:10e14c000a0042280a004014000000002400c28f7c +:10e15c00040042240000429002110200ff004230f1 +:10e16c0037004224ff0042306638400b00000000ac +:10e17c002400c28f040042240000429002110200cd +:10e18c00ff00423030004224ff004230000062a009 +:10e19c0021e8c0031c00bf8f1800be8f2000bd27d4 +:10e1ac000800e00300000000c8ffbd273400bfaf2b +:10e1bc003000beaf2c00b0af21f0a00321108000c6 +:10e1cc003c00c5af3800c2a33800c2933200032410 +:10e1dc00320043100000000033004328740060102c +:10e1ec00000000000b0003244b0043100000000053 +:10e1fc002c00032471004314000000003c00c28f6b +:10e20c001800c2af1800c28f000043900100022416 +:10e21c000f00621400000000029d023c38d9442417 +:10e22c00517d400f0000000000a0023c8c1b4424d8 +:10e23c002413400f0000000001000224ec8082af88 +:10e24c00010002244d8082a3f638400b0000000030 +:10e25c001800c28f000042905b00401400000000c8 +:10e26c00029d023c4cd94424517d400f000000001b +:10e27c00ec8080af020002244d8082a3dc39400f79 +:10e28c00000000002120000021280000a56f400f95 +:10e29c0000000000f638400b000000003c00c28f6c +:10e2ac001c00c2af1c00c28f00004290212840000d +:10e2bc001c00c28f01004224000042902118400033 +:10e2cc001c00c28f02004224000042901c00c48f2c +:10e2dc0003008424000084901000a4af029d043c31 +:10e2ec0060d984242130600021384000627d400fc9 +:10e2fc000000000001000224ec8082af00a0023c70 +:10e30c004434422421204000e71e400f000000004e +:10e31c00f638400b000000003c00c28f2000c2af5a +:10e32c00029d023c7cd94424517d400f000000002a +:10e33c002000c28f630042901700401400000000c0 +:10e34c002000c28f218040002000c28f212040007d +:10e35c002f77400f00000000ff00423021284000c2 +:10e36c002000c28f62004290211840002000c28f12 +:10e37c0021004224ff0004241000a4af212000023d +:10e38c002130600021384000c811400f000000000f +:10e39c00f638400b00000000029d023ca4d9442436 +:10e3ac00517d400f00000000f638400b00000000cb +:10e3bc0000000000f638400b0000000000000000d8 +:10e3cc00f638400b000000000000000021e8c003fc +:10e3dc003400bf8f3000be8f2c00b08f3800bd27ab +:10e3ec000800e00300000000b0ffbd274c00bfafe9 +:10e3fc004800beaf4400b0af21f0a003f48080af62 +:10e40c000500042401000524e952400f000000001f +:10e41c0000a0023c8c1b4424212800001000062480 +:10e42c00357a400f0000000000a0023c327e033c15 +:10e43c00c0a863348c1b43ac00a0023c8c1b422450 +:10e44c000808033c08086334080043ac00a0023cf5 +:10e45c008c1b42243201033cc0a86334040043ac3f +:10e46c0000a0023c8c1b4224ff00033cffff6334e2 +:10e47c000c0043ac2d70400f000000001c00c227a4 +:10e48c0021204000212800001c000624357a400f72 +:10e49c0000000000019d023cb4e142241c00c2af0c +:10e4ac001c00c227212040003e11400f000000003c +:10e4bc001800c2a31800c28307004010000000001f +:10e4cc00f88080af030002244d8082a3211000004d +:10e4dc00b039400b0000000001000224f88082af2c +:10e4ec0088bf033c2061628c8431027c206162ac69 +:10e4fc00020002244d8082a38f1a400f00000000fe +:10e50c00019d023cd4da4424019d023c3cda4524b2 +:10e51c00c41a400f000000006481842760818527a5 +:10e52c004d15400f000000006081829304004014e0 +:10e53c0000000000408084270913400f00000000f9 +:10e54c00408084276c15400f0000000000a0023ca6 +:10e55c00343442242120400040808527e537400f89 +:10e56c000000000000a0023cec33442440808527ce +:10e57c00e537400f0000000000a0023c343450246a +:10e58c0000a0023c3434422421204000a16a400ff8 +:10e59c0000000000ff004230212000022128400032 +:10e5ac00fe15400f00000000212000005c13400ffe +:10e5bc0000000000ff0002241000a2af029d023cec +:10e5cc00c0d944240b00052402000624029d023c01 +:10e5dc00ccd94724c811400f0000000005004010a2 +:10e5ec0000000000029d023cd8d94424627d400ffb +:10e5fc00000000003800c22721204000856f400f2a +:10e60c000000000021200000010005248f6f400f46 +:10e61c000000000001000424010005248f6f400f4e +:10e62c000000000002000424010005248f6f400f3d +:10e63c000000000003000424212800008f6f400f0d +:10e64c000000000004000424212800008f6f400ffc +:10e65c00000000002120000021280000a56f400fc1 +:10e66c00000000000100042421280000a56f400fc9 +:10e67c00000000000200042421280000a56f400fb8 +:10e68c00000000000300042421280000a56f400fa7 +:10e69c00000000000400042421280000a56f400f96 +:10e6ac00000000000500042488130524e952400fe3 +:10e6bc000000000021e8c0034c00bf8f4800be8f53 +:10e6cc004400b08f5000bd270800e003000000009c +:10e6dc00e0ffbd271c00bfaf1800beaf21f0a003a8 +:10e6ec00dc39400f00000000ac1a400f00000000a5 +:10e6fc00f612400f000000001000c227212040003d +:10e70c005511400f0000000088bf033c2061628c53 +:10e71c008410027c206162ac88bf033c2061628c57 +:10e72c000421027c206162acf88080afec8080af69 +:10e73c0088bf033c2061628c010004248431827cfc +:10e74c00206162ac4d8080a30100022421e8c0034b +:10e75c001c00bf8f1800be8f2000bd270800e003ef +:10e76c0000000000e8ffbd271400bfaf1000beafd3 +:10e77c0021f0a003f48080af4880828321204000e8 +:10e78c00be1d400f0000000021e8c0031400bf8f25 +:10e79c001000be8f1800bd270800e0030000000029 +:10e7ac00f8ffbd270400beaf21f0a0034d8082838b +:10e7bc0021e8c0030400be8f0800bd270800e00359 +:10e7cc0000000000e0ffbd271c00bfaf1800beaf6b +:10e7dc0021f0a003f880828f2c0040100000000074 +:10e7ec004d80838302000224170062140000000095 +:10e7fc00ec80828f140040140000000005000424fb +:10e80c00fc51400f000000000f0040100000000001 +:10e81c00ff0002241000a2af029d023cc0d9442488 +:10e82c000b00052402000624029d023cccd947248f +:10e83c00c811400f000000000500042488130524b3 +:10e84c00e952400f0000000021200000a811400fe9 +:10e85c0000000000ec80828f0d00401000000000d2 +:10e86c00f480828f0a004014000000002d3a400f03 +:10e87c00000000009d3a400f00000000010002243f +:10e88c00f48082af273a400b00000000000000002b +:10e89c0021e8c0031c00bf8f1800be8f2000bd27cd +:10e8ac000800e00300000000d0ffbd272c00bfaf24 +:10e8bc002800beaf21f0a0030200042401000524af +:10e8cc0021300000d21a400f00000000488082a3c3 +:10e8dc00550002241000c2a7488082831a0040040d +:10e8ec0000000000020002241400c2a71000c2970e +:10e8fc0000120200201e027c1000c29702120200bd +:10e90c00ffff42302016027c251062002016027c8c +:10e91c00ffff42301600c2a71800c0af48808283a8 +:10e92c00211840001400c22721206000212840003b +:10e93c0010000624741b400f00000000010002248c +:10e94c00563a400b000000002110000021e8c003e3 +:10e95c002c00bf8f2800be8f3000bd270800e003bd +:10e96c0000000000e8ffbd271400bfaf1000beafd1 +:10e97c0021f0a0031800c4af1c00c5af47808383ef +:10e98c00ffff022413006210000000004780828306 +:10e99c00211840001c00c28fffff42302120600074 +:10e9ac001800c58f2130400021380000751c400f25 +:10e9bc0000000000478082832120400000a0023c20 +:10e9cc00601345240004062421380000441d400f28 +:10e9dc000000000021e8c0031400bf8f1000be8fa0 +:10e9ec001800bd270800e00300000000e8ffbd2769 +:10e9fc001400bfaf1000beaf21f0a00321108000a7 +:10ea0c001800c2a347808383ffff0224100062100a +:10ea1c000000000047808283212040001800c52799 +:10ea2c000100062421380000751c400f0000000076 +:10ea3c00478082832120400000a0023c60134524c3 +:10ea4c000004062421380000441d400f0000000083 +:10ea5c0021e8c0031400bf8f1000be8f1800bd2723 +:10ea6c000800e00300000000d0ffbd272c00bfaf62 +:10ea7c002800beaf21f0a0030200042401000524ed +:10ea8c0021300000d21a400f000000004c8082a3fd +:10ea9c00560002241000c2a74c8082831a00400446 +:10eaac0000000000020002241400c2a71000c2974c +:10eabc0000120200201e027c1000c29702120200fb +:10eacc00ffff42302016027c251062002016027ccb +:10eadc00ffff42301600c2a71800c0af4c808283e3 +:10eaec00211840001400c22721206000212840007a +:10eafc0010000624741b400f0000000001000224cb +:10eb0c00c63a400b000000002110000021e8c003b1 +:10eb1c002c00bf8f2800be8f3000bd270800e003fb +:10eb2c0000000000e8ffbd271400bfaf1000beaf0f +:10eb3c0021f0a0031800c4af1c00c5af4b80838329 +:10eb4c00ffff022413006210000000004b80828340 +:10eb5c00211840001c00c28fffff423021206000b2 +:10eb6c001800c58f2130400021380000751c400f63 +:10eb7c00000000004b8082832120400000a0023c5a +:10eb8c00601345240004062421380000441d400f66 +:10eb9c000000000021e8c0031400bf8f1000be8fde +:10ebac001800bd270800e00300000000e8ffbd27a7 +:10ebbc001400bfaf1000beaf21f0a00321108000e5 +:10ebcc001800c2a34b808383ffff02241000621045 +:10ebdc00000000004b808283212040001800c527d4 +:10ebec000100062421380000751c400f00000000b5 +:10ebfc004b8082832120400000a0023c60134524fe +:10ec0c000004062421380000441d400f00000000c1 +:10ec1c0021e8c0031400bf8f1000be8f1800bd2761 +:10ec2c000800e00300000000d8ffbd272400bfafa0 +:10ec3c002000beaf21f0a0032800c4af1000c0a379 +:10ec4c00050002241400c2a30100023c0802443453 +:10ec5c00040005246968400f00000000ff004330e9 +:10ec6c001000c29321106200ff0042301000c2a3ba +:10ec7c001400c2930100033c0c02643421284000b0 +:10ec8c006968400f00000000ff0043301000c29381 +:10ec9c0021106200ff0042301000c2a30100023cb0 +:10ecac0014024434010005246968400f0000000080 +:10ecbc00ff0043301000c29321106200ff0042306d +:10eccc001000c2a30100023c1c0244348410052431 +:10ecdc006968400f00000000ff0043301000c29331 +:10ecec0021106200ff0042301000c2a30100023c60 +:10ecfc0004024434810005246968400f00000000c0 +:10ed0c00ff0043301000c29321106200ff0042301c +:10ed1c001000c2a31800c2270100033c180264347f +:10ed2c00212840005968400f00000000ff004330cc +:10ed3c001000c29321106200ff0042301000c2a3e9 +:10ed4c001000c28307004014000000001800c38f9d +:10ed5c0001000224efff6214000000005d3b400b39 +:10ed6c0000000000000000001000c28306004014e8 +:10ed7c0000000000841004244b68400f00000000c9 +:10ed8c00663b400b00000000211000001800c2afd1 +:10ed9c001800c28fff0043302800c28f000043a030 +:10edac001000c28321e8c0032400bf8f2000be8f57 +:10edbc002800bd270800e00300000000d8ffbd2795 +:10edcc002400bfaf2000beaf21f0a0032800c4afc9 +:10eddc002c00c5af3000c6af1c00c0af1000c0a3e4 +:10edec000b0002241400c2a32c00c28f02140200d8 +:10edfc00ff0042301500c2a32c00c28f0212020089 +:10ee0c00ff0042301600c2a32c00c28fff0042301c +:10ee1c001700c2a3a5ff02241800c2a30100023ce4 +:10ee2c00080244343000c58f6968400f00000000b0 +:10ee3c00ff0043301000c29321106200ff004230eb +:10ee4c001000c2a31400c293211840001500c293f5 +:10ee5c0000120200251862001600c2930014020072 +:10ee6c00251862001700c2930016020025106200dc +:10ee7c000100033c0c026434212840006968400ff7 +:10ee8c0000000000ff0043301000c293211062000c +:10ee9c00ff0042301000c2a31800c2930100033cd3 +:10eeac0010026434212840006968400f0000000003 +:10eebc00ff0043301000c29321106200ff0042306b +:10eecc001000c2a30100023c140244341f000524ac +:10eedc006968400f00000000ff0043301000c2932f +:10eeec0021106200ff0042301000c2a30100023c5e +:10eefc001c0244342800c58f6968400f00000000d4 +:10ef0c00ff0043301000c29321106200ff0042301a +:10ef1c001000c2a30100023c040244348500052405 +:10ef2c006968400f00000000ff0043301000c293de +:10ef3c0021106200ff0042301000c2a31c00c22747 +:10ef4c000100033c18026434212840005968400f2a +:10ef5c0000000000ff0043301000c293211062003b +:10ef6c00ff0042301000c2a31000c28307004014ff +:10ef7c00000000001c00c38f01000224efff62148c +:10ef8c0000000000e73b400b000000000000000008 +:10ef9c001000c28321e8c0032400bf8f2000be8f65 +:10efac002800bd270800e00300000000d8ffbd27a3 +:10efbc002400bfaf2000beaf21f0a0032800c4afd7 +:10efcc001800c0af1000c0a3200002241400c2a37c +:10efdc002800c28f02140200ff0042301500c2a3a9 +:10efec002800c28f02120200ff0042301600c2a39a +:10effc002800c28fff0042301700c2a30100023c60 +:10f00c0008024434212800006968400f0000000009 +:10f01c00ff0043301000c29321106200ff00423009 +:10f02c001000c2a31400c293211840001500c29313 +:10f03c0000120200251862001600c2930014020090 +:10f04c00251862001700c2930016020025106200fa +:10f05c000100033c0c026434212840006968400f15 +:10f06c0000000000ff0043301000c293211062002a +:10f07c00ff0042301000c2a30100023c14024434d1 +:10f08c000f0005246968400f00000000ff004330aa +:10f09c001000c29321106200ff0042301000c2a386 +:10f0ac000100023c1c024434212800006968400f16 +:10f0bc0000000000ff0043301000c29321106200da +:10f0cc00ff0042301000c2a30100023c0402443491 +:10f0dc00840005246968400f00000000ff004330e5 +:10f0ec001000c29321106200ff0042301000c2a336 +:10f0fc001800c2270100033c180264342128400088 +:10f10c005968400f00000000ff0043301000c2930c +:10f11c0021106200ff0042301000c2a31000c28315 +:10f12c0007004014000000001800c38f01000224e7 +:10f13c00efff621400000000543c400b0000000084 +:10f14c00000000001000c28321e8c0032400bf8f20 +:10f15c002000be8f2800bd270800e003000000003f +:10f16c00d8ffbd272400bfaf2000beaf21f0a00305 +:10f17c001800c0af1000c0a3060002241400c2a3e4 +:10f18c000100023c08024434212800006968400f49 +:10f19c0000000000ff0043301000c29321106200f9 +:10f1ac00ff0042301000c2a31400c2930100033cc4 +:10f1bc000c026434212840006968400f00000000f4 +:10f1cc00ff0043301000c29321106200ff00423058 +:10f1dc001000c2a30100023c1402443401000524b7 +:10f1ec006968400f00000000ff0043301000c2931c +:10f1fc0021106200ff0042301000c2a30100023c4b +:10f20c001c024434212800006968400f00000000f3 +:10f21c00ff0043301000c29321106200ff00423007 +:10f22c001000c2a30100023c0402443481000524f6 +:10f23c006968400f00000000ff0043301000c293cb +:10f24c0021106200ff0042301000c2a31800c22738 +:10f25c000100033c18026434212840005968400f17 +:10f26c0000000000ff0043301000c2932110620028 +:10f27c00ff0042301000c2a31000c28307004014ec +:10f28c00000000001800c38f01000224efff62147d +:10f29c0000000000ab3c400b000000000000000030 +:10f2ac001000c28321e8c0032400bf8f2000be8f52 +:10f2bc002800bd270800e00300000000d8ffbd2790 +:10f2cc002400bfaf2000beaf21f0a0031800c0afd8 +:10f2dc001000c0a3040002241400c2a30100023ccd +:10f2ec0008024434212800006968400f0000000027 +:10f2fc00ff0043301000c29321106200ff00423027 +:10f30c001000c2a31400c2930100033c0c0264342d +:10f31c00212840006968400f00000000ff004330c6 +:10f32c001000c29321106200ff0042301000c2a3f3 +:10f33c000100023c14024434010005246968400faa +:10f34c0000000000ff0043301000c2932110620047 +:10f35c00ff0042301000c2a30100023c1c024434e6 +:10f36c00212800006968400f00000000ff004330b6 +:10f37c001000c29321106200ff0042301000c2a3a3 +:10f38c000100023c04024434810005246968400fea +:10f39c0000000000ff0043301000c29321106200f7 +:10f3ac00ff0042301000c2a31800c2270100033c2a +:10f3bc0018026434212840005968400f00000000f6 +:10f3cc00ff0043301000c29321106200ff00423056 +:10f3dc001000c2a31000c2830700401400000000fc +:10f3ec001800c38f01000224efff6214000000001c +:10f3fc00023d400b00000000000000001000c28322 +:10f40c0021e8c0032400bf8f2000be8f2800bd2739 +:10f41c000800e00300000000d8ffbd272400bfafa8 +:10f42c002000beaf21f0a0032800c4af2c00c5af54 +:10f43c003000c6af1800c0af1000c0a302000224f9 +:10f44c001400c2a32c00c28f02140200ff00423031 +:10f45c001500c2a32c00c28f02120200ff00423022 +:10f46c001600c2a32c00c28fff0042301700c2a3ab +:10f47c000100023c08024434212800006968400f56 +:10f48c0000000000ff0043301000c2932110620006 +:10f49c00ff0042301000c2a31400c2932118400098 +:10f4ac001500c29300120200251862001600c293c8 +:10f4bc0000140200251862001700c2930016020007 +:10f4cc00251062000100033c0c026434212840002a +:10f4dc006968400f00000000ff0043301000c29329 +:10f4ec0021106200ff0042301000c2a30100023c58 +:10f4fc00140244340f0005246968400f000000001a +:10f50c00ff0043301000c29321106200ff00423014 +:10f51c001000c2a30100023c1c0244342800c58f19 +:10f52c006968400f00000000ff0043301000c293d8 +:10f53c0021106200ff0042301000c2a33000c28fc5 +:10f54c000098427c00120200840042340100033c0b +:10f55c0004026434212840006968400f0000000058 +:10f56c00ff0043301000c29321106200ff004230b4 +:10f57c001000c2a31800c2270100033c1802643417 +:10f58c00212840005968400f00000000ff00433064 +:10f59c001000c29321106200ff0042301000c2a381 +:10f5ac001000c28307004014000000001800c38f35 +:10f5bc0001000224efff621400000000753d400bb7 +:10f5cc0000000000000000001000c28321e8c0030e +:10f5dc002400bf8f2000be8f2800bd270800e00349 +:10f5ec0000000000e0ffbd271c00bfaf1800beaf3d +:10f5fc0021f0a0032000c4af2400c5af2800c6af83 +:10f60c001000c0a30d00043c2400c58f2800c68f39 +:10f61c00723b400f000000001000c2a31000c28318 +:10f62c0009004014000000000d00043c2000c58fb0 +:10f63c002800c68f8d68400f000000001000c2a388 +:10f64c00963d400b00000000000000001000c2833b +:10f65c0021e8c0031c00bf8f1800be8f2000bd27ff +:10f66c000800e00300000000e0ffbd271c00bfaf56 +:10f67c001800beaf21f0a0032000c4af2400c5af1a +:10f68c002110c0002800c2a71000c0a35b3c400f93 +:10f69c00000000002800c2970d00043c2400c58f18 +:10f6ac0021304000ea68400f00000000ff004330aa +:10f6bc001000c29321106200ff0042301000c2a360 +:10f6cc002800c2970d00043c2000c58f213040005b +:10f6dc00093d400f00000000ff0043301000c293b2 +:10f6ec0021106200ff0042301000c2a31000c28340 +:10f6fc0018004014000000001100c2272120400017 +:10f70c000d3b400f00000000ff0043301000c2937f +:10f71c0021106200ff0042301000c2a31100c293fe +:10f72c0001004230ff004230f0ff401400000000a6 +:10f73c00b23c400f00000000ff0043301000c293a9 +:10f74c0021106200ff0042301000c2a3d93d400bd3 +:10f75c0000000000000000001000c28321e8c0037c +:10f76c001c00bf8f1800be8f2000bd270800e003cf +:10f77c0000000000d8ffbd272400bfaf2000beafa3 +:10f78c0021f0a0031c00c0af1000c0af1400c0a338 +:10f79c009fff02241800c2a30100023c080244345b +:10f7ac00040005246968400f00000000ff0043308e +:10f7bc001400c29321106200ff0042301400c2a357 +:10f7cc001800c2930100033c0c0264342128400051 +:10f7dc006968400f00000000ff0043301400c29322 +:10f7ec0021106200ff0042301400c2a30100023c51 +:10f7fc0014024434010005246968400f0000000025 +:10f80c00ff0043301400c29321106200ff0042300d +:10f81c001400c2a30100023c1c02443484100524d1 +:10f82c006968400f00000000ff0043301400c293d1 +:10f83c0021106200ff0042301400c2a30100023c00 +:10f84c0004024434810005246968400f0000000064 +:10f85c00ff0043301400c29321106200ff004230bd +:10f86c001400c2a31c00c2270100033c180264341c +:10f87c00212840005968400f00000000ff00433071 +:10f88c001400c29321106200ff0042301400c2a386 +:10f89c001400c28312004014000000001000c28f3c +:10f8ac00010042241000c2af1000c28ff501422c9f +:10f8bc000500401400000000fbff02241400c2a34a +:10f8cc003c3e400b000000001c00c38f01000224d2 +:10f8dc00e4ff6214000000003c3e400b00000000fe +:10f8ec00000000001400c283060040140000000059 +:10f8fc00841004244b68400f00000000453e400b70 +:10f90c0000000000211000001c00c2af1c00c28fc0 +:10f91c0021e8c0032400bf8f2000be8f2800bd2724 +:10f92c000800e00300000000e0ffbd271c00bfaf93 +:10f93c001800beaf21f0a0032000c4af2400c5af57 +:10f94c002800c6af1000c0a32800c38f018002346a +:10f95c002b1062001a004014000000002000c48f1d +:10f96c002400c58f008006347c3d400f0000000051 +:10f97c001000c2a31000c283190040140000000044 +:10f98c002800c28f008042242800c2af2400c38ffd +:10f99c0000800234211062002400c2af2000c38f0b +:10f9ac0000800234211062002000c2af2800c38ff7 +:10f9bc00018002342b106200e8ff401000000000b0 +:10f9cc002000c48f2400c58f2800c68f7c3d400fbb +:10f9dc00000000001000c2a37c3e400b00000000a1 +:10f9ec00000000001000c28321e8c0031c00bf8f80 +:10f9fc001800be8f2000bd270800e00300000000a7 +:10fa0c00d8ffbd272400bfaf2000beaf21f0a0035c +:10fa1c002800c4af2c00c5af3000c6af1000c0a387 +:10fa2c00000102241400c2af2c00c38f1400c28f3b +:10fa3c001b006200f4014000101000001800c2af5f +:10fa4c003000c28f0500401400000000f4ff0224b7 +:10fa5c001000c2a3ef3e400b000000001800c28f44 +:10fa6c004d004010000000001400c38f1800c28f1e +:10fa7c00231062001c00c2af3000c38f1c00c28f69 +:10fa8c002b10430005004010000000001c00c28f2a +:10fa9c00ffff4230ac3e400b000000003000c28f34 +:10faac00ffff42302c00c48f2800c58f213040004e +:10fabc009d3d400f000000000500401000000000bc +:10facc00f4ff02241000c2a3ef3e400b0000000024 +:10fadc003000c38f1c00c28f2b1062003300401407 +:10faec00000000002800c38f1c00c28f2110620090 +:10fafc002800c2af2c00c38f1c00c28f21106200e3 +:10fb0c002c00c2af3000c38f1c00c28f23106200c8 +:10fb1c003000c2afe93e400b000000001400c28f61 +:10fb2c003000c38f3000c48f2b2044000a106400b7 +:10fb3c001c00c2af1c00c28fffff42302c00c48fd0 +:10fb4c002800c58f213040009d3d400f0000000073 +:10fb5c000500401000000000f4ff02241000c2a3b6 +:10fb6c00ef3e400b000000002800c38f1c00c28f2a +:10fb7c00211062002800c2af2c00c38f1c00c28f62 +:10fb8c00211062002c00c2af3000c38f1c00c28f4a +:10fb9c00231062003000c2af3000c28fdfff401470 +:10fbac0000000000ef3e400b0000000000000000d1 +:10fbbc001000c28321e8c0032400bf8f2000be8f39 +:10fbcc002800bd270800e00300000000e0ffbd276f +:10fbdc001c00bfaf1800beaf21f0a0032000c4afc3 +:10fbec002400c5af1000c0af1400c0a31500c0a303 +:10fbfc002000c28f1000c2af383f400b0000000045 +:10fc0c005b3c400f00000000ff0043301400c29327 +:10fc1c0021106200ff0042301400c2a31500c2275d +:10fc2c00212040000d3b400f00000000ff0043303e +:10fc3c001400c29321106200ff0042301400c2a3d2 +:10fc4c001000c48fee3b400f00000000ff0043305b +:10fc5c001400c29321106200ff0042301400c2a3b2 +:10fc6c001500c227212040000d3b400f0000000072 +:10fc7c00ff0043301400c29321106200ff00423099 +:10fc8c001400c2a31400c2831b0040140000000027 +:10fc9c001500c227212040000d3b400f0000000042 +:10fcac00ff0043301400c29321106200ff00423069 +:10fcbc001400c2a31500c29301004230ff00423071 +:10fccc00f0ff4014000000001000c28f001042240e +:10fcdc001000c2af2400c38f2000c28f2118620015 +:10fcec001000c28f2b104300c5ff40140000000011 +:10fcfc00423f400b00000000000000001400c283d3 +:10fd0c0021e8c0031c00bf8f1800be8f2000bd2748 +:10fd1c000800e00300000000e0ffbd271c00bfaf9f +:10fd2c001800beaf21f0a0031000c0af1400c0af8c +:10fd3c00b880828f1100401400000000e03d400f9d +:10fd4c00000000001000c2af1000c38fffff0224a0 +:10fd5c000a006210000000001000c28f02140200a2 +:10fd6c00ff004230efff42241400c2af1400c28fd8 +:10fd7c000100032404104300b88082afb880828f46 +:10fd8c0021e8c0031c00bf8f1800be8f2000bd27c8 +:10fd9c000800e00300000000e8ffbd271400bfaf1f +:10fdac001000beaf21f0a0031800c4af2110a000ba +:10fdbc001c00c2a71c00c297212000001800c58f90 +:10fdcc0021304000206e400f0000000021e8c003ed +:10fddc001400bf8f1000be8f1800bd270800e00371 +:10fdec0000000000e8ffbd271400bfaf1000beaf3d +:10fdfc0021f0a0031800c4af2110a0001c00c2a762 +:10fe0c001c00c2971800c48f21280000213040002c +:10fe1c00206e400f0000000021e8c0031400bf8fcb +:10fe2c001000be8f1800bd270800e0030000000082 +:10fe3c00e8ffbd271400bfaf1000beaf21f0a00338 +:10fe4c001800c4af1c00c5af2110c0002000c2a711 +:10fe5c002000c2971800c48f1c00c58f21304000b1 +:10fe6c00206e400f0000000021e8c0031400bf8f7b +:10fe7c001000be8f1800bd270800e0030000000032 +:10fe8c00f8ffbd270400beaf21f0a00321188000ad +:10fe9c002110a0000800c3a30c00c2a30800c29349 +:10feac00401802000c00c29326186200029d023c0e +:10febc00b8e24224211062000000429021e8c00305 +:10fecc000400be8f0800bd270800e00300000000fe +:10fedc00e8ffbd271400bfaf1000beaf21f0a00398 +:10feec00211080001c00c5af2000c6af1800c2a3b3 +:10fefc00cc3f400b000000001800c3931c00c28fc5 +:10ff0c00000042901c00c48f010084241c00c4af6c +:10ff1c002120600021284000a33f400f000000007a +:10ff2c001800c2a32000c28f2b100200ff00423029 +:10ff3c002000c38fffff63242000c3afeeff4014eb +:10ff4c00000000001800c29321e8c0031400bf8f0a +:10ff5c001000be8f1800bd270800e0030000000051 +:10ff6c00c8ffbd273400bfaf3000beaf2c00b0af10 +:10ff7c0021f0a003211880003c00c5af4000c6afa3 +:10ff8c004400c7af4800c28f3800c3a32000c2a3ef +:10ff9c00050002241000c2a31100c0a33800c293b4 +:10ffac001400c2a33800c2933dff42240d00432c21 +:10ffbc009c0060100000000080180200019d023cb3 +:10ffcc00e0ff4224211062000000428c0800400037 +:10ffdc00000000003001019d5000019d3002019d88 +:10ffec003002019dc800019dc800019db801019d12 +:10fffc001400019d3002019d3002019d3002019dd3 +:020000041d01dc +:10000c003002019da000019d3c00c28f0214020031 +:10001c00ff0042301500c2a33c00c28f0212020046 +:10002c00ff0042301600c2a33c00c28fff004230da +:10003c001700c2a3050002241000c2a38f40400b7e +:10004c00000000003c00c28f02120200ff00423090 +:10005c001500c2a32000c29306004010000000004f +:10006c001500c39380ff022425106200ff0042306c +:10007c001500c2a33c00c28fff0042301600c2a381 +:10008c001700c0a3050002241000c2a38f40400b30 +:10009c0000000000ffff02241500c2a3ffff022492 +:1000ac001600c2a3ffff02241700c2a305000224fe +:1000bc001000c2a38f40400b000000003c00c28f18 +:1000cc0002140200ff0042301500c2a33c00c28f94 +:1000dc0002120200ff0042301600c2a33c00c28f85 +:1000ec00ff0042301700c2a34400c28f021402006a +:1000fc00ff0042301800c2a34400c28f021202005b +:10010c00ff0042301900c2a34400c28fff004230ee +:10011c001a00c2a3080002241000c2a38f40400b97 +:10012c00000000003c00c28f02120200ff004230af +:10013c001500c2a32000c29306004010000000006e +:10014c001500c39380ff022425106200ff0042308b +:10015c001500c2a33c00c28fff0042301600c2a3a0 +:10016c004000c28f02160200ff0042301700c2a3eb +:10017c004000c28f02140200ff0042301800c2a3dc +:10018c004000c28f02120200ff0042301900c2a3cd +:10019c004000c28fff0042301a00c2a308000224a4 +:1001ac001000c2a38f40400b000000003c00c28f27 +:1001bc0002140200ff0042301500c2a33c00c28fa3 +:1001cc0002120200ff0042301600c2a33c00c28f94 +:1001dc00ff0042301700c2a34000c28f021602007b +:1001ec00ff0042301800c2a34000c28f021402006c +:1001fc00ff0042301900c2a34000c28f021202005d +:10020c00ff0042301a00c2a34000c28fff004230f0 +:10021c001b00c2a3090002241000c2a38f40400b94 +:10022c0000000000ffff02241100c2a30000000028 +:10023c001100c2832200401400000000b0808293a1 +:10024c0012004014000000001000c293ffff502465 +:10025c001000c293ffff42241400c3277f00042424 +:10026c002128600021304000b73f400f0000000003 +:10027c0040100200ff0043301000c2272110500034 +:10028c00040043a0a940400b000000001000c293e2 +:10029c00ffff42241000c2a31000c2931400c32716 +:1002ac0021206000212840007c3f400f000000000e +:1002bc000300401000000000ffff02241100c2a345 +:1002cc001100c28321e8c0033400bf8f3000be8f01 +:1002dc002c00b08f3800bd270800e00300000000a0 +:1002ec00e0ffbd271c00bfaf1800beaf21f0a0037c +:1002fc00211080002000c2a31000c0a30a00022419 +:10030c001100c2a31200c2272120400001000524c5 +:10031c00693f400f00000000050040100000000085 +:10032c00ffff02241000c2a30041400b000000009c +:10033c001200c2932000c393090062100000000059 +:10034c001100c2832a100200ff0042301100c39337 +:10035c00ffff63241100c3a3eaff40140000000058 +:10036c001100c2830500410400000000ffff0224bd +:10037c001000c2a30041400b000000000a00022440 +:10038c001100c2a31200c227212040000100052445 +:10039c00693f400f00000000050040100000000005 +:1003ac00ffff02241000c2a30041400b000000001c +:1003bc001200c29309004010000000001100c2831b +:1003cc002a100200ff0042301100c393ffff632488 +:1003dc001100c3a3ebff4014000000001100c28306 +:1003ec000400410400000000ffff02241000c2a31f +:1003fc00000000001000c28321e8c0031c00bf8f66 +:10040c001800be8f2000bd270800e003000000008c +:10041c00d0ffbd272c00bfaf2800beaf21f0a0033a +:10042c001000a0afcf0004242128000021300000d0 +:10043c0021380000db3f400f00000000cf000424f7 +:10044c00bb40400f000000001300401000000000f3 +:10045c001800c0af1c00c0afffff02241800c2a3dd +:10046c002000c2271800c32721206000212840004b +:10047c00080006248f3f400f000000002700c393a4 +:10048c00ff0002240400621000000000ffff0224a1 +:10049c002a41400b000000002110000021e8c0039d +:1004ac002c00bf8f2800be8f3000bd270800e00352 +:1004bc0000000000d8ffbd272400bfaf2000beaf56 +:1004cc0021f0a0032800c4af2118a0002110c00007 +:1004dc002c00c3a73000c2a31600c0a31200c0a7f3 +:1004ec002c00c2970120422c050040100000000097 +:1004fc002c00c2971400c2a74541400b000000001d +:10050c00002002241400c2a70a0002241000c2a773 +:10051c001a00c2272120400001000524693f400f2a +:10052c00000000000500401000000000ffff022446 +:10053c001600c2a36241400b000000001a00c293d7 +:10054c00f0004330f00002240b00621000000000a9 +:10055c001000c2872b100200ff0042301000c3971e +:10056c00ffff63241000c3a7e9ff40140000000044 +:10057c006241400b00000000000000001600c38325 +:10058c00ffff022435006210000000001000c2873b +:10059c000500401c00000000ffff02241600c2a34f +:1005ac009b41400b000000001200c2872800c38f43 +:1005bc00211862001400c2972120600021284000fd +:1005cc00693f400f000000000500401000000000d3 +:1005dc00ffff02241600c2a39b41400b0000000049 +:1005ec003000c2930f00401400000000b0808293d2 +:1005fc000c004014000000001800c227212040000d +:10060c0002000524693f400f000000000500401067 +:10061c0000000000ffff02241600c2a39b41400b08 +:10062c00000000001200c3971400c2972110620052 +:10063c00ffff42301200c2a71400c2972c00c397d0 +:10064c00231062002c00c2a72c00c297a4ff4014f8 +:10065c00000000009b41400b000000000000000067 +:10066c001600c28321e8c0032400bf8f2000be8f78 +:10067c002800bd270800e00300000000d8ffbd27bc +:10068c002400bfaf2000beaf21f0a0032800c4aff0 +:10069c002110a0002c00c2a71000c0a71400c0a3fa +:1006ac001800c0a72c00c2970120422c0500401056 +:1006bc00000000002c00c2971200c2a7b641400bec +:1006cc0000000000002002241200c2a7f0ff022448 +:1006dc001600c2a31000c2870d00401400000000d9 +:1006ec002c00c2970120422c050040100000000095 +:1006fc00030002241500c2a3d141400b00000000ee +:10070c00010002241500c2a3d141400b00000000df +:10071c002c00c2970120422c050040100000000064 +:10072c00030002241500c2a3d141400b00000000bd +:10073c00020002241500c2a31600c3931500c29335 +:10074c0025106200ff0042301600c2a31600c2271b +:10075c0021204000010005247c3f400f00000000d8 +:10076c000500401000000000ffff02241400c2a38b +:10077c000942400b000000001000c2872800c38f04 +:10078c00211862001200c29721206000212840002d +:10079c007c3f400f000000000500401000000000ee +:1007ac00ffff02241400c2a30942400b000000000a +:1007bc00b08082930c004014000000001800c22787 +:1007cc0021204000020005247c3f400f0000000067 +:1007dc000500401000000000ffff02241400c2a31b +:1007ec000942400b000000001000c3971200c29792 +:1007fc0021106200ffff42301000c2a72c00c397eb +:10080c001200c297231062002c00c2a72c00c297c2 +:10081c00a4ff4014000000001400c28321e8c003b0 +:10082c002400bf8f2000be8f2800bd270800e003e6 +:10083c0000000000d8ffbd272400bfaf2000beafd2 +:10084c0021f0a0032800c4af2c00c5af1a00c0a330 +:10085c00c9ff02241800c2a31900c0a32800c28f2c +:10086c003100422c0500401000000000c3ff0224a0 +:10087c001800c2a3010002241900c2a31800c293dd +:10088c001900c3931000a3af212040002800c58f8e +:10089c002c00c68f04000724db3f400f0000000033 +:1008ac001a00c2a31a00c28304004010000000000a +:1008bc00ffff02244042400b000000001800c293ce +:1008cc0021204000bb40400f000000001a00c2a3d2 +:1008dc001a00c28306004010000000000741400fc0 +:1008ec0000000000ffff02244042400b000000000b +:1008fc002110000021e8c0032400bf8f2000be8f10 +:10090c002800bd270800e00300000000d8ffbd2729 +:10091c002400bfaf2000beaf21f0a0032800c4af5d +:10092c002c00c5af2110c0003000c2a7c7ff0224a5 +:10093c001800c2a33000c397010002240300621404 +:10094c0000000000020002243000c2a71800c3936c +:10095c003000c2971000a0af212060002800c58f86 +:10096c002130000021384000db3f400f0000000028 +:10097c001900c2a31900c28304004010000000003b +:10098c00ffff02248242400b000000001800c293bb +:10099c0021204000bb40400f000000001900c2a302 +:1009ac001900c28306004010000000000741400ff0 +:1009bc0000000000ffff02248242400b00000000f8 +:1009cc003000c2972c00c48f21284000a241400f58 +:1009dc00000000001900c2a31900c28306004010d9 +:1009ec00000000000741400f00000000ffff022440 +:1009fc008242400b000000002110000021e8c003df +:100a0c002400bf8f2000be8f2800bd270800e00304 +:100a1c0000000000d8ffbd272400bfaf2000beaff0 +:100a2c0021f0a0032800c4af2c00c5af1a00c0a34e +:100a3c00caff02241800c2a31900c0a32800c28f49 +:100a4c000001422c0500401000000000c4ff0224ed +:100a5c001800c2a3010002241900c2a31800c293fb +:100a6c001900c3931000a3af212040002800c58fac +:100a7c002130000004000724db3f400f0000000081 +:100a8c001a00c2a31a00c283040040100000000028 +:100a9c00ffff0224d542400b000000001800c29357 +:100aac0021204000bb40400f000000001a00c2a3f0 +:100abc001a00c28306004010000000000741400fde +:100acc0000000000ffff0224d542400b0000000094 +:100adc001900c2931c00c3272120600004000524c8 +:100aec00213040003041400f000000001a00c2a32a +:100afc001a00c28306004010000000000741400f9e +:100b0c0000000000ffff0224d542400b0000000053 +:100b1c001c00c293211840001d00c2930012020059 +:100b2c00251862001e00c2930014020025186200f2 +:100b3c001f00c29300160200251862002c00c28f01 +:100b4c00000043ac2110000021e8c0032400bf8f3b +:100b5c002000be8f2800bd270800e0030000000025 +:100b6c00d8ffbd272400bfaf2000beaf21f0a003eb +:100b7c002800c4af2c00c5af2110c0003000c2a7a4 +:100b8c00c8ff02241a00c2a31900c0a33000c397e7 +:100b9c00010002240500621400000000020002247f +:100bac003000c2a7010002241900c2a31a00c3938b +:100bbc003000c2971000a0af212060002800c58f24 +:100bcc002130000021384000db3f400f00000000c6 +:100bdc001800c2a31800c2830400401000000000db +:100bec00ffff02242b43400b000000001a00c293ad +:100bfc0021204000bb40400f000000001800c2a3a1 +:100c0c001800c28306004010000000000741400f8e +:100c1c0000000000ffff02242b43400b00000000eb +:100c2c001900c2930e004010000000003000c29763 +:100c3c001c00c32721206000212840002130000027 +:100c4c003041400f000000001800c2a31c00c393e9 +:100c5c002c00c28f000043a02243400b0000000078 +:100c6c003000c2972c00c48f212840002130000096 +:100c7c003041400f000000001800c2a31800c283ce +:100c8c0006004010000000000741400f000000006b +:100c9c00ffff02242b43400b00000000211000003a +:100cac0021e8c0032400bf8f2000be8f2800bd2781 +:100cbc000800e00300000000e0ffbd271c00bfaff0 +:100ccc001800beaf21f0a00324e804349a43400f6f +:100cdc00000000001000c2af1000c38f8fff022471 +:100cec00241062001000c2af1000c28f50004234ba +:100cfc001000c2af24e804341000c58f1042400f1e +:100d0c000000000021e8c0031c00bf8f1800be8f3c +:100d1c002000bd270800e00300000000e0ffbd2715 +:100d2c001c00bfaf1800beaf21f0a0031400c0af71 +:100d3c00b08080a31400c22724e80434212840008a +:100d4c008842400f000000000d0040100000000021 +:100d5c0001000224b08082a31400c22724e80434ca +:100d6c00212840008842400f000000000400401081 +:100d7c0000000000faff02248a43400b0000000030 +:100d8c00b080829318004014000000001400c38f40 +:100d9c00f3ff0224241062001400c2af1400c38fae +:100dac008fff0224241062001400c2af1400c28f03 +:100dbc00500042341400c2af1400c28f24e8043433 +:100dcc00212840001042400f000000000400401099 +:100ddc0000000000faff02248a43400b00000000d0 +:100dec0001000224b08082a3001004241000c2274a +:100dfc00212840008842400f0000000004004010f1 +:100e0c0000000000faff02248a43400b000000009f +:100e1c003143400f000000002110000021e8c00306 +:100e2c001c00bf8f1800be8f2000bd270800e003f8 +:100e3c0000000000f8ffbd270400beaf21f0a003a6 +:100e4c00b08080a32110000021e8c0030400be8ff5 +:100e5c000800bd270800e00300000000e0ffbd27ec +:100e6c001c00bfaf1800beaf21f0a0032000c4af20 +:100e7c002000c48f1000c227212840008842400f58 +:100e8c00000000001000c28f21e8c0031c00bf8fbf +:100e9c001800be8f2000bd270800e00300000000f2 +:100eac00f0ffbd270c00beaf21f0a00380bf033cb8 +:100ebc000060628cc47b027c006062ac80bf023c30 +:100ecc00106040ac80bf033c1060628c8452027c8a +:100edc00106062ac88bf033cf010628c07000424e5 +:100eec008420827cf01062ac88bf033cf010628cd2 +:100efc00030004240408827cf01062ac80bf033c25 +:100f0c001060628c01000424847b827c106062acd3 +:100f1c0088bf033c3010628c04e7027c301062ac5a +:100f2c0088bf033c6010628c0100042404e7827cbf +:100f3c00601062ac80bf033c1060628c8439027c10 +:100f4c00106062ac88bf033c3010628cc4de027c43 +:100f5c00301062ac88bf033c6010628c010004242a +:100f6c00c4de827c601062ac80bf033c1060628c7b +:100f7c00010004240463827c106062ac80bf033cdb +:100f8c000060628cc47b027c006062ac80bf033c5e +:100f9c000068628cc47b027c006862ac80bf023c3f +:100fac00106840ac80bf033c1068628c8452027c99 +:100fbc00106862ac88bf033c1011628c07000424db +:100fcc008420827c101162ac88bf033c1011628caf +:100fdc000408027c101162ac80bf033c1068628c68 +:100fec0001000424847b827c106862ac88bf033cc3 +:100ffc004010628c8452027c401062ac88bf033c6f +:10100c007010628c8452027c701062ac80bf033c06 +:10101c001068628c8439027c106862ac88bf033c17 +:10102c004010628c444a027c401062ac88bf033c86 +:10103c007010628c444a027c701062ac80bf033c1e +:10104c001068628c010004240463827c106862ac1a +:10105c0080bf033c1068628c010004248452827ca3 +:10106c00106862ac80bf033c0068628cc47b027c5d +:10107c00006862ac0000c0af5044400b00000000a0 +:10108c0000a0023c0000c38f4019030064024224fc +:10109c0021106200000040ac00a0023c0000c38f95 +:1010ac00401903006402422421106200080040ac85 +:1010bc0000a0033c0000c28f6402632440110200b4 +:1010cc00211062000c0040ac00a0023c0000c38f59 +:1010dc00401903006402422421106200100040ac4d +:1010ec0000a0033c0000c28f640263244011020084 +:1010fc0021106200140040ac00a0023c0000c38f21 +:10110c00401903006402422421106200180040ac14 +:10111c0000a0033c0000c28f640263244011020053 +:10112c00211062001c0040ac0000c28f0100422460 +:10113c000000c2af0000c28f02004228d0ff401452 +:10114c000000000021e8c0030c00be8f1000bd277a +:10115c000800e00300000000f0ffbd270c00beaf4c +:10116c0021f0a0031000c4af1400c5af1800c6af27 +:10117c001c00c7af1000c28f0300422804004014ab +:10118c000000000006000224dc44400b00000000bc +:10119c002000c28f80180200c404023c00b4423408 +:1011ac001a004300f4016000101800001210000037 +:1011bc00ffff42240400c2af0000c0af2400c28f66 +:1011cc000900401000000000010003240700431434 +:1011dc00000000000000c28f010042340000c2afca +:1011ec007e44400b000000000000000000a0033c07 +:1011fc001000c28f640263244011020021106200af +:10120c001400c38f1c0043ac2800c28f01000324c0 +:10121c0006004310000000000200032408004310e5 +:10122c00000000009744400b000000000000c28f3b +:10123c00020042340000c2af9744400b0000000093 +:10124c000000c28f040042340000c2af0000000056 +:10125c001000c28f060040100000000001000324a3 +:10126c001e00431000000000d444400b000000009e +:10127c0088bf033c4061628cc418027c406162ac44 +:10128c0088bf033c6061628c01000424c418827c1a +:10129c00606162ac0000c38f80bf023c006043ac55 +:1012ac0080bf033c0060628c01000424c418827c63 +:1012bc00006062ac0400c38f80bf023c406043ac52 +:1012cc0080bf033c0060628c01000424c47b827ce0 +:1012dc00006062acd444400b0000000088bf033cab +:1012ec004061628c4429027c406162ac88bf033c43 +:1012fc006061628c010004244429827c606162acd0 +:10130c000000c38f80bf023c006843ac80bf033c2d +:10131c000068628c01000424c418827c006862acf2 +:10132c000400c38f80bf023c406843ac80bf033cc9 +:10133c000068628c01000424c47b827c006862ac6f +:10134c000000000000a0023c1000c38f40190300f5 +:10135c00640242242110620001000324180043acf3 +:10136c000100022421e8c0030c00be8f1000bd2731 +:10137c000800e00300000000d0ffbd272c00bfaf29 +:10138c002800beaf21f0a0033000c4af3400c5afbd +:10139c003800c6af3c00c7af3800c28f40190200fe +:1013ac0000a0023c64024224211062002400c2af5f +:1013bc002400c28f1800428c04004014000000006e +:1013cc0003000224a245400b000000002400c28f41 +:1013dc001400438c0100022404006214000000007d +:1013ec0002000224a245400b000000003400c28f12 +:1013fc001000c2af1000c28f02004228030040143c +:10140c0000000000010002241000c2af2400c28fb3 +:10141c00040043242400c28f000043ac2400c28f7c +:10142c000000428c1400c2af2400c28f1000c38f86 +:10143c00080043ac1800c0af2745400b000000006b +:10144c003000c28f000043801400c28f000043a004 +:10145c001400c28f010042241400c2af3000c28fae +:10146c00010042243000c2af3000c38f4000c28f55 +:10147c002b10430003004010000000003c00c28f02 +:10148c003000c2af1800c28f010042241800c2af56 +:10149c001800c38f1000c28f2a106200e8ff40149e +:1014ac00000000002400c28f01000324140043ac90 +:1014bc003800c28f06004010000000000100032419 +:1014cc003900431000000000a145400b0000000053 +:1014dc0088bf023c6010438c0010023c2410620058 +:1014ec000e004010000000002400c28f1c00428c33 +:1014fc00212040001000c58fc824400f00000000c0 +:10150c0080bf033c1060628c010004248452827cf6 +:10151c00106062aca145400b000000001c00c0af85 +:10152c005e45400b000000003000c28f000042807e +:10153c002118400080bf023c206043ac3000c28fb9 +:10154c00010042243000c2af0000000080bf023c0a +:10155c001060428c00014230fcff40100000000083 +:10156c001c00c28f010042241c00c2af1c00c38fa0 +:10157c003400c28f2a106200ebff40140000000000 +:10158c002400c28f140040ac2400c28f1c00428c7b +:10159c00212040001000c58fc824400f000000001f +:1015ac00a145400b0000000088bf023c7010428c2b +:1015bc00000442300e004010000000002400c28fd6 +:1015cc001c00428c212040001000c58fc824400f05 +:1015dc000000000080bf033c1068628c01000424f2 +:1015ec008452827c106862aca145400b0000000064 +:1015fc002000c0af9345400b000000003000c28fac +:10160c00000042802118400080bf023c206843ac9f +:10161c003000c28f010042243000c2af0000000035 +:10162c0080bf023c1068428c00014230fcff40102d +:10163c00000000002000c28f010042242000c2af35 +:10164c002000c38f3400c28f2a106200ebff4014bd +:10165c00000000002400c28f140040ac2400c28f94 +:10166c001c00428c212040001000c58fc824400f64 +:10167c0000000000000000000100022421e8c0036b +:10168c002c00bf8f2800be8f3000bd270800e00360 +:10169c0000000000f0ffbd270c00beaf21f0a0033e +:1016ac001000c4af1400c5af1800c6af0000c0af27 +:1016bc00c245400b000000001000c28f00004280a9 +:1016cc002118400080bf023c206843ac1000c28f40 +:1016dc00010042241000c2af0000000080bf023c99 +:1016ec001068428c00014230fcff401000000000ea +:1016fc000000c28f010042240000c2af0000c38f63 +:10170c001400c28f2a106200ebff4014000000008e +:10171c000100022421e8c0030c00be8f1000bd277d +:10172c000800e00300000000e0ffbd271c00bfaf75 +:10173c001800beaf21f0a00380bf023c1068428ca1 +:10174c00010042301c0040100000000080bf023c31 +:10175c001068428c0200423005004010000000006e +:10176c0080bf033c1068628c4408027c106862ac39 +:10177c001000c0afe945400b0000000080bf023ce8 +:10178c003068428c1400c2a31400c2932120400084 +:10179c001f58400f0000000080bf023c1068428cb4 +:1017ac000100423004004010000000001000c28f05 +:1017bc00f2ff40180000000021e8c0031c00bf8f9e +:1017cc001800be8f2000bd270800e00300000000b9 +:1017dc0000e85d4100701a4000601b40c8ffbd2747 +:1017ec003400bbaf44781b7c001c7b3700609b40f3 +:1017fc002400bfaf2000beaf121000002c00a2af1f +:10180c00101800002800a3af21f0a00300a0023c98 +:10181c00640242241400c2af88bf023c3010438cd7 +:10182c000010023c241062002e004010000000004a +:10183c0088bf023c6010438c0010023c24106200f4 +:10184c00280040100000000088bf033c3010628c60 +:10185c0004e7027c301062ac1400c28f0800428c8a +:10186c00090040140000000080bf033c1060628c33 +:10187c008452027c106062ac1400c28f140040ac25 +:10188c003c46400b000000001400c28f0000428c4c +:10189c00000043802120600080bf033c206064acca +:1018ac00010043241400c28f000043ac1400c28f0b +:1018bc000800428cffff43241400c28f080043ac85 +:1018cc0080bf023c1060428c000242300500401484 +:1018dc00000000001400c28f0800428ceaff401484 +:1018ec000000000088bf023c3010438c0008023c12 +:1018fc0024106200390040100000000088bf023c38 +:10190c006010438c0008023c24106200330040102d +:10191c000000000088bf033c3010628cc4de027ce7 +:10192c00301062ac80bf023c1060428c020042302e +:10193c000f0040100000000080bf033c1060628c60 +:10194c004408027c106062ac88bf033c3010628c8f +:10195c00c4de027c301062ac029d023ce8f84424e8 +:10196c00517d400f000000007a46400b0000000043 +:10197c001000c0af6d46400b0000000080bf023c61 +:10198c003060428c1800c2a31000c38f488182279c +:10199c00211062001800c393000043a01000c28ff6 +:1019ac00010042241000c2af80bf023c1060428c88 +:1019bc0001004230f1ff4014000000001400c28fff +:1019cc001c00438c48818227212060002128400084 +:1019dc001000c68f6622400f0000000021e8c003f3 +:1019ec002c00a28f130040002800a38f1100600070 +:1019fc002400bf8f2000be8f3400bb8f3800bd2762 +:101a0c0000e8dd4100609b401800004200e85d41a9 +:101a1c0000701a4000601b40c8ffbd273400bbafec +:101a2c0044781b7c001c7b3700609b402400bfafbc +:101a3c002000beaf121000002c00a2af1018000046 +:101a4c002800a3af21f0a00300a0023c8402422492 +:101a5c001400c2af88bf023c4010428c00044230dc +:101a6c002d0040100000000088bf023c7010428c1a +:101a7c0000044230280040100000000088bf033ce6 +:101a8c004010628c8452027c401062ac1400c28ff5 +:101a9c000800428c090040140000000080bf033c89 +:101aac001068628c8452027c106862ac1400c28f85 +:101abc00140040acc946400b000000001400c28f5b +:101acc000000428c000043802120600080bf033c5a +:101adc00206864ac010043241400c28f000043aca6 +:101aec001400c28f0800428cffff43241400c28fe5 +:101afc00080043ac80bf023c1068428c00024230ac +:101b0c0005004014000000001400c28f0800428c35 +:101b1c00eaff40140000000088bf023c4010428cd9 +:101b2c0000024230350040100000000088bf023c2b +:101b3c007010428c00024230300040100000000057 +:101b4c0088bf033c4010628c444a027c401062ac5b +:101b5c0080bf023c1068428c020042300b004010e7 +:101b6c000000000080bf033c1068628c4408027cbb +:101b7c00106862ac88bf033c4010628c444a027c03 +:101b8c00401062ac0247400b000000001000c0afd8 +:101b9c00f446400b0000000080bf023c3068428cd1 +:101bac001800c2a31000c38f498182272110620044 +:101bbc001800c393000043a01000c28f0100422400 +:101bcc001000c2af80bf023c1068428c0100423052 +:101bdc00f1ff4014000000001400c28f1c00438c65 +:101bec0048818227010042242120600021284000e6 +:101bfc001000c68f6622400f0000000021e8c003d1 +:101c0c002c00a28f130040002800a38f110060004d +:101c1c002400bf8f2000be8f3400bb8f3800bd273f +:101c2c0000e8dd4100609b4018000042f8ffbd2732 +:101c3c000400beaf21f0a00380bf033c0060628ca7 +:101c4c00c47b027c006062ac80bf033c1060628c81 +:101c5c008452027c106062ac88bf033c6010628cc2 +:101c6c0004e7027c601062ac88bf033c3010628ccd +:101c7c0004e7027c301062ac88bf033c6010628cbd +:101c8c000100042404e7827c601062ac88bf033c32 +:101c9c006010628cc4de027c601062ac88bf033cb6 +:101cac006010628cc4de027c601062ac88bf033ca6 +:101cbc003010628cc4de027c301062ac88bf033cf6 +:101ccc006010628c01000424c4de827c601062ac63 +:101cdc0080bf033c1060628c010004240463827c8e +:101cec00106062ac00a0023c00a0033c68026324bc +:101cfc00640243ac00a0023c640242240c0040ace1 +:101d0c0000a0023c64024224140040ac80bf033c9f +:101d1c000060628c01000424c47b827c006062ac95 +:101d2c0021e8c0030400be8f0800bd270800e003b3 +:101d3c0000000000f8ffbd270400beaf21f0a00397 +:101d4c0080bf033c0068628cc47b027c006862ac80 +:101d5c0080bf033c1068628c8452027c106862acb9 +:101d6c0088bf033c7010628c8452027c701062ac91 +:101d7c0088bf033c4010628c8452027c401062ace1 +:101d8c0088bf033c7010628c010004248452827c56 +:101d9c00701062ac88bf033c7010628c444a027ca9 +:101dac00701062ac88bf033c4010628c444a027cc9 +:101dbc00401062ac88bf033c7010628c444a027cb9 +:101dcc00701062ac80bf033c1068628c010004246c +:101ddc000463827c106862ac00a0023c6402422462 +:101dec0000a0033c88026324200043ac00a0023c0a +:101dfc00640242242c0040ac00a0023c6402422449 +:101e0c00340040ac80bf033c0068628c01000424a9 +:101e1c00c47b827c006862ac21e8c0030400be8fe6 +:101e2c000800bd270800e00300000000f8ffbd27f4 +:101e3c000400beaf21f0a00321e8c0030400be8f54 +:101e4c000800bd270800e00300000000e8ffbd27e4 +:101e5c001400bfaf1000beaf21f0a00300a0023ce5 +:101e6c006c074224508182af00a0023c6c074424d2 +:101e7c00212800002c010624357a400f00000000b8 +:101e8c0000a0023c40064424212800002c0106241a +:101e9c00357a400f0000000000a0023c14054424d9 +:101eac00212800002c010624357a400f0000000088 +:101ebc00548180af21e8c0031400bf8f1000be8f87 +:101ecc001800bd270800e00300000000e8ffbd2754 +:101edc001400bfaf1000beaf21f0a0035481828f5d +:101eec000a00401000000000010003240800431405 +:101efc0000000000548180afb739400f0000000093 +:101f0c0000000000c747400b00000000000000006c +:101f1c0021e8c0031400bf8f1000be8f1800bd272e +:101f2c000800e00300000000e0ffbd271c00bfaf6d +:101f3c001800beaf21f0a0032000c4af2400c5af31 +:101f4c002000c28f15004010000000001000c0af30 +:101f5c001000c0afe547400b000000002000c28f0e +:101f6c00000042902000c38f010063242000c3af07 +:101f7c0021204000f047400f000000001000c28fed +:101f8c00010042241000c2af1000c38f2400c28f86 +:101f9c002a106200f1ff40140000000021e8c00389 +:101fac001c00bf8f1800be8f2000bd270800e00367 +:101fbc0000000000e8ffbd271400bfaf1000beaf4b +:101fcc0021f0a003211080001800c2a31800c393b5 +:101fdc000d0002241d00621400000000029d023c52 +:101fec0030b14424b14a400f0000000000a0023c74 +:101ffc006c074224000042800900401000000000e1 +:10200c0000a0023c4006442400a0023c6c0745247e +:10201c008374400f000000004448400f0000000093 +:10202c0000a0023c6c074224508182af00a0023c0d +:10203c006c074424212800002c010624357a400f1b +:10204c00000000003e48400b000000001800c39345 +:10205c000800022405006210000000001800c39361 +:10206c007f00022411006214000000001800c283db +:10207c0021204000c64a400f000000005081838f91 +:10208c0000a0023c6c074224180062100000000003 +:10209c005081828fffff4224508182af5081828f0a +:1020ac00000040a03e48400b000000001800c28316 +:1020bc0021204000c64a400f000000005081838f51 +:1020cc0000a0023c980842242b106200070040102c +:1020dc00000000005081828f1800c383000043a0d1 +:1020ec005081828f01004224508182af21e8c003cd +:1020fc001400bf8f1000be8f1800bd270800e0032e +:10210c0000000000b8febd274401bfaf4001beafc8 +:10211c0021f0a0032000c22721204000212800002c +:10212c001e000624357a400f000000004000c22734 +:10213c0021204000212800001e000624357a400f83 +:10214c00000000006000c227212040002128000070 +:10215c001e000624357a400f000000008000c227c4 +:10216c0021204000212800001e000624357a400f53 +:10217c0000000000a000c227212040002128000000 +:10218c001e000624357a400f000000004000c227d4 +:10219c006000c3271000a3af8000c3271400a3afb7 +:1021ac00a000c3271800a3af00a0033c6c07642455 +:1021bc00029d033c34b165242000c327213060000c +:1021cc0021384000ca7c400f000000002000c227cc +:1021dc0021204000029d023c44b145240400062409 +:1021ec00df7b400f000000001200401400000000d4 +:1021fc0000a0023c0c304224588182af00a0023c6b +:10220c000c304224212040002f77400f00000000aa +:10221c0000a0033c0c306424212840005c3a400fa1 +:10222c00000000005881828f308082afab4a400b97 +:10223c00000000002000c22721204000029d023c2b +:10224c004cb1452405000624df7b400f0000000044 +:10225c0037004014000000004000c22700004280fc +:10226c000700401400000000029d023c54b14424bd +:10227c00b14a400f00000000ab4a400b00000000c8 +:10228c004000c22721204000029d023c90b1452411 +:10229c0002000624df7b400f000000000900401400 +:1022ac0000000000029d023c94b14424b14a400f4e +:1022bc00000000005a73400f00000000c948400b9a +:1022cc00000000004000c22721204000029d023c7b +:1022dc00b4b1452403000624df7b400f000000004e +:1022ec000900401400000000029d023cb8b14424d7 +:1022fc00b14a400f000000006e73400f0000000058 +:10230c00c948400b00000000029d023cd8b1442497 +:10231c00b14a400f00000000029d023c18b2442458 +:10232c00b14a400f00000000ab4a400b0000000017 +:10233c002000c22721204000029d023c1cb24524f3 +:10234c0004000624df7b400f0000000080004014d6 +:10235c00000000004000c22700004280070040142b +:10236c0000000000029d023c24b24424b14a400ffc +:10237c0000000000ab4a400b000000004000c227e8 +:10238c0021204000029d023c90b14524020006240d +:10239c00df7b400f0000000015004014000000001f +:1023ac00eb39400f0000000021184000010002240e +:1023bc000900621000000000029d023c60b244243f +:1023cc00b14a400f00000000fd38400f0000000033 +:1023dc005149400b00000000029d023c78b244249d +:1023ec00b14a400f000000005149400b00000000b2 +:1023fc004000c22721204000029d023cb4b145247c +:10240c0003000624df7b400f000000001300401483 +:10241c0000000000eb39400f0000000009004010e4 +:10242c0000000000029d023c94b24424b14a400fcb +:10243c000000000001000224548182af5149400b7e +:10244c0000000000029d023cbcb24424b14a400f83 +:10245c00000000005149400b000000004000c22762 +:10246c0021204000029d023ce8b2452406000624cf +:10247c00df7b400f000000002f0040140000000024 +:10248c00eb39400f000000000500432c2a006010bf +:10249c000000000080180200019d023cbc24422474 +:1024ac00211062000000428c080040000000000077 +:1024bc00d024019de824019d0025019d1825019d36 +:1024cc003025019d029d023cf0b24424b14a400fdc +:1024dc00000000005149400b00000000029d023c2e +:1024ec0004b34424b14a400f000000005149400b92 +:1024fc0000000000029d023c14b34424b14a400f7a +:10250c00000000005149400b00000000029d023cfd +:10251c0028b34424b14a400f000000005149400b3d +:10252c0000000000029d023c34b34424b14a400f29 +:10253c000000000000000000029d023c18b2442480 +:10254c00b14a400f00000000ab4a400b00000000f5 +:10255c002000c22721204000029d023c4cb34524a0 +:10256c0007000624df7b400f0000000091004014a0 +:10257c00000000004000c227000042802d004014e3 +:10258c0000000000be6d400f00000000c000c3271b +:10259c0021206000029d033c54b36524213040008f +:1025ac00507c400f00000000029d023c58b34424b4 +:1025bc00b14a400f00000000c000c227212040009b +:1025cc00b14a400f00000000029d023c18b24424a6 +:1025dc00b14a400f00000000d86d400f0000000011 +:1025ec00d000c32721206000029d033c6cb36524fe +:1025fc0021304000507c400f00000000029d023c46 +:10260c0070b34424b14a400f00000000d000c22730 +:10261c0021204000b14a400f00000000029d023c06 +:10262c008cb34424b14a400f00000000ab4a400b6d +:10263c00000000004000c22721204000029d023c07 +:10264c0090b3452407000624df7b400f00000000f8 +:10265c001800401400000000be6d400f0000000088 +:10266c00e000c32721206000029d033c54b3652485 +:10267c0021304000507c400f00000000029d023cc5 +:10268c0058b34424b14a400f00000000e000c227b8 +:10269c0021204000b14a400f00000000029d023c86 +:1026ac0018b24424b14a400f00000000ea49400b24 +:1026bc00000000004000c22721204000029d023c87 +:1026cc0098b3452407000624df7b400f0000000070 +:1026dc001800401400000000d86d400f00000000ee +:1026ec00f000c32721206000029d033c6cb36524dd +:1026fc0021304000507c400f00000000029d023c45 +:10270c0070b34424b14a400f00000000f000c2270f +:10271c0021204000b14a400f00000000029d023c05 +:10272c008cb34424b14a400f00000000ea49400b2e +:10273c00000000004000c22721204000029d023c06 +:10274c00a0b3452403000624df7b400f00000000eb +:10275c001200401400000000e16d400f000000006a +:10276c000001c32721206000029d033c6cb365244b +:10277c0021304000507c400f00000000029d023cc4 +:10278c00a4b34424b14a400f00000000029d023c57 +:10279c00b4b34424b14a400f00000000029d023c37 +:1027ac0018b24424b14a400f00000000ab4a400b61 +:1027bc00000000002000c22721204000029d023ca6 +:1027cc00e8b2452406000624df7b400f0000000021 +:1027dc00a200401400000000029d023cb8b3442447 +:1027ec00b14a400f000000008273400f000000004f +:1027fc000700401400000000029d023cccb34424ae +:10280c00b14a400f00000000174a400b00000000c6 +:10281c008273400f000000002118400001000224c8 +:10282c000700621400000000029d023ce8b344243f +:10283c00b14a400f00000000174a400b0000000096 +:10284c00029d023c04b44424b14a400f0000000035 +:10285c00eb39400f00000000010003241600431068 +:10286c00000000000200432805006010000000007a +:10287c000b00401000000000434a400b0000000019 +:10288c000200032412004310000000000300032484 +:10289c001500431000000000434a400b00000000ec +:1028ac00029d023c24b44424b14a400f00000000b5 +:1028bc00484a400b00000000029d023c40b44424f6 +:1028cc00b14a400f00000000484a400b00000000d5 +:1028dc00029d023c58b44424b14a400f0000000051 +:1028ec00484a400b00000000029d023c74b4442492 +:1028fc00b14a400f00000000484a400b00000000a5 +:10290c00029d023c98b44424b14a400f00000000e0 +:10291c00000000001001c2272120400021280000e7 +:10292c000f000624357a400f00000000be6d400fea +:10293c00000000001001c32721206000029d033c11 +:10294c00b0b4652421304000507c400f00000000e2 +:10295c00029d023c58b34424b14a400f00000000d1 +:10296c001001c22721204000b14a400f0000000096 +:10297c00029d023cb8b44424b14a400f0000000050 +:10298c002001c22721204000212800000f0006242e +:10299c00357a400f00000000d86d400f0000000099 +:1029ac002001c32721206000029d033cbcb4652498 +:1029bc0021304000507c400f00000000029d023c82 +:1029cc0070b34424b14a400f000000002001c2271c +:1029dc0021204000b14a400f000000006400042494 +:1029ec009f53400f000000003001c22721204000ff +:1029fc00212800000f000624357a400f000000004b +:102a0c00e16d400f000000003001c3272120600061 +:102a1c00029d033cc4b4652421304000507c400f1f +:102a2c0000000000029d023ca4b34424b14a400fb4 +:102a3c00000000003001c22721204000b14a400fa5 +:102a4c0000000000029d023c18b24424b14a400f21 +:102a5c0000000000ab4a400b000000002000c22721 +:102a6c00212040002f77400f000000002000c327da +:102a7c0021206000029d033cccb465242130400031 +:102a8c00df7b400f0000000005004010000000003c +:102a9c00029d023cd4b44424b14a400f0000000013 +:102aac0021e8c0034401bf8f4001be8f4801bd2700 +:102abc000800e00300000000e0ffbd271c00bfafd2 +:102acc001800beaf1400b0af21f0a0032000c4afbb +:102adc002000d08f2000c48f2f77400f0000000003 +:102aec0021200002212840005c3a400f0000000029 +:102afc0021e8c0031c00bf8f1800be8f1400b08fdc +:102b0c002000bd270800e00300000000e8ffbd27ff +:102b1c001400bfaf1000beaf21f0a0032110800045 +:102b2c001800c2a31800c293212040007e3a400f27 +:102b3c000000000021e8c0031400bf8f1000be8ffe +:102b4c001800bd270800e00300000000f8ffbd27b7 +:102b5c000400beaf21f0a00321e8c0030400be8f27 +:102b6c000800bd270800e00300000000f8ffbd27a7 +:102b7c000400beaf21f0a003211080000800c2a702 +:102b8c000800c28700ff423003120200201e027ca4 +:102b9c000800c297001202002016027c2510620069 +:102bac002016027c21e8c0030400be8f0800bd275c +:102bbc000800e00300000000f8ffbd270400beafd2 +:102bcc0021f0a0030800c4af0800c28f021e02004f +:102bdc000800c48fff00023c241082000312020084 +:102bec00251862000800c28f00ff4230001202005c +:102bfc00251862000800c28f001602002510620022 +:102c0c0021e8c0030400be8f0800bd270800e003c4 +:102c1c0000000000d8ffbd272400bfaf2000beafce +:102c2c0021f0a0032800c4af2c00c5af3000c6af04 +:102c3c001000c0af1400c22721204000029d023cae +:102c4c0024ad45242c00c68f507c400f00000000a2 +:102c5c002c00c28f0f00422c1f00401000000000ff +:102c6c001000c0af264b400b000000001000c28fbc +:102c7c002800c38f2110620030000324000043a001 +:102c8c001000c28f010042241000c2af3000c28f6e +:102c9c00ffff43241000c28f2a104300f3ff40149f +:102cac00000000001000c28f2800c38f212062009a +:102cbc003000c38f1000c28f231062001400c32792 +:102ccc002128600021304000d576400f0000000024 +:102cdc000a4c400b000000002c00c28fff00422c5d +:102cec001f004010000000001000c0af484b400b0c +:102cfc00000000001000c28f2800c38f211062005a +:102d0c0030000324000043a01000c28f01004224b5 +:102d1c001000c2af3000c28ffeff43241000c28fe0 +:102d2c002a104300f3ff4014000000001000c28f73 +:102d3c002800c38f212062003000c38f1000c28f87 +:102d4c00231062001400c3272128600021304000aa +:102d5c00d576400f000000000a4c400b000000002c +:102d6c002c00c28fff0f422c1f00401000000000ef +:102d7c001000c0af6a4b400b000000001000c28f67 +:102d8c002800c38f2110620030000324000043a0f0 +:102d9c001000c28f010042241000c2af3000c28f5d +:102dac00fdff43241000c28f2a104300f3ff401490 +:102dbc00000000001000c28f2800c38f2120620089 +:102dcc003000c38f1000c28f231062001400c32781 +:102ddc002128600021304000d576400f0000000013 +:102dec000a4c400b000000002c00c38fffff023484 +:102dfc002b1062001f004010000000001000c0af3c +:102e0c008d4b400b000000001000c28f2800c38fb8 +:102e1c002110620030000324000043a01000c28f78 +:102e2c00010042241000c2af3000c28ffcff4324cb +:102e3c001000c28f2a104300f3ff40140000000062 +:102e4c001000c28f2800c38f212062003000c38f76 +:102e5c001000c28f231062001400c32721286000c9 +:102e6c0021304000d576400f000000000a4c400b8a +:102e7c00000000002c00c38f0f00023cffff423407 +:102e8c002b1062001f004010000000001000c0afab +:102e9c00b14b400b000000001000c28f2800c38f04 +:102eac002110620030000324000043a01000c28fe8 +:102ebc00010042241000c2af3000c28ffbff43243c +:102ecc001000c28f2a104300f3ff401400000000d2 +:102edc001000c28f2800c38f212062003000c38fe6 +:102eec001000c28f231062001400c3272128600039 +:102efc0021304000d576400f000000000a4c400bfa +:102f0c00000000002c00c38fff00023cffff423486 +:102f1c002b1062001f004010000000001000c0af1a +:102f2c00d54b400b000000001000c28f2800c38f4f +:102f3c002110620030000324000043a01000c28f57 +:102f4c00010042241000c2af3000c28ffaff4324ac +:102f5c001000c28f2a104300f3ff40140000000041 +:102f6c001000c28f2800c38f212062003000c38f55 +:102f7c001000c28f231062001400c32721286000a8 +:102f8c0021304000d576400f000000000a4c400b69 +:102f9c00000000002c00c38fff0f023cffff4234e7 +:102fac002b1062001d004010000000001000c0af8c +:102fbc00f94b400b000000001000c28f2800c38f9b +:102fcc002110620030000324000043a01000c28fc7 +:102fdc00010042241000c2af3000c28ff9ff43241d +:102fec001000c28f2a104300f3ff401400000000b1 +:102ffc001000c28f2800c38f212062003000c38fc5 +:10300c001000c28f231062001400c3272128600017 +:10301c0021304000d576400f000000000100022452 +:10302c0021e8c0032400bf8f2000be8f2800bd27dd +:10303c000800e00300000000d8ffbd272400bfaf4c +:10304c002000beaf21f0a0032800c4af2c00c5aff8 +:10305c001000c0af1400c22721204000029d023c8a +:10306c0024ad45242c00c68f507c400f000000007e +:10307c002c00c28f0f00422c0700401000000000f3 +:10308c001400c3832800c28f000043a00100022457 +:10309c00e04c400b000000002c00c28fff00422cc3 +:1030ac0016004010000000001000c0af3b4c400b5d +:1030bc00000000001000c28f2800c38f2110620096 +:1030cc001000c38f1000c4272118830004006380f4 +:1030dc00000043a01000c28f010042241000c2afb8 +:1030ec001000c28f02004228f2ff401400000000c2 +:1030fc0002000224e04c400b000000002c00c28fa8 +:10310c00ff0f422c16004010000000001000c0af52 +:10311c00544c400b000000001000c28f2800c38fdd +:10312c00211062001000c38f1000c42721188300e7 +:10313c0004006380000043a01000c28f01004224f1 +:10314c001000c2af1000c28f03004228f2ff4014df +:10315c000000000003000224e04c400b00000000c3 +:10316c002c00c38fffff02342b106200160040109e +:10317c00000000001000c0af6e4c400b00000000bf +:10318c001000c28f2800c38f211062001000c38f63 +:10319c001000c4272118830004006380000043a0a2 +:1031ac001000c28f010042241000c2af1000c28f69 +:1031bc0004004228f2ff4014000000000400022426 +:1031cc00e04c400b000000002c00c38f0f00023cb1 +:1031dc00ffff42342b10620016004010000000006c +:1031ec001000c0af894c400b000000001000c28fd3 +:1031fc002800c38f211062001000c38f1000c42759 +:10320c002118830004006380000043a01000c28fcb +:10321c00010042241000c2af1000c28f05004228ea +:10322c00f2ff40140000000005000224e04c400bab +:10323c00000000002c00c38fff00023cffff423453 +:10324c002b10620016004010000000001000c0aff0 +:10325c00a44c400b000000001000c28f2800c38f4c +:10326c00211062001000c38f1000c42721188300a6 +:10327c0004006380000043a01000c28f01004224b0 +:10328c001000c2af1000c28f06004228f2ff40149b +:10329c000000000006000224e04c400b000000007f +:1032ac002c00c38fff0f023cffff42342b10620037 +:1032bc0016004010000000001000c0afbf4c400bc7 +:1032cc00000000001000c28f2800c38f2110620084 +:1032dc001000c38f1000c4272118830004006380e2 +:1032ec00000043a01000c28f010042241000c2afa6 +:1032fc001000c28f07004228f2ff401400000000ab +:10330c0007000224e04c400b000000002c00c38f8f +:10331c00ffff022416006210000000001000c0af76 +:10332c00d84c400b000000001000c28f2800c38f47 +:10333c00211062001000c38f1000c42721188300d5 +:10334c0004006380000043a01000c28f01004224df +:10335c001000c2af1000c28f08004228f2ff4014c8 +:10336c000000000008000224e04c400b00000000ac +:10337c002110000021e8c0032400bf8f2000be8f65 +:10338c002800bd270800e00300000000e0ffbd2777 +:10339c001c00bfaf1800beaf21f0a0032000c4afcb +:1033ac002110a0002800c6af2400c2a31000c0af9b +:1033bc002400c2931400c32721206000029d033c0b +:1033cc0024ad652421304000507c400f00000000eb +:1033dc002400c2930f00422c1f004010000000007c +:1033ec001000c0af064d400b000000001000c28f53 +:1033fc002000c38f2110620030000324000043a082 +:10340c001000c28f010042241000c2af2800c28fee +:10341c00ffff43241000c28f2a104300f3ff401417 +:10342c00000000001000c28f2000c38f212062001a +:10343c002800c38f1000c28f231062001400c32712 +:10344c002128600021304000d576400f000000009c +:10345c00394d400b000000002400c393ff000224f0 +:10346c001d006210000000001000c0af284d400b82 +:10347c00000000001000c28f2000c38f21106200da +:10348c0030000324000043a01000c28f010042242e +:10349c001000c2af2800c28ffeff43241000c28f61 +:1034ac002a104300f3ff4014000000001000c28fec +:1034bc002000c38f212062002800c38f1000c28f10 +:1034cc00231062001400c327212860002130400023 +:1034dc00d576400f000000000100022421e8c00353 +:1034ec001c00bf8f1800be8f2000bd270800e00312 +:1034fc0000000000e8ffbd271400beaf21f0a003c0 +:10350c001800c4af1c00c5af2000c6af0000c0af90 +:10351c000400c0af0800c0af010002240c00c2af11 +:10352c002000c38f1000022436006214000000003b +:10353c001c00c28fffff42240000c2af7f4d400b26 +:10354c00000000001c00c28fffff43240000c28f4c +:10355c0009006214000000000000c28f1800c38f25 +:10356c002110620000004280d0ff42240800c2af4c +:10357c007c4d400b000000000000c28f0400c2af65 +:10358c006b4d400b000000000c00c28f00110200bc +:10359c000c00c2af0400c28f010042240400c2af71 +:1035ac001c00c28ffeff43240400c28f2a1062004d +:1035bc00f5ff4010000000000000c28f1800c38f00 +:1035cc002110620000004280d0ff422421184000ec +:1035dc000c00c28f021862700800c28f21104300c9 +:1035ec000800c2af0000c28fffff42240000c2af30 +:1035fc000000c28fd3ff410400000000b54d400b0a +:10360c00000000002000c38f0a0002242e00621468 +:10361c00000000000000c0afb04d400b00000000e7 +:10362c000000c28f050040140000000001000224bd +:10363c000c00c2afa24d400b000000000400c0af54 +:10364c009d4d400b000000000c00c28f401002008a +:10365c0080180200211043000c00c2af0400c28f7e +:10366c00010042240400c2af0400c38f0000c28fcb +:10367c002a106200f4ff4014000000000000c28f0a +:10368c001800c38f2110620000004280d0ff42243a +:10369c00211840000c00c28f021862700800c28f03 +:1036ac00211043000800c2af0000c28f0100422469 +:1036bc000000c2af0000c38f1c00c28f2a10620032 +:1036cc00d7ff4014000000000800c28f21e8c0039f +:1036dc001400be8f1800bd270800e0030000000096 +:1036ec00e0ffbd271c00bfaf1800beaf21f0a00348 +:1036fc002000c4af2110a0002400c2a32400c29358 +:10370c001000c32721206000029d033c24ad6524da +:10371c0021304000507c400f000000002400c29378 +:10372c000f00422c07004010000000001000c38363 +:10373c002000c28f000043a001000224e34d400b87 +:10374c00000000002400c393ff0002240b00621051 +:10375c00000000001000c3832000c28f000043a0b3 +:10376c002000c28f010042241100c383000043a03b +:10377c0002000224e34d400b000000002110000069 +:10378c0021e8c0031c00bf8f1800be8f2000bd278e +:10379c000800e00300000000e8ffbd271400beafe6 +:1037ac0021f0a0031800c4af1c00c5af0400c0afcb +:1037bc000000c0af044e400b00000000029d023c14 +:1037cc000400c38f8018030028ad4224211062002e +:1037dc000000428c0800c2af0000c28f1800c38fdb +:1037ec002110620000004280211840000800c28fa6 +:1037fc00261062000400c2af0000c28f01004224f8 +:10380c000000c2af0000c38f1c00c28f2a106200e0 +:10381c00eaff4014000000000400c28f21e8c0033e +:10382c001400be8f1800bd270800e0030000000044 +:10383c00f8ffbd270400beaf21f0a0030800c4af01 +:10384c0021e8c0030400be8f0800bd270800e00378 +:10385c000000000060ffbd279c00bfaf9800beaf0a +:10386c0021f0a003211880002110a000a800c6aff1 +:10387c00a000c3a3a400c2a71100c0a3a000c293c0 +:10388c00060003242000431000000000070003245e +:10389c00330043100000000001000324aa0043146d +:1038ac00000000002800c227a800c48f2128400077 +:1038bc007000062421380000c930400f00000000c1 +:1038cc001100c2a31100c2838f004014000000003d +:1038dc009080828f8f00401000000000a800c28fe3 +:1038ec0070004224948082af9080828f2800c3277e +:1038fc00010004242128600009f8400000000000a9 +:10390c00d54e400b000000001c00c227a800c48f3d +:10391c00212840000400062421380000c930400f43 +:10392c00000000001100c2a31100c2837c004014ef +:10393c00000000009080828f7c004010000000008e +:10394c009080828f1c00c32706000424212860006d +:10395c0009f8400000000000d54e400b00000000ac +:10396c00010002241000c2a32000c227a800c48fab +:10397c00212840000800062421380000c930400fdf +:10398c00000000001100c2a31100c28351004014ba +:10399c00000000002400c2971200c2a72600c297a4 +:1039ac001400c2a72200c2971600c2a72000c2971b +:1039bc001800c2af1200c2970300401400000000b0 +:1039cc00010002241c8082af1200c3971400c2971e +:1039dc00211862001600c29702006210000000005d +:1039ec001000c0a31800c28f010003242c00431048 +:1039fc00000000000100432c0900601400000000ce +:103a0c00020003240e0043100000000003000324f6 +:103a1c000f00431000000000a34e400b00000000fc +:103a2c001c80838f0100022420006214000000001f +:103a3c001800c28f1c8082afb84e400b00000000f3 +:103a4c001800c28f1c8082afb84e400b00000000e3 +:103a5c001c80838f020002241700621000000000fb +:103a6c001c80838f040002241600621000000000ea +:103a7c001800c28f1c8082afb84e400b00000000b3 +:103a8c001c80838f020002241100621000000000d1 +:103a9c00040002241c8082afb84e400b00000000d2 +:103aac0000000000b84e400b0000000000000000b9 +:103abc00b84e400b0000000000000000b84e400b58 +:103acc000000000000000000b84e400b0000000099 +:103adc00000000001000c29317004010000000000e +:103aec009080828f17004010000000009080828f21 +:103afc00070004241c80852709f840000000000002 +:103b0c00d54e400b0000000000000000d54e400bcd +:103b1c000000000000000000d54e400b000000002b +:103b2c0000000000d54e400b00000000000000001b +:103b3c00d54e400b0000000000000000d54e400b9d +:103b4c00000000000000000021e8c0039c00bf8fb3 +:103b5c009800be8fa000bd270800e0030000000005 +:103b6c00d0ffbd272c00bfaf2800beaf21f0a003b3 +:103b7c003000c4af3400c5af2110c0003800c2a75c +:103b8c002000c0a33000c28f3800c3973400c48f0c +:103b9c001000a4af1400a3af700003241800a3af4f +:103bac000500042482000524213040007000072405 +:103bbc00462e400f000000002000c2a32000c2834c +:103bcc0021e8c0032c00bf8f2800be8f3000bd271a +:103bdc000800e00300000000b8ffbd274400bfafa1 +:103bec004000beaf21f0a0034800c4af4c00c5afed +:103bfc002000c0a34c00c28f0106422c23004010b1 +:103c0c00000000004800c28f2800c2af2800c28ffd +:103c1c00c86e0324000043a44c00c28f030042244e +:103c2c0082100200ffff43302800c28f020043a421 +:103c3c002800c28f040040a44c00c28f0300422411 +:103c4c0082100200ffff43302800c28f060043a4fd +:103c5c004c00c28fffff42304800c38f1000a3af4f +:103c6c001400a2af1800a0af0500042484000524a2 +:103c7c002130000021380000462e400f00000000cb +:103c8c002000c2a3c44f400b000000002400c0afb2 +:103c9c002c00c0af4800c38f2400c28f21106200db +:103cac003400c3272120600021284000080006248e +:103cbc00466a400f000000004c00c38f2400c28fe6 +:103ccc0023106200000503240105442c0a10640033 +:103cdc002c00c2af4800c38f2400c28f2110620099 +:103cec003000c2af3000c28fc86e0324000043a462 +:103cfc004c00c28f0300422482100200ffff4330ad +:103d0c003000c28f020043a42400c28f030042245f +:103d1c0082100200ffff43303000c28f040043a426 +:103d2c002c00c28f0300422482100200ffff43309c +:103d3c003000c28f060043a44800c38f2400c28ffa +:103d4c00211862002c00c28fffff42301000a3af7d +:103d5c001400a2af1800a0af0500042484000524b1 +:103d6c002130000021380000462e400f00000000da +:103d7c002000c2a34800c38f2400c28f2118620008 +:103d8c003400c227212060002128400008000624ae +:103d9c00466a400f000000002400c38f2c00c28f25 +:103dac00211062002400c2afbf4f400b0000000086 +:103dbc002400c28ff8ff42244800c38f21106200f8 +:103dcc003400c3272120600021284000080006246d +:103ddc00466a400f000000004c00c38f2400c28fc5 +:103dec0023106200000503240105442c0a10640012 +:103dfc002c00c2af2c00c28f03004324fcff022412 +:103e0c00241062002c00c2af2400c28ff8ff4224a1 +:103e1c004800c38f211062003000c2af3000c28f47 +:103e2c00c86e0324000043a44c00c28f030042243c +:103e3c0082100200ffff43303000c28f020043a407 +:103e4c002400c28f0300422482100200ffff433083 +:103e5c003000c28f040043a42c00c28f0300422404 +:103e6c0082100200ffff43303000c28f060043a4d3 +:103e7c002400c28ff8ff42244800c38f211862002f +:103e8c002c00c28fffff423008004224ffff42305b +:103e9c001000a3af1400a2af1800a0af05000424bb +:103eac00840005242130000021380000462e400fec +:103ebc00000000002000c2a32400c28ff8ff42249f +:103ecc004800c38f211862003400c22721206000f3 +:103edc002128400008000624466a400f000000001c +:103eec002400c38f2c00c28f211062002400c2afab +:103efc002400c38f4c00c28f2b106200acff401407 +:103f0c00000000002000c28321e8c0034400bf8fe2 +:103f1c004000be8f4800bd270800e00300000000f1 +:103f2c00e0ffbd271c00bfaf1800beaf21f0a003ff +:103f3c002000c4af2400c5af2800c6af2c00c7af0b +:103f4c00010002241000c2a31100c0a39480828f30 +:103f5c000400401400000000f4ff02249450400bb5 +:103f6c00000000009480838f2000c28f212060000d +:103f7c00212840000200062421380000c930400fdf +:103f8c000000000090004014000000009480828f1c +:103f9c0002004224948082af9480838f1600c22743 +:103fac002120600021284000020006242138000056 +:103fbc00c930400f000000008600401400000000d3 +:103fcc009480828f02004224948082af9480838fed +:103fdc001200c22721206000212840000200062484 +:103fec0021380000c930400f000000007c00401454 +:103ffc00000000009480828f02004224948082afe3 +:10400c009480838f1400c227212060002128400057 +:10401c000200062421380000c930400f00000000c7 +:10402c0072004014000000009480828f0200422431 +:10403c00948082af2000c28f0000429400120200d4 +:10404c00201e027c2000c28f00004294021202004b +:10405c00ffff42302016027c251062002016027ce5 +:10406c00ffff43302000c28f000043a41600c2970c +:10407c0000120200201e027c1600c29702120200df +:10408c00ffff42302016027c251062002016027cb5 +:10409c00ffff43302c00c28f400043a41200c29794 +:1040ac0000120200201e027c1200c29702120200b3 +:1040bc00ffff42302016027c251062002016027c85 +:1040cc00ffff42301200c2a71400c2970012020078 +:1040dc00201e027c1400c29702120200ffff423025 +:1040ec002016027c251062002016027cffff423055 +:1040fc001400c2a79480848f2c00c38f2c00c28f15 +:10410c004000429440100200ffff42302128600022 +:10411c002130400021380000c930400f0000000061 +:10412c0035004014000000002c00c28f4000429467 +:10413c0040100200211840009480828f21106200f0 +:10414c00948082af9480838f1200c29721206000ec +:10415c002400c58f2130400021380000c930400fa9 +:10416c000000000027004014000000001200c2975d +:10417c00211840009480828f21106200948082afbd +:10418c009480838f1400c297212060002800c58f73 +:10419c002130400021380000c930400f00000000e1 +:1041ac001b004014000000001400c29721184000ae +:1041bc009480828f21106200948082af1000c0a383 +:1041cc008850400b00000000000000008850400b9d +:1041dc0000000000000000008850400b00000000b0 +:1041ec00000000008850400b0000000000000000a0 +:1041fc008850400b00000000000000008850400b6d +:10420c0000000000000000008850400b000000007f +:10421c00000000001000c2930900401000000000d4 +:10422c00f4ff02241100c2a3212000002128000069 +:10423c002130000001000724c930400f00000000ad +:10424c001100c28321e8c0031c00bf8f1800be8f71 +:10425c002000bd270800e00300000000e0ffbd27a0 +:10426c001c00bfaf1800beaf21f0a0032000c4afec +:10427c002110a0002400c2a7010002241000c2a338 +:10428c001100c0a39480828f040040140000000031 +:10429c00f4ff0224c450400b000000009480838f74 +:1042ac002400c297212060002000c58f21304000df +:1042bc0021380000c930400f0000000004004014f9 +:1042cc00000000001000c0a3b850400b000000001c +:1042dc00000000001000c293090040100000000014 +:1042ec00f4ff02241100c2a32120000021280000a9 +:1042fc002130000001000724c930400f00000000ed +:10430c001100c28321e8c0031c00bf8f1800be8fb0 +:10431c002000bd270800e00300000000e8ffbd27d7 +:10432c001400bfaf1000beaf21f0a003212000008d +:10433c00212800002130000001000724c930400f63 +:10434c000000000021e8c0031400bf8f1000be8fd6 +:10435c001800bd270800e00300000000f8ffbd278f +:10436c000400beaf21f0a003948080af21e8c0030d +:10437c000400be8f0800bd270800e0030000000009 +:10438c00d0ffbd272c00bfaf2800beaf21f0a0038b +:10439c003000c4af2000c0a33000c28f2400c2afd5 +:1043ac002400c2271000a0af1400a0af1800a0afcb +:1043bc0005000424050005242130400004000724d6 +:1043cc00462e400f000000002000c2a32000c28334 +:1043dc0021e8c0032c00bf8f2800be8f3000bd2702 +:1043ec000800e00300000000e0ffbd271c00bfaf89 +:1043fc001800beaf21f0a0032000c4af1000c0a372 +:10440c002000c28f908082af948080af0400022481 +:10441c001c8082af05000424019d023c60384524b9 +:10442c006031400f000000001000c2a31000c283d6 +:10443c0021e8c0031c00bf8f1800be8f2000bd27d1 +:10444c000800e00300000000e8ffbd271400bfaf28 +:10445c001000beaf21f0a00380bf023c000640acb0 +:10446c0080bf033c0006628c010004240429827c7a +:10447c00000662ac80bf023c100640ac80bf023c20 +:10448c0010270324200643ac88bf033ca010628c89 +:10449c00020004248420827ca01062ac88bf033c00 +:1044ac00a010628c030004240408827ca01062ac6f +:1044bc0088bf033c3010628c0421027c301062ac4b +:1044cc0088bf033c6010628c010004240421827cb0 +:1044dc00601062ac80bf033c0006628c01000424b7 +:1044ec00c47b827c000662ac00a0023cb80e442463 +:1044fc0021280000a8000624357a400f0000000097 +:10450c0021e8c0031400bf8f1000be8f1800bd2718 +:10451c000800e00300000000f0ffbd270c00beaf58 +:10452c0021f0a0031000c4af0000c0af1000c28f78 +:10453c00c0100200801802002318620000a0023c88 +:10454c00b80e4224211062001400428c4600401028 +:10455c00000000001000c28fc01002008018020082 +:10456c002318620000a0023cb80e42242110620005 +:10457c000400438c1000c28fc01002008020020087 +:10458c002320820000a0023cb80e4224211082009d +:10459c000000428c231062000000c2af0000c38fe9 +:1045ac001000c28fc0100200802002002320820065 +:1045bc0000a0023cb80e4224211082000c00428c58 +:1045cc002b1062000c004014000000001000c28f81 +:1045dc00c0100200801802002318620000a0023ce8 +:1045ec00b80e422421106200040040ac01000224e9 +:1045fc009e51400b000000000000c28f1a004104c5 +:10460c00000000000000c28fe80342242118400083 +:10461c001000c28fc01002008020020023208200f4 +:10462c0000a0023cb80e4224211082000c00428ce7 +:10463c002b1062000c004014000000001000c28f10 +:10464c00c0100200801802002318620000a0023c77 +:10465c00b80e422421106200040040ac0100022478 +:10466c009e51400b000000002110000021e8c00307 +:10467c000c00be8f1000bd270800e00300000000f6 +:10468c00f0ffbd270c00beaf21f0a0031000c4af9b +:10469c000000c0af1000c28fc010020080180200d2 +:1046ac002318620000a0023cb80e422421106200c4 +:1046bc001400428c45004010000000001000c28f16 +:1046cc00c0100200801802002318620000a0023cf7 +:1046dc00b80e4224211062000800438c1000c28fd7 +:1046ec00c0100200802002002320820000a0023ca7 +:1046fc00b80e4224211082000000428c231062006c +:10470c000000c2af0000c38f1000c28fc0100200a7 +:10471c00802002002320820000a0023cb80e42241c +:10472c00211082001000428c2b1062000c004014ef +:10473c00000000001000c28fc010020080180200a0 +:10474c002318620000a0023cb80e42242110620023 +:10475c00080040ac01000224f751400b000000009f +:10476c000000c28f19004104000000000000c28f3d +:10477c00ffff43241000c28fc010020080200200f3 +:10478c002320820000a0023cb80e4224211082009b +:10479c001000428c2b1062000c0040140000000032 +:1047ac001000c28fc0100200801802002318620093 +:1047bc0000a0023cb80e422421106200080040ac5c +:1047cc0001000224f751400b0000000021100000f2 +:1047dc0021e8c0030c00be8f1000bd270800e003c9 +:1047ec0000000000f0ffbd270c00beaf21f0a003bd +:1047fc001000c4af0000c0af1000c28fc010020088 +:10480c00801802002318620000a0023cb80e42245b +:10481c00211062001400428cd900401000000000ee +:10482c001000c28fc0100200801802002318620012 +:10483c0000a0023cb80e4224211062000800438cf8 +:10484c001000c28fc01002008020020023208200c2 +:10485c0000a0023cb80e4224211082000000428cc1 +:10486c00231062000000c2af0000c38f1000c28f83 +:10487c00c0100200802002002320820000a0023c15 +:10488c00b80e4224211082001000428c2b106200c2 +:10489c0056004014000000001000c28fc01002002f +:1048ac00801802002318620000a0023cb80e4224bb +:1048bc00211062000400438c1000c28fc010020053 +:1048cc00802002002320820000a0023cb80e42246b +:1048dc00211082000000428c231062000000c2af45 +:1048ec000000c38f1000c28fc01002008020020095 +:1048fc002320820000a0023cb80e4224211082002a +:10490c000c00428c2b1062001400401400000000bc +:10491c001000c28fc0100200801802002318620021 +:10492c0000a0023cb80e422421106200080040acea +:10493c001000c28fc0100200801802002318620001 +:10494c0000a0023cb80e422421106200040040acce +:10495c0001000224e452400b000000000000c28f52 +:10496c0087004104000000000000c28fe8034224cd +:10497c00211840001000c28fc010020080200200dd +:10498c002320820000a0023cb80e42242110820099 +:10499c000c00428c2b1062007900401400000000c7 +:1049ac001000c28fc0100200801802002318620091 +:1049bc0000a0023cb80e422421106200080040ac5a +:1049cc001000c28fc0100200801802002318620071 +:1049dc0000a0023cb80e422421106200040040ac3e +:1049ec0001000224e452400b000000000000c28fc2 +:1049fc0063004104000000000000c28fffff43244d +:104a0c001000c28fc0100200802002002320820000 +:104a1c0000a0023cb80e4224211082001000428cef +:104a2c002b10620056004014000000001000c28fd2 +:104a3c00c0100200801802002318620000a0023c83 +:104a4c00b80e4224211062000400438c1000c28f67 +:104a5c00c0100200802002002320820000a0023c33 +:104a6c00b80e4224211082000000428c23106200f8 +:104a7c000000c2af0000c38f1000c28fc010020034 +:104a8c00802002002320820000a0023cb80e4224a9 +:104a9c00211082000c00428c2b1062001400401478 +:104aac00000000001000c28fc0100200801802002d +:104abc002318620000a0023cb80e422421106200b0 +:104acc00080040ac1000c28fc01002008018020019 +:104adc002318620000a0023cb80e42242110620090 +:104aec00040040ac01000224e452400b0000000022 +:104afc000000c28f22004104000000000000c28fa1 +:104b0c00e8034224211840001000c28fc01002009c +:104b1c00802002002320820000a0023cb80e422418 +:104b2c00211082000c00428c2b10620014004014e7 +:104b3c00000000001000c28fc0100200801802009c +:104b4c002318620000a0023cb80e4224211062001f +:104b5c00080040ac1000c28fc01002008018020088 +:104b6c002318620000a0023cb80e422421106200ff +:104b7c00040040ac01000224e452400b0000000091 +:104b8c002110000021e8c0030c00be8f1000bd27cf +:104b9c000800e00300000000e8ffbd271400bfafd1 +:104bac001000beaf21f0a0031800c4af1c00c5afad +:104bbc001800c28fc0100200801802002318620077 +:104bcc0000a0023cb80e4224211062000100032414 +:104bdc00140043ac1c00c28fe803422c1e0040148e +:104bec00000000001800c28fc010020080180200e4 +:104bfc002318620000a0023cb80e4224211062006f +:104c0c001c00c48fe80303241b008300f401600024 +:104c1c001020000012180000100043ac1800c28fc6 +:104c2c00c0100200801802002318620000a0023c91 +:104c3c00b80e4224211062001c00c48fe803032428 +:104c4c001b008300f4016000101800000c0043ac42 +:104c5c002a53400b000000001800c28fc010020045 +:104c6c00801802002318620000a0023cb80e4224f7 +:104c7c0021106200100040ac1800c28fc01002005e +:104c8c00801802002318620000a0023cb80e4224d7 +:104c9c00211062001c00c38f0c0043ac1800c48fa1 +:104cac005c53400f0000000021e8c0031400bf8fcc +:104cbc001000be8f1800bd270800e00300000000a4 +:104ccc00e8ffbd271400bfaf1000beaf21f0a0035a +:104cdc001800c4af1c00c5af1800c28fc010020072 +:104cec00801802002318620000a0023cb80e422477 +:104cfc002110620001000324140043ac1800c28f81 +:104d0c00c0100200801802002318620000a0023cb0 +:104d1c00b80e4224211062001c00c38f100043ac5b +:104d2c001800c28fc0100200801802002318620005 +:104d3c0000a0023cb80e4224211062000c0040acd2 +:104d4c001800c48f5c53400f0000000021e8c00322 +:104d5c001400bf8f1000be8f1800bd270800e003a1 +:104d6c0000000000f8ffbd270400beaf21f0a00337 +:104d7c000800c4af0800c28fc010020080180200e7 +:104d8c002318620000a0023cb80e422421106200dd +:104d9c00000040ac0800c28fc01002008018020056 +:104dac002318620000a0023cb80e422421106200bd +:104dbc00040040ac0800c28fc01002008018020032 +:104dcc002318620000a0023cb80e4224211062009d +:104ddc00080040ac21e8c0030400be8f0800bd27ca +:104dec000800e00300000000f8ffbd270400beaf80 +:104dfc0021f0a0030800c4af0800c28fc01002004d +:104e0c00801802002318620000a0023cb80e422455 +:104e1c00211062001400428c21e8c0030400be8ff4 +:104e2c000800bd270800e00300000000f8ffbd27c4 +:104e3c000400beaf21f0a0030800c4af0800c28f6d +:104e4c00c0100200801802002318620000a0023c6f +:104e5c00b80e422421106200140040ac21e8c003bb +:104e6c000400be8f0800bd270800e003000000000e +:104e7c00e8ffbd271400bfaf1000beaf21f0a003a8 +:104e8c001800c4af02000424e952400f1800c58f6b +:104e9c00aa53400b00000000400000000200042454 +:104eac00fc51400f00000000fbff40100000000010 +:104ebc008e53400f0200042421e8c0031400bf8f5e +:104ecc001000be8f0800e0031800bd2700e85d410c +:104edc0000701a4000601b40e0ffbd271c00baaff9 +:104eec001800bbaf44781b7c00087b3700609b40ec +:104efc001400beaf1000a4af0c00a3af0800a2af0b +:104f0c0021f0a00300a0023cb80e42240400c2af62 +:104f1c000000c0afe553400b000000000400c28f3e +:104f2c001400428c12004010000000000400c28fdc +:104f3c000400428ce80343380100632cff0063300b +:104f4c00010044240400c28f040044ac080060102b +:104f5c00000000000400c28f040040ac0400c28fab +:104f6c000800428c010043240400c28f080043acab +:104f7c000400c28f180042240400c2af0000c28f8c +:104f8c00010042240000c2af0000c28f0700422c77 +:104f9c00e2ff40140000000088bf033c3010628c1c +:104fac000421027c301062ac21e8c0031400be8fd7 +:104fbc001000a48f0c00a38f0800a28f006060412a +:104fcc00c00000001c00ba8f1800bb8f00709a4004 +:104fdc002000bd2700e8dd4100609b401800004226 +:104fec00e0ffbd271c00beaf21f0a00388bf033c2f +:104ffc002061628c01000424c418827c206162aca4 +:10500c00c404023c00b442340000c2af7d01023c37 +:10501c00407842340400c2af0400c28f401002003a +:10502c000000c38f1b006200f40140001018000048 +:10503c00121000000800c2af0400c28f4010020022 +:10504c000000c38f1b006200f40140001010000030 +:10505c0004004010000000000800c28f0100422430 +:10506c000800c2af0800c28f0101422c030040149b +:10507c0000000000000102240800c2af0800c28f2b +:10508c0004004010000000000800c28fffff422403 +:10509c000800c2af0800c28fff004230918182a38a +:1050ac00c404023c00b442340c00c2affa02023c0d +:1050bc0080f042341000c2af1000c28f40100200ca +:1050cc000c00c38f1b006200f4014000101800009c +:1050dc00121000001400c2af1000c28f401002006a +:1050ec000c00c38f1b006200f40140001010000084 +:1050fc0004004010000000001400c28f0100422484 +:10510c001400c2af1400c28f0101422c03004014e2 +:10511c0000000000000102241400c2af1400c28f72 +:10512c0004004010000000001400c28fffff422456 +:10513c001400c2af1400c28fff004230908182a3d2 +:10514c0021e8c0031c00be8f2000bd270800e0032f +:10515c0000000000e8ffbd271400bfaf1000beaf79 +:10516c0021f0a003e654400f00000000211840007d +:10517c000100022420006214000000008c54400f37 +:10518c000000000088bf033c2061628cc418027cc4 +:10519c00206162ac9081829301000424212840009c +:1051ac001a7c400f000000009081829321200000a7 +:1051bc00212840001a7c400f0000000088bf033cef +:1051cc002061628c01000424c418827c206162acd2 +:1051dc0001000424a554400f00000000029d023c75 +:1051ec0048e74424517d400f0000000001000224d8 +:1051fc008654400b00000000029d023c60e74424f2 +:10520c00517d400f000000002110000021e8c00378 +:10521c001400bf8f1000be8f1800bd270800e003dc +:10522c0000000000e8ffbd271400bfaf1000beafa8 +:10523c0021f0a00388bf033c2061628cc418027c5f +:10524c00206162ac908182930600042421284000e6 +:10525c001a7c400f0000000088bf033c2061628c68 +:10526c0001000424c418827c206162ac0100022479 +:10527c0021e8c0031400bf8f1000be8f1800bd279b +:10528c000800e00300000000e0ffbd271c00bfafda +:10529c001800beaf21f0a0032000c4af88bf033cb0 +:1052ac002061628cc418027c206162ac9181829373 +:1052bc0005000424212840001a7c400f0000000047 +:1052cc001000c2a39181829321200000212840006c +:1052dc001a7c400f000000001000c2a388bf033ce2 +:1052ec002061628c01000424c418827c206162acb1 +:1052fc002000c28f07004010000000001000c29375 +:10530c00029d033c80e7642421284000627d400f0d +:10531c00000000001000c29321e8c0031c00bf8fe6 +:10532c001800be8f2000bd270800e003000000001d +:10533c00e0ffbd271c00bfaf1800beaf21f0a003db +:10534c0021200000a554400f000000001000c2a353 +:10535c001000c29301004230ff00423004004010a4 +:10536c000000000001000224e054400b000000008b +:10537c002110000021e8c0031c00bf8f1800be8f55 +:10538c002000bd270800e00300000000e0ffbd275f +:10539c001c00bfaf1800beaf21f0a00388bf033cb8 +:1053ac002061628cc418027c206162ac9181829372 +:1053bc0090000424212840001a7c400f00000000bb +:1053cc009181829321200000212840001a7c400ffb +:1053dc0000000000918182932120000021284000d0 +:1053ec001a7c400f00000000918182932120000064 +:1053fc00212840001a7c400f00000000918182930c +:10540c0021200000212840001a7c400f00000000e1 +:10541c001000c2a39181829321200000212840001a +:10542c001a7c400f000000001100c2a388bf033c8f +:10543c002061628c01000424c418827c206162ac5f +:10544c001000c393bf00022405006214000000008a +:10545c001100c393410002240c00621000000000f4 +:10546c001000c3931100c293029d043ca0e7842456 +:10547c002128600021304000627d400f00000000b8 +:10548c00211000002f55400b000000001000c393aa +:10549c001100c293029d043cdce7842421286000a7 +:1054ac0021304000627d400f00000000010002240a +:1054bc0021e8c0031c00bf8f1800be8f2000bd2741 +:1054cc000800e00300000000e0ffbd271c00bfaf98 +:1054dc001800beaf21f0a0032000c4af2400c5af5c +:1054ec002800c6af2800c38f2400c28f2118620089 +:1054fc002000023c2a10620004004014000000004e +:10550c00211000008d55400b0000000088bf033cab +:10551c002061628cc418027c206162ac9181829300 +:10552c000b000424212840001a7c400f00000000ce +:10553c002800c38fff00023c2410620003140200f9 +:10554c00ff0042302118400091818293212060009d +:10555c00212840001a7c400f000000002800c28f58 +:10556c0000ff423003120200ff00423021184000bd +:10557c009181829321206000212840001a7c400fe9 +:10558c00000000002800c28fff00423021184000ac +:10559c009181829321206000212840001a7c400fc9 +:1055ac0000000000918182932120000021284000fe +:1055bc001a7c400f000000001000c0af8255400b59 +:1055cc000000000091818293de0004242128400019 +:1055dc001a7c400f00000000211840002000c28ff0 +:1055ec00000043a02000c28f010042242000c2af63 +:1055fc001000c28f010042241000c2af1000c38ff4 +:10560c002400c28f2a106200eeff4014000000003c +:10561c0088bf033c2061628c01000424c418827c86 +:10562c00206162ac0100022421e8c0031c00bf8f82 +:10563c001800be8f2000bd270800e003000000000a +:10564c00e8ffbd271400bfaf1000beaf21f0a003d0 +:10565c001800c4af1800c28fff0f42300400401076 +:10566c000000000021100000d955400b0000000084 +:10567c008c54400f0000000088bf033c2061628cfa +:10568c00c418027c206162ac9081829320000424b7 +:10569c00212840001a7c400f000000001800c38f26 +:1056ac00ff00023c2410620003140200ff00423091 +:1056bc002118400091818293212060002128400014 +:1056cc001a7c400f000000001800c28f00ff42300f +:1056dc0003120200ff004230211840009181829396 +:1056ec0021206000212840001a7c400f000000009f +:1056fc001800c28fff004230211840009181829324 +:10570c0021206000212840001a7c400f000000007e +:10571c0088bf033c2061628c01000424c418827c85 +:10572c00206162ac1800c28f010042241800c2af85 +:10573c0000000000cf54400f000000002118400072 +:10574c0001000224fbff6210000000008c54400f8b +:10575c00000000000100022421e8c0031400bf8fe8 +:10576c001000be8f1800bd270800e00300000000e9 +:10577c00e0ffbd271c00bfaf1800beaf21f0a00397 +:10578c002000c4af2400c5af2000c28fff0f4230f1 +:10579c000400401000000000211000004456400b93 +:1057ac00000000002400c38f0100022404006214d6 +:1057bc00000000002000c48f9355400f0000000033 +:1057cc0000a0023cb41b42241000c2af1400c0afb6 +:1057dc003f56400b000000008c54400f00000000ae +:1057ec0088bf033c2061628cc418027c206162accf +:1057fc009081829302000424212840001a7c400fdf +:10580c00000000002000c38fff00023c2410620047 +:10581c0003140200ff004230211840009181829352 +:10582c0021206000212840001a7c400f000000005d +:10583c002000c28f00ff423003120200ff004230f2 +:10584c002118400091818293212060002128400082 +:10585c001a7c400f000000002000c28fff00423075 +:10586c002118400091818293212060002128400062 +:10587c001a7c400f000000001000c28f0000428014 +:10588c00ff004230211840001000c28f010042245a +:10589c001000c2af9181829321206000212840002a +:1058ac001a7c400f0000000088bf033c2061628c12 +:1058bc0001000424c418827c206162ac2000c28fd9 +:1058cc00010042242000c2af00000000cf54400f62 +:1058dc00000000002118400001000224fbff6210b0 +:1058ec00000000001400c28f010042241400c2af5b +:1058fc001400c28f00104228b7ff401400000000b3 +:10590c000100022421e8c0031c00bf8f1800be8fc9 +:10591c002000bd270800e00300000000c8ffbd27e1 +:10592c003400bfaf3000beaf21f0a0033800c4afcd +:10593c003c00c5af4000c6af1c00c0af4000c38fd9 +:10594c003c00c28f211062002000c2af4000c28f09 +:10595c001000c2af3800c28f1400c2af2000c38f3a +:10596c002000023c2a1062004c0040140000000091 +:10597c0021100000ae56400b000000001000c28f3a +:10598c00ff0f4324000044280b1064000313020093 +:10599c00001302002400c2af00a0023cb41b44243c +:1059ac00001005242400c68f3555400f0000000060 +:1059bc0021184000010002240400621000000000c5 +:1059cc0021100000ae56400b0000000000a0023c6d +:1059dc00b41b43241000c48f2400c28f23108200f8 +:1059ec00211062001800c2af2800c0afa756400bb0 +:1059fc00000000001400c28f000043801800c28f0a +:105a0c00000043a01800c28f010042241800c2af4e +:105a1c001400c28f010042241400c2af1000c28fc8 +:105a2c00010042241000c2af1000c38f2000c28faf +:105a3c000b00621400000000010002242800c2af19 +:105a4c00010002241c00c2af2400c48f01000524f5 +:105a5c00df55400f00000000aa56400b000000006c +:105a6c001000c28fff0f42300900401400000000ec +:105a7c00010002242800c2af2400c48f01000524b9 +:105a8c00df55400f00000000aa56400b000000003c +:105a9c002800c28fd7ff4010000000001c00c28fee +:105aac00b6ff4010000000000100022421e8c003f2 +:105abc003400bf8f3000be8f3800bd270800e003d4 +:105acc0000000000e8ffbd271400bfaf1000beaf00 +:105adc0021f0a0032f58400f0000000021e8c00364 +:105aec001400bf8f1000be8f1800bd270800e00304 +:105afc0000000000e0ffbd271c00bfaf1800beafc8 +:105b0c001400b0af21f0a003211080002000c2a32c +:105b1c00248082930e00432c48016010000000008a +:105b2c0080180200019d023c485b42242110620057 +:105b3c000000428c0800400000000000805b019dca +:105b4c00a45b019d0c5c019d585c019da45c019db6 +:105b5c00e85c019d5c5d019da85d019df45d019d6e +:105b6c00505e019db05e019d105f019d985f019d8f +:105b7c00f85f019dc08080afc88080afcc8080a3cf +:105b8c00cd8080a3ce8080a301000224248082a338 +:105b9c001858400b000000002000c3938a00022418 +:105bac001200621400000000c880828f00a0033c29 +:105bbc00a4026324211843002000c493000064a0b5 +:105bcc0001004224c88082af02000224248082a3f8 +:105bdc00ce8083932000c29326106200ff004230d7 +:105bec00ce8082a31858400b00000000c08080af0c +:105bfc002f58400f000000001858400b0000000008 +:105c0c002000c293d08082a3c880828f00a0033c66 +:105c1c00a4026324211843002000c493000064a054 +:105c2c0001004224c88082af03000224248082a396 +:105c3c00ce8083932000c29326106200ff00423076 +:105c4c00ce8082a31858400b00000000c880828fc1 +:105c5c0000a0033ca4026324211843002000c49339 +:105c6c00000064a001004224c88082af040002241a +:105c7c00248082a32000c293cf8082a3ce80839302 +:105c8c002000c29326106200ff004230ce8082a317 +:105c9c001858400b00000000c880828f00a0033c05 +:105cac00a4026324211843002000c493000064a0c4 +:105cbc0001004224c88082af05000224248082a304 +:105ccc00ce8083932000c29326106200ff004230e6 +:105cdc00ce8082a31858400b000000002000c39314 +:105cec000100022409006210000000002000c39390 +:105cfc00ff00022405006210000000002f58400f26 +:105d0c00000000001858400b00000000c880828f73 +:105d1c0000a0033ca4026324211843002000c49378 +:105d2c00000064a001004224c88082af0600022457 +:105d3c00248082a3ce8083932000c293261062001d +:105d4c00ff004230ce8082a31858400b00000000a8 +:105d5c002000c293d18082a3c880828f00a0033c14 +:105d6c00a4026324211843002000c493000064a003 +:105d7c0001004224c88082af07000224248082a341 +:105d8c00ce8083932000c29326106200ff00423025 +:105d9c00ce8082a31858400b000000002000c29354 +:105dac00cd8082a3c880828f00a0033ca402632410 +:105dbc00211843002000c493000064a00100422479 +:105dcc00c88082af08000224248082a3ce808393f3 +:105ddc002000c29326106200ff004230ce8082a3c6 +:105dec001858400b00000000c08080af2000c29308 +:105dfc00c08082afc080828f00120200c08082af50 +:105e0c00c880828f00a0033ca402632421184300a5 +:105e1c002000c493000064a001004224c88082af1b +:105e2c0009000224248082a3ce8083932000c29395 +:105e3c0026106200ff004230ce8082a31858400b1f +:105e4c00000000002000c393c080828f25106200e8 +:105e5c00c08082afc080828f00120200c08082afef +:105e6c00c880828f00a0033ca40263242118430045 +:105e7c002000c493000064a001004224c88082afbb +:105e8c000a000224248082a3ce8083932000c29334 +:105e9c0026106200ff004230ce8082a31858400bbf +:105eac00000000002000c393c080828f2510620088 +:105ebc00c08082afc080828f00120200c08082af8f +:105ecc00c880828f00a0033ca402632421184300e5 +:105edc002000c493000064a001004224c88082af5b +:105eec000b000224248082a3ce8083932000c293d3 +:105efc0026106200ff004230ce8082a31858400b5f +:105f0c00000000002000c393c080828f2510620027 +:105f1c00c08082afc880828f00a0033ca40263249f +:105f2c00211843002000c493000064a00100422407 +:105f3c00c88082afc080828f2d01422c0300401498 +:105f4c00000000002f58400f00000000c080828f1e +:105f5c0005004014000000000d000224248082a3e0 +:105f6c00df57400b000000000c000224248082a3a9 +:105f7c00ce8083932000c29326106200ff00423033 +:105f8c00ce8082a31858400b00000000ce80839373 +:105f9c002000c29326106200ff004230ce8082a304 +:105fac00c880828f00a0033ca40263242118430004 +:105fbc002000c493000064a001004224c88082af7a +:105fcc00c480828f01004224c48082afc480838f3e +:105fdc00c080828f1e006214000000000d0002249d +:105fec00248082a31858400b00000000ce808293be +:105ffc002000c39305006210000000002f58400fd2 +:10600c00000000001858400b00000000cd80829367 +:10601c00218040000759400f0000000021200002a1 +:10602c0021284000b060400f000000002f58400fa6 +:10603c00000000001858400b000000002f58400fc3 +:10604c0000000000000000001858400b0000000089 +:10605c000000000021e8c0031c00bf8f1800be8f99 +:10606c001400b08f2000bd270800e00300000000e2 +:10607c00e8ffbd271400bfaf1000beaf21f0a00396 +:10608c00211080001800c2a31800c29321204000e8 +:10609c00c056400f0000000021e8c0031400bf8f61 +:1060ac001000be8f1800bd270800e00300000000a0 +:1060bc00f8ffbd270400beaf21f0a003c08080af65 +:1060cc00c88080afcc8080a3cd8080a3ce8080a3fd +:1060dc0001000224248082a3c48080afd18080a3dd +:1060ec00d08080a321e8c0030400be8f0800bd2728 +:1060fc000800e00300000000f0ffbd270c00beaf5d +:10610c0021f0a003cd8082932118400002000224cc +:10611c0003006214000000000000c0a30000000097 +:10612c0021e8c0030c00be8f1000bd270800e0035f +:10613c0000000000f0ffbd270c00beaf21f0a00353 +:10614c002118a0002110c0001000c4a31400c3a388 +:10615c001800c2a31000c3930100022405006214ae +:10616c0000000000a3ff02240000c2a36258400bf1 +:10617c000000000090ff02240000c2a31400c29390 +:10618c000100c2a321e8c0030c00be8f1000bd2784 +:10619c000800e00300000000f0ffbd270c00beafbc +:1061ac0021f0a0031000c4af2110a0001400c2a362 +:1061bc000000c0a30100c0a37d58400b00000000ec +:1061cc000100c2931000c38f2110620000004390a5 +:1061dc000000c293261062000000c2a30100c2930b +:1061ec00010042240100c2a30100c3931400c29316 +:1061fc002b106200f2ff4014000000000000c2935c +:10620c0021e8c0030c00be8f1000bd270800e0037e +:10621c0000000000f8ffbd270400beaf21f0a00372 +:10622c002480839301000224040062140000000007 +:10623c00211000009358400b0000000001000224c4 +:10624c0021e8c0030400be8f0800bd270800e0034e +:10625c0000000000d8ffbd272400bfaf2000beaf58 +:10626c001c00b0af21f0a003214080002120c00011 +:10627c002118e0004000c28f2800c8a32c00c5a341 +:10628c003000c4a33400c3a31000c2a33c00c28fcf +:10629c002d01422c07004014000000004400c28f66 +:1062ac00000040ac00a0023cdc0342240059400b2f +:1062bc000000000000a0023c8aff0324dc0343a082 +:1062cc0000a0023cdc03422401000324010043a093 +:1062dc0000a0023cdc0342243000c393020043a024 +:1062ec0000a0023cdc0342242800c393030043a01b +:1062fc0000a0023cdc0342242c00c393040043a006 +:10630c0000a0023cdc0342241000c393050043a010 +:10631c0000a0023cdc0342243400c393060043a0db +:10632c003c00c28f02160200ff00433000a0023c6a +:10633c00dc034224070043a03c00c28f021402007d +:10634c00ff00433000a0023cdc034224080043a0c1 +:10635c003c00c28f02120200ff00433000a0023c3e +:10636c00dc034224090043a03c00c28fff004330f1 +:10637c0000a0023cdc0342240a0043a000a0023c23 +:10638c00e7034224212040003800c58f3c00c68f13 +:10639c00d576400f000000003c00c28f0b0050244b +:1063ac003c00c28fff0042300b004224ff00423001 +:1063bc0000a0033cdc036424212840006958400ff2 +:1063cc00000000002118400000a0023cdc03422425 +:1063dc0021100202000043a03c00c28f0c0042249a +:1063ec00211840004400c28f000043ac00a0023cc6 +:1063fc00dc03422421e8c0032400bf8f2000be8fa1 +:10640c001c00b08f2800bd270800e003000000002e +:10641c00f8ffbd270400beaf21f0a00300a0023c92 +:10642c00af02422421e8c0030400be8f0800bd2740 +:08643c000800e003000000006d +:020000040000fa +:020000041d01dc +:10644400840000a00400000000000000300000a050 +:10645400040000000100000000010000880000a00a +:106464002000000000000000340000a0080000002c +:1064740001000000ffff040525010000a80000a0a2 +:106484000800000000000000b00000a008000000a8 +:10649400000000003c0000a0040000000100000017 +:1064a40004000000b80000a0140000000000000078 +:1064b400400000a0040000000100000013000000e0 +:1064c400cc0000a00400000000000000d00000a0e8 +:1064d4000100000000000000d20000a0060000003f +:1064e40000000000b40100a0b000000000000000a3 +:1064f400d80000a00400000000000000dc0000a0a0 +:106504000400000000000000640200a0400000003d +:1065140000000000e00000a01800000000000000df +:10652400440000a002000000010000000109000076 +:10653400a40200a06e02000000000000b42f00a01e +:10654400980300000100000057494e4333343030b3 +:106554005f30303a303000000000000000000000de +:1065640000000000000000000001000a3132333452 +:106574003546464646460000000000000000000084 +:10658400000000000000000100c0a801010000009c +:1065940057494e43333430305f30303a30300000a6 +:1065a4004865726520697320746865206c6973742a +:1065b400206f662074686520617661696c61626c25 +:1065c4006520636f6d6d616e64733a0a0d0a0d6820 +:1065d400656c70203a2053686f7773207468697310 +:1065e4002077696e646f770a0d0a706f7765722081 +:1065f4005b73746174655d20536574206368616cba +:10660400657427732031325620496e76657274653d +:1066140072206665656420706f776572207374619b +:1066240074652e20205468697320636f6d6d616eec +:106634006420636f6e74726f6c7320746865206d70 +:1066440061696e20706f7765722072656c61790a7a +:10665400202020202d20417661696c61626c6520c8 +:106664005b73746174655d20617267756d656e74ca +:10667400206172653a206f6e0a202020202020209d +:106684002020202020202020202020202020202006 +:106694002020202020202020202020202020206fa7 +:1066a40066660a0a77696669205b636f6d6d616e61 +:1066b400645d20636f6e74726f6c204368616c65f7 +:1066c400744475696e6f27732057694669206d6f2e +:1066d40064756c65207374617465250a202020201c +:1066e4002d20417661696c61626c65205b636f6d1e +:1066f4006d616e645d20617267756d656e74206195 +:1067040072653a206f6e20287475726e73204f4e36 +:10671400206d6f64756c65290a20202020202020bc +:106724002020202020202020202020202020202065 +:106734002020202020202020202020202020202055 +:10674400206f666620287475726e73204f4646204b +:106754006d6f64756c65290a20202020202020207c +:106764002020202020202020202020202020202025 +:106774002020202020202020202020202020202015 +:10678400737461747573202872657475726e7320e6 +:1067940063757272656e7420737461747573290afb +:1067a4000a62617474657279205b73656e736f72cb +:1067b4005d2072657475726e732063757272656e96 +:1067c4007420626174746572792073656e736f727c +:1067d400732072656164696e67730a202020202d1e +:1067e40020417661696c61626c65205b73656e73d0 +:1067f4006f725d20617267756d656e74206172657c +:106804003a20766f6c746167650a2020202020206e +:106814002020202020202020202020202020202074 +:106824002020202020202020202020202020202064 +:106834002063757272656e740a2020202020202047 +:106844002020202020202020202020202020202044 +:106854002020202020202020202020202020202034 +:10686400736f6320287374617465206f6620636896 +:1068740061726765290a20202020202020456d7040 +:106884007479205b73656e736f725d2061726775d6 +:106894006d656e74207072696e747320616c6c2007 +:1068a40076616c7565730a737461747573203a202c +:1068b4006765742067656e6572616c2073797374a3 +:1068c400656d207374617475730a0a486176652076 +:1068d4006120676f6f6420646179210a0000000001 +:1068e400480000a00c00000001000000f8f005457d +:1068f400d48400000c3000a0140500a08403000020 +:1069040000000000540000a004000000010000008a +:1069140018f7019d980800a0200600000000000060 +:10692400f80000a00c00000000000000583400a093 +:10693400580000000100000057494e433334303002 +:106944005f30303a303000000000000000000000ea +:1069540000000000000000000001000a313233345e +:106964003546464646460000000000000000000090 +:10697400000000000000000100c0a80101000000a8 +:1069840057494e43333430305f30303a30300000b2 +:10699400580000a00800000001000000f8f00545c0 +:1069a400d4840000b80e00a0a8000000000000007d +:1069b400ec3300a06c0000000100000057494e4376 +:1069c400333430305f30303a3030000000000000a3 +:1069d4000000000000000000000000000001000aa8 +:1069e4003132333435464646464600000000000046 +:1069f40000000000000000000000000100c0a80129 +:106a04000100000057494e43333430305f30303a90 +:106a1400303000006f70656e776561746865726d03 +:106a240061702e6f72670000b42b00a00004000098 +:106a340000000000600000a0100000000100000041 +:106a4400f8f00545d484ffffffffffffff040000bb +:106a5400040100a01800000000000000600f00a066 +:106a64003c0c000000000000700000a004000000c6 +:106a74000100000000050400b03400a0580000002c +:106a84000100000057494e43333430305f30303a10 +:106a94003030000000000000000000000000000092 +:106aa400000000000001000a313233343546464606 +:106ab4004646000000000000000000000000000046 +:106ac4000000000100c0a8010100000057494e4326 +:106ad400333430305f30303a30300000740000a07e +:106ae4000800000001000000f8f00545d48400000f +:106af4001c0100a00400000000000000200100a010 +:106b040008000000000000009c1b00a0160000000c +:106b140000000000b41b00a00010000000000000f2 +:106b24004c3300a0a000000001000000083500a0c4 +:106b340000000000083500a009000000200000004b +:106b4400283500a000000000283500a00e02010036 +:106b54000000000000000000000000000000000031 +:106b64000602020000000000000000000000000017 +:106b74000000000000000000000000000000000011 +:106b84000000000000000000000000000000000001 +:106b940000000000000000000000000000000000f1 +:106ba40000000000000000000000000000000000e1 +:106bb40000000000000000000000000000000000d1 +:106bc400000000000000000000000000083500a0e4 +:106bd40040000000000000007c0000a00400000051 +:106be400010000004c3300a0280100a001000000b7 +:106bf40000000000643500a0100000000000000048 +:106c04002c0100a01000000000000000743500a05a +:106c140004000000000000003c0100a0040000008b +:106c240000000000783500a004000000000000000f +:106c3400483500a01c00000000000000400100a036 +:106c44000800000000000000800000a00400000014 +:106c54000100000002000000000000a0200000006d +:106c6400010000000c000000000000000100017c95 +:106c74001f0c1d000c00000014000000cca4019d9a +:106c84004c040000200000a01000000001000000df +:106c94000c000000240000003838033a5c040000b3 +:106ca4000000000022222222222222222222222248 +:106cb40022222222222222222222222222222222b0 +:020000040000fa +:020000041d01dc +:106cc400b8ffbd273c00b7af3400b5af029d173cf9 +:106cd40000a0153c3800b6af2000b0af4400bfaff1 +:106ce4004000beaf3000b4af2c00b3af2800b2af49 +:106cf4002400b1afb4e1f7262180a0005000a6af74 +:106d04007835a4ae21b000001800a0af00001192a5 +:106d1400c80020124400bf8f2110f10201004280fc +:106d240088004230bd0040140100102625000224d2 +:106d3400a500221604000324000013822188000009 +:106d44001400a3af21f0000004001424ff007332e8 +:106d54007900622e1c004014010012262110f30257 +:106d64000100429004004230e6014010000000009f +:106d74005f7a400f2120000200005382029d033cf1 +:106d8400b4e16324208c027c211063020100429050 +:106d940004004230edff4010218040020100102623 +:106da400000013822110f3020100429004004230db +:106db400fbff405401001026ff0073327900622e5d +:106dc400e6ff401001001226019d043c80101300d0 +:106dd400e86d8424211082000000428c08004000e9 +:106de400000000007873019d606d019d606d019d40 +:106df400606d019d606d019d606d019d606d019de3 +:106e0400606d019d606d019d606d019d606d019dd2 +:106e1400606d019d606d019d606d019d606d019dc2 +:106e2400606d019d606d019d606d019d606d019db2 +:106e3400606d019d606d019d606d019d606d019da2 +:106e4400606d019d606d019d606d019d606d019d92 +:106e5400606d019d606d019d606d019d606d019d82 +:106e6400606d019d606d019d606d019d606d019d72 +:106e7400606d019d606d019d606d019d606d019d62 +:106e8400606d019d606d019d606d019d6473019d48 +:106e9400606d019d606d019d606d019d606d019d42 +:106ea400606d019d606d019d606d019d606d019d32 +:106eb400606d019d606d019d606d019d606d019d22 +:106ec400606d019d606d019d606d019d606d019d12 +:106ed400606d019d606d019d606d019d606d019d02 +:106ee400606d019d606d019d606d019d606d019df2 +:106ef400606d019d606d019d606d019d606d019de2 +:106f0400606d019d606d019d606d019d606d019dd1 +:106f1400606d019d4873019d606d019d606d019dd3 +:106f2400606d019d606d019d606d019d606d019db1 +:106f3400606d019d606d019d606d019d606d019da1 +:106f4400606d019d3873019d606d019d606d019db3 +:106f5400606d019d606d019d606d019d606d019d81 +:106f6400606d019d606d019d606d019d606d019d71 +:106f7400f072019de472019d606d019d606d019d43 +:106f8400606d019dd072019de472019d606d019d53 +:106f9400606d019d4873019d606d019d606d019d53 +:106fa4003072019d606d019d606d019d606d019d5c +:106fb4007c71019d606d019de472019d606d019d78 +:106fc400606d019d6870019d2b78400f7835a48e0b +:106fd4004fff225200001192ffff03244401431487 +:106fe40000a0033c1800a38f0b1063004400bf8f64 +:106ff4004000be8f3c00b78f3800b68f3400b58f89 +:107004003000b48f2c00b38f2800b28f2400b18fce +:107014002000b08f0800e0034800bd279c7c400f8f +:1070240000000000000011923cff20162110f10224 +:107034004400bf8f1800a28f4000be8f3c00b78f62 +:107044003800b68f3400b58f3000b48f2c00b38f66 +:107054002800b28f2400b18f2000b08f0800e00315 +:107064004800bd27218040021000132421b00000f5 +:107074009c7c400f000000002b78400f7835a48ed4 +:10708400219040002d0002247100421200a0033c14 +:1070940021204002212860022130c002897a400f59 +:1070a4001c00a0afff000324760043107835a58ea2 +:1070b40030000224d30042120000000021a000008e +:1070c40002a0937221204002212860022130c002d4 +:1070d400897a400fffff3126208c117c0b0020128f +:1070e40021a054002b78400f7835a48e2120400035 +:1070f400212860022130c002897a400f219040008b +:10710400ff000324efff435402a0937221204002a6 +:1071140021286002897a400f2130c002ff00032435 +:10712400e20043107835a58e1c00a48f23101400b0 +:10713400f6fec0170ba044001800a38f1400a48f00 +:1071440001006224ff0042301800a2af04000224b0 +:10715400d00082101400a48f02000224d7008210f1 +:107164005000a48f0000828c040084245000a4af3b +:10717400445b400b000054ac9c7c400f00000000ba +:107184009a00c0135000a38f2b78400f7835a48e3b +:10719400ffff032494ff43101800a38f140040142e +:1071a40001004324835c400b21804002c90062102b +:1071b400000000000500c017ffff31261000a48f57 +:1071c400000082a0010084241000a4af208c117c54 +:1071d4000d002012218040022b78400f7835a48eb8 +:1071e400010043240200642c070080142180400223 +:1071f4002118e3020000638088006330ebff6050d5 +:107204000000438221804002c1fec0570000119259 +:107214001800a38f1000a48f01006224ff004230e5 +:107224001800a2af445b400b000080a09c7c400f80 +:10723400218040022b78400f7835a48e21904000a5 +:107244002d00022492ff42160800132400a0033ce0 +:107254007835648c010002242b78400f1c00a2af07 +:10726400219040002120400221286002897a400fa9 +:107274002130c002ff0003248eff43143000022497 +:107284007835a58efd7b400f212040021800a38f86 +:107294006900601000a0023c211060004400bf8f10 +:1072a4004000be8f3c00b78f3800b68f3400b58fd6 +:1072b4003000b48f2c00b38f2800b28f2400b18f1c +:1072c4002000b08f0800e0034800bd27020002241c +:1072d4000000538221804002545b400b1400a2af93 +:1072e400218040021d5c400b0a0013243500c013aa +:1072f4001800a38fffff10242b78400f7835a48e3d +:10730400780050101800a38f0500c017ffff312626 +:107314001000a48f000082a0010084241000a4aff8 +:10732400208c117cf4ff201e00000000445b400b05 +:107334002180400221804002100013241d5c400b78 +:10734400010016241400a48f0700941008000224de +:107354000000538221804002545b400b1400a2af12 +:107364000100de27ff00de3300005382545b400b34 +:10737400218040021800a38fc8ff60142110600010 +:107384007835a38e4400bf8f0c006394ffff022462 +:10739400100063300a1003004000be8f3c00b78f1a +:1073a4003800b68f3400b58f3000b48f2c00b38f03 +:1073b4002800b28f2400b18f2000b08f0800e003b2 +:1073c4004800bd275000a48f01006224ff00423012 +:1073d4000000848c1800a2af5000a28f1000a4af4c +:1073e40004004224be5c400b5000a2af5000a48fa6 +:1073f4000000638c040084241000a3af635c400b82 +:107404005000a4af2b78400f7835a48e7800032465 +:107414001a004310580003241a0043147835a58e2b +:107424001800c012000000002b78400f7835a48e9d +:10743400305c400b219040007835438c4400bf8f72 +:107444000c006394ffff0224100063300a10030051 +:107454004000be8f3c00b78f3800b68f3400b58f24 +:107464003000b48f2c00b38f2800b28f2400b18f6a +:107474002000b08f0800e0034800bd27eaffc012d7 +:107484007835a58efd7b400f21204000315c400bf8 +:1074940021a000005000a38f0000628c040063242c +:1074a4005000a3af445b400b000054acfd7b400f85 +:1074b400212040024c5c400b1c00a48f5000a38f81 +:1074c4000000628c040063245000a3af445b400bb3 +:1074d400000054a40dfec01701005026865c400b2a +:1074e4001800a38fffff0224fc5b400b0b1063000a +:1074f4007835658cfd7b400f21204000a85c400b53 +:107504001800a28f2b78400f7835a48e87ff621263 +:10751400ffff0324f6ff431400a0033c1800a48fcc +:08752400a85c400b0b10840071 +:020000040000fa +:020000041d01dc +:10752c00e0ffbd271c00bfaf1800beaf21f0a003c9 +:10753c002000c4af2400c5af1000c0a31400c0af1e +:10754c001400c2270200033cac076434212840001d +:10755c005968400f000000001000c2a31000c28345 +:10756c0010004014000000002000c28f05004010e5 +:10757c00000000001400c28fffff43302000c28fb8 +:10758c00000043a42400c28f06004010000000003d +:10759c001400c28f02140200ffff43302400c28f7c +:1075ac00000043a41000c28321e8c0031c00bf8f5d +:1075bc001800be8f2000bd270800e003000000006b +:1075cc00d8ffbd272400bfaf2000beaf21f0a00321 +:1075dc002800c4af1200c0a71400c0af1000c0a395 +:1075ec001800c0af1c00c0af2800c28f2120400083 +:1075fc00212800001c000624836a400f00000000b4 +:10760c001200c22721204000212800004b5d400fb2 +:10761c00000000001200c29782130200ffff4230ec +:10762c00ff00423003004330020002244000621489 +:10763c00000000001400c2279c14042421284000e0 +:10764c005968400f000000001000c2a31000c28354 +:10765c0039004014000000001400c28f30004010ac +:10766c00000000001400c38f0300023c25186200c8 +:10767c001800c227212060002128400008000624a1 +:10768c008d68400f000000001000c2a31000c283e0 +:10769c0029004014000000001c00c28f1400c2af6f +:1076ac001400c28fffff42301400c2af1400c28f0f +:1076bc0017004010000000001400c38f0300023cb0 +:1076cc00251862002800c28f21206000212840006c +:1076dc001c0006248d68400f000000001000c2a39f +:1076ec001000c28314004014000000002800c28f58 +:1076fc00000043941200c2970f00621000000000bb +:10770c00f4ff02241000c2a3d15d400b0000000066 +:10771c00f4ff02241000c2a3d15d400b0000000056 +:10772c00f4ff02241000c2a3d15d400b0000000046 +:10773c00f4ff02241000c2a31000c28321e8c0038e +:10774c002400bf8f2000be8f2800bd270800e00357 +:10775c0000000000d8ffbd272400bfaf2000beaf43 +:10776c0021f0a0032800c4af1200c0a71400c0afc2 +:10777c001000c0a31800c0af1c00c0af2800c28fff +:10778c0021204000212800001c000624836a400fa1 +:10779c00000000001200c227212000002128400018 +:1077ac004b5d400f000000001200c29782130200d4 +:1077bc00ffff4230ff00423003004330020002243e +:1077cc0040006214000000001400c2279c14042422 +:1077dc00212840005968400f000000001000c2a38f +:1077ec001000c28339004014000000001400c28f46 +:1077fc0030004010000000001400c38f0300023c56 +:10780c00251862001800c2272120600021284000a2 +:10781c00080006248d68400f000000001000c2a371 +:10782c001000c28329004014000000001c00c28f0d +:10783c001400c2af1400c28f021402001400c2afb5 +:10784c001400c28f17004010000000001400c38ffa +:10785c000300023c251862002800c28f2120600022 +:10786c00212840001c0006248d68400f00000000f9 +:10787c001000c2a31000c2831400401400000000ca +:10788c002800c28f000043941200c2970f006210b0 +:10789c0000000000f4ff02241000c2a3365e400b6f +:1078ac0000000000f4ff02241000c2a3365e400b5f +:1078bc0000000000f4ff02241000c2a3365e400b4f +:1078cc0000000000f4ff02241000c2a31000c283c9 +:1078dc0021e8c0032400bf8f2000be8f2800bd27e5 +:1078ec000800e00300000000e0ffbd271c00bfaf54 +:1078fc001800beaf21f0a0032000c4af1000c0a33d +:10790c00212000002000c58f1e68400f00000000e1 +:10791c001000c2a31000c2830a0040140000000033 +:10792c004a43400f000000000200023c00034434b4 +:10793c00212800006968400f00000000555e400bd4 +:10794c0000000000000000001000c28321e8c0030a +:10795c001c00bf8f1800be8f2000bd270800e0035d +:10796c0000000000e0ffbd271c00bfaf1800beaf39 +:10797c0021f0a0032000c4af1000c0a32120000000 +:10798c002000c58f1e68400f000000001000c2a32d +:10799c001000c2831600401400000000b829400fec +:1079ac00000000001000c2a30a0004246270400f03 +:1079bc00000000001000c28308004014000000000a +:1079cc004a43400f00000000ed27400f000000006c +:1079dc001000c283815e400b00000000000000001c +:1079ec003168400f00000000805e400b000000007a +:1079fc00000000001000c28321e8c0031c00bf8ff0 +:107a0c001800be8f2000bd270800e0030000000016 +:107a1c00e0ffbd271c00bfaf1800beaf21f0a003d4 +:107a2c002000c4af1000c0a3010002241100c2a3a7 +:107a3c002000c28f08004010000000002000c28f00 +:107a4c0000004390020002240300621400000000b6 +:107a5c00020002241100c2a37428400f0000000091 +:107a6c001000c2a31000c2831e00401400000000ce +:107a7c001100c293212040004c2a400f000000004e +:107a8c001000c2a31000c2831900401400000000b3 +:107a9c001100c29321204000af2a400f00000000cb +:107aac001000c2a31000c283140040140000000098 +:107abc001100c393020002241a006210000000009f +:107acc003228400f000000001000c2a31000c28337 +:107adc000d004014000000001000c283ce5e400b6d +:107aec000000000000000000c65e400b000000001b +:107afc0000000000c65e400b00000000000000000b +:107b0c00c65e400b00000000000000003168400f12 +:107b1c00000000009043400f00000000cd5e400bc1 +:107b2c0000000000000000001000c28321e8c00328 +:107b3c001c00bf8f1800be8f2000bd270800e0037b +:107b4c0000000000e0ffbd271c00bfaf1800beaf57 +:107b5c0021f0a0032000c4af2400c5af1000c0a3c7 +:107b6c002400c48f5c5e400f000000001000c2a314 +:107b7c001000c28305004014000000002000c48fd8 +:107b8c00875e400f000000001000c2a31000c283eb +:107b9c0021e8c0031c00bf8f1800be8f2000bd273a +:107bac000800e00300000000e0ffbd271c00bfaf91 +:107bbc001800beaf21f0a0032000c4aff72a400f7d +:107bcc00000000001000c2a31000c2830b00401480 +:107bdc00000000003168400f000000001000c2a33c +:107bec001000c28308004014000000009043400fb6 +:107bfc0000000000065f400b0000000000000000c9 +:107c0c00065f400b00000000000000001000c28363 +:107c1c0021e8c0031c00bf8f1800be8f2000bd27b9 +:107c2c000800e00300000000e0ffbd271c00bfaf10 +:107c3c001800beaf21f0a0037428400f0000000014 +:107c4c001000c2a31000c28321e8c0031c00bf8f28 +:107c5c001800be8f2000bd270800e00300000000c4 +:107c6c00e0ffbd271c00bfaf1800beaf21f0a00382 +:107c7c00211880002110a0002000c3a32400c2a75b +:107c8c001000c0af2e5f400b0000000000a0023cb3 +:107c9c00a81b43241000c28f21106200000040a0da +:107cac001000c28f010042241000c2af1000c28f1e +:107cbc000a00422cf5ff40140000000000a0023c1a +:107ccc0080ff0324a81b43a000a0023ca81b422455 +:107cdc002000c393010043a02400c29702120200ab +:107cec00ffff4230ff00433000a0023ca81b42249f +:107cfc00020043a02400c297ff00433000a0023cc6 +:107d0c00a81b4224030043a000a0023ca81b44244f +:107d1c00040005244262400f0000000021e8c0036b +:107d2c001c00bf8f1800be8f2000bd270800e00389 +:107d3c0000000000e0ffbd271c00bfaf1800beaf65 +:107d4c0021f0a003211080002400c5af2000c2a3a5 +:107d5c00010002241400c2af1000c0af645f400bde +:107d6c000000000000a0023ca81b43241000c28f9e +:107d7c0021106200000040a01000c28f01004224bc +:107d8c001000c2af1000c28f0a00422cf5ff401445 +:107d9c000000000000a0023c80ff0324a81b43a0ad +:107dac0000a0023ca81b42242000c393010043a066 +:107dbc0000a0023ca81b422481ff0324020043a024 +:107dcc0000a0023ca81b4424020005244262400f80 +:107ddc000000000000a0023ca81b422402004290bc +:107dec002120400000a0023c9c1b452402000624dc +:107dfc00be62400f000000001400c2af1400c38f1d +:107e0c000100022405006210000000002400c28f53 +:107e1c00000040a4975f400b0000000000a0023c53 +:107e2c009c1b429000120200201e027c00a0023c0f +:107e3c009c1b4224010042902016027c25106200fb +:107e4c002016027cffff43302400c28f000043a4a5 +:107e5c0021e8c0031c00bf8f1800be8f2000bd2777 +:107e6c000800e00300000000e0ffbd271c00bfafce +:107e7c001800beaf21f0a0030a000224008182afdb +:107e8c0002000224048182af0500042400100524a2 +:107e9c001b5f400f000000001f5c02241000c2a7f3 +:107eac001000c29721200000212840001b5f400fca +:107ebc000000000021e8c0031c00bf8f1800be8f1b +:107ecc002000bd270800e00300000000e0ffbd27f4 +:107edc001c00bfaf1800beaf21f0a0030a000224a3 +:107eec00008182af02000224048182af05000424c9 +:107efc00001005241b5f400f000000001f5c0224d3 +:107f0c001000c2a71000c2972120000021284000b9 +:107f1c001b5f400f0000000021e8c0031c00bf8f56 +:107f2c001800be8f2000bd270800e00300000000f1 +:107f3c00e0ffbd271c00bfaf1800beaf21f0a003af +:107f4c0019000224008182af01000224048182af57 +:107f5c0005000424002805241b5f400f00000000ce +:107f6c001f5c02241000c2a71000c2972120000041 +:107f7c00212840001b5f400f0000000021e8c003d7 +:107f8c001c00bf8f1800be8f2000bd270800e00327 +:107f9c0000000000e0ffbd271c00bfaf1800beaf03 +:107fac0021f0a00328000224008182af01000224ea +:107fbc00048182af05000424004005241b5f400fa0 +:107fcc00000000001f0c02241000c2a71000c29772 +:107fdc0021200000212840001b5f400f0000000002 +:107fec0021e8c0031c00bf8f1800be8f2000bd27e6 +:107ffc000800e00300000000e0ffbd271c00bfaf3d +:10800c001800beaf21f0a00364000224008182afef +:10801c0001000224048182af0500042400a0053471 +:10802c001b5f400f000000001f0402241000c2a7b9 +:10803c001000c29721200000212840001b5f400f38 +:10804c000000000021e8c0031c00bf8f1800be8f89 +:10805c002000bd270800e00300000000e0ffbd2762 +:10806c001c00bfaf1800beaf21f0a003010002241a +:10807c001000c2af21200000008005341b5f400fb0 +:10808c00000000001000c2af1400c2272120000025 +:10809c0021284000505f400f000000001400c397df +:1080ac00ff390224040062100000000021100000bf +:1080bc003460400b000000009d5f400f000000008a +:1080cc001000c28f21e8c0031c00bf8f1800be8fa8 +:1080dc002000bd270800e00300000000e0ffbd27e2 +:1080ec001c00bfaf1800beaf21f0a0030100042498 +:1080fc001000c22721284000505f400f00000000f4 +:10810c001000c2972016027c21e8c0031c00bf8f10 +:10811c001800be8f2000bd270800e00300000000ff +:10812c00e0ffbd271c00bfaf1800beaf21f0a003bd +:10813c00020004241000c22721284000505f400f89 +:10814c00000000001000c297c2100200ffff423076 +:10815c0080100200ffff42302016027c21e8c00391 +:10816c001c00bf8f1800be8f2000bd270800e00345 +:10817c0000000000e0ffbd271c00bfaf1800beaf21 +:10818c0021f0a003030004241000c2272128400082 +:10819c00505f400f000000001000c2972016027cb8 +:1081ac0021e8c0031c00bf8f1800be8f2000bd2724 +:1081bc000800e00300000000e0ffbd271c00bfaf7b +:1081cc001800beaf21f0a003030004241000c22746 +:1081dc0021284000505f400f000000001000c297a3 +:1081ec00211840000481828f1b006200f4014000c2 +:1081fc0010180000121000002016027c21e8c003a9 +:10820c001c00bf8f1800be8f2000bd270800e003a4 +:10821c0000000000e0ffbd271c00bfaf1800beaf80 +:10822c0021f0a003040004241000c22721284000e0 +:10823c00505f400f000000001000c2972016027c17 +:10824c0021e8c0031c00bf8f1800be8f2000bd2783 +:10825c000800e00300000000e0ffbd271c00bfafda +:10826c001800beaf21f0a003040004241000c227a4 +:10827c0021284000505f400f000000001000c29702 +:10828c00211840000081828f1b006200f401400025 +:10829c0010180000121000002016027c21e8c00308 +:1082ac001c00bf8f1800be8f2000bd270800e00304 +:1082bc0000000000c0ffbd273c00bfaf3800beafc0 +:1082cc0021f0a0034000c4af4400c5af4c73400f75 +:1082dc00000000004000c28f1300422c3c014010f3 +:1082ec00000000004000c28f80180200029d023c7a +:1082fc0010834224211062000000428c08004000d0 +:10830c0000000000dc87019ddc87019d5c83019de2 +:10831c00dc87019ddc84019ddc87019d3885019df6 +:10832c00dc87019ddc87019ddc87019ddc87019d3d +:10833c00dc87019ddc87019ddc87019db885019d53 +:10834c00dc87019d6886019ddc87019d1887019d56 +:10835c00be6d400f000000002000c2af2000c227fd +:10836c000000428c1400c2afd86d400f000000001a +:10837c001800c2afe16d400f000000001c00c2af3e +:10838c001000c0a38273400f0000000021184000b1 +:10839c000100022404006214000000001000c293cb +:1083ac00010042341000c2a3176e400f0000000001 +:1083bc002118400001000224040062140000000097 +:1083cc001000c293020042341000c2a31000c293ea +:1083dc002400c2a3eb39400f000000002014027ce3 +:1083ec002500c2a31400c28f2014027c2600c2a355 +:1083fc001400c28f021202001400c2af1400c28f0c +:10840c002014027c2700c2a31400c28f02120200a7 +:10841c001400c2af1400c28f2014027c2800c2a327 +:10842c001400c28f021202001400c2af1400c28fdb +:10843c002014027c2900c2a31800c28f2014027cd5 +:10844c002a00c2a31800c28f031202001800c2af88 +:10845c001800c28f2014027c2b00c2a31c00c28ff8 +:10846c002014027c2c00c2a31800c28f031202003d +:10847c001800c2af1800c28f2014027c2d00c2a3ba +:10848c002400c22703000424212840000a000624eb +:10849c00fd61400f0000000088bf023c2061428c4f +:1084ac004001427cff00423027100200ff004230a6 +:1084bc0001004230ff00443088bf033c2061628cd5 +:1084cc004429827c206162acf761400b0000000003 +:1084dc008273400f000000002e00c2a32e00c227a2 +:1084ec00050004242128400001000624fd61400ff2 +:1084fc000000000088bf023c2061428c8001427c5d +:10850c00ff00423027100200ff00423001004230d1 +:10851c00ff00443088bf033c2061628c8431827c34 +:10852c00206162acf761400b0000000002000224e5 +:10853c002f00c2a34400c28f0000429006004014da +:10854c00000000006e73400f000000002f00c0a35d +:10855c006661400b000000004400c28f0000439095 +:10856c000100022407006214000000005a73400f3f +:10857c0000000000010002242f00c2a36661400b22 +:10858c0000000000020002242f00c2a32f00c2270b +:10859c00070004242128400001000624fd61400f3f +:1085ac0000000000f761400b0000000004000224f2 +:1085bc003000c2a34400c28f000042900600401459 +:1085cc0000000000b739400f000000003000c0a3cd +:1085dc009261400b000000004400c28f00004390e9 +:1085ec00010002241300621400000000eb39400f5c +:1085fc000000000021184000010002240900621054 +:10860c0000000000fd38400f00000000eb39400f67 +:10861c00000000002014027c3000c2a39261400bc9 +:10862c0000000000010002243000c2a39261400b44 +:10863c0000000000040002243000c2a33000c22756 +:10864c000f0004242128400001000624fd61400f86 +:10865c0000000000f761400b000000004400c28fd6 +:10866c0000004390ba0002241f00621400000000b6 +:10867c004400c28f0100422400004390ad0002244c +:10868c0019006214000000004400c28f0200422452 +:10869c0000004390be00022413006214000000008e +:1086ac004400c28f0300422400004390ef000224d8 +:1086bc000d00621400000000010002243100c2a36e +:1086cc003100c22711000424212840000100062497 +:1086dc00fd61400f00000000427c400f00000000d4 +:1086ec00f761400b000000003100c0a33100c2272d +:1086fc00110004242128400001000624fd61400fd4 +:10870c0000000000f761400b000000004400c28f25 +:10871c0000004390ba0002242500621400000000ff +:10872c004400c28f0100422400004390ad0002249b +:10873c001f006214000000004400c28f020042249b +:10874c0000004390ca0002241900621400000000cb +:10875c004400c28f0300422400004390fe00022418 +:10876c001300621400000000010002243200c2a3b6 +:10877c003200c227130004242128400001000624e3 +:10878c00fd61400f00000000640004249f53400f63 +:10879c0000000000b739400f000000006400042402 +:1087ac009f53400f00000000a37b400f000000000f +:1087bc003200c0a33200c22711000424212840003b +:1087cc0001000624fd61400f0000000000000000c5 +:1087dc0021e8c0033c00bf8f3800be8f4000bd278e +:1087ec000800e00300000000d0ffbd272c00bfaf45 +:1087fc002800beaf21f0a0033000c4af3400c5afd9 +:10880c003800c6af3000c28fff0042302400c327af +:10881c003400c48f1000a4af3800c48f1400a4af70 +:10882c001800a0af1c00a3af2120000001000524fc +:10883c000e000624213840009858400f000000001c +:10884c002000c2af50808227212040000300052465 +:10885c0021300000a845400f000000002000c38f0d +:10886c002400c28f2120600021284000213000000c +:10887c00a845400f0000000021e8c0032c00bf8f6a +:10888c002800be8f3000bd270800e0030000000068 +:10889c00f0ffbd270c00beaf21f0a0038e01022417 +:1088ac000000c2af80bf023c005040ac80bf033c14 +:1088bc000050628c01000424444a827c005062ac5b +:1088cc000000c38f80bf023c405043ac80bf033cd0 +:1088dc000050628c01000424c47b827c005062ac8a +:1088ec00888180af8c8180af21e8c0030c00be8fe3 +:1088fc001000bd270800e00300000000f0ffbd27ba +:10890c000c00beaf21f0a0031000c4af2110a000da +:10891c001400c2a3010002240000c2af80bf033cbc +:10892c000050628c010004240400827c005062ac74 +:10893c000000000080bf023c0050428c010042301d +:10894c00fcff40140000000080bf023c1050428c21 +:10895c00000442300500401000000000888180af08 +:10896c0021100000ae62400b000000000400c0affc +:10897c008662400b000000000400c28f1000c38f01 +:10898c0021106200000042902118400080bf023c80 +:10899c00505043ac8c8180af7e62400b00000000d5 +:1089ac0080bf023c1050428c000442300b0040143b +:1089bc00000000008c81828f0c00033c0135633475 +:1089cc002a18430001006338ff0063300100422481 +:1089dc008c8182af0500601000000000888180afa0 +:1089ec000000c0af8362400b0000000080bf023c5f +:1089fc001050428c00404230e9ff4014000000004f +:108a0c000400c28f010042240400c2af1400c393bf +:108a1c000400c28f2a104300d7ff4014000000004e +:108a2c0080bf033c0050628c010004248410827cc3 +:108a3c00005062ac8c8180afa662400b000000003d +:108a4c0080bf023c1050428c000442300b0040149a +:108a5c00000000008c81828f0c00033c01356334d4 +:108a6c002a18430001006338ff00633001004224e0 +:108a7c008c8182af0500601000000000888180afff +:108a8c000000c0afab62400b0000000080bf023c96 +:108a9c000050428c04004230e9ff401400000000fa +:108aac0001000224888182af0000c28f21e8c0033c +:108abc000c00be8f1000bd270800e0030000000072 +:108acc00f8ffbd270400beaf21f0a00321108000e9 +:108adc000800c2a32110000021e8c0030400be8fcf +:108aec000800bd270800e00300000000f0ffbd27d0 +:108afc000c00beaf21f0a003211880001400c5affc +:108b0c002110c0001000c3a31800c2a3010002244e +:108b1c000400c2af80bf033c0050628c01000424ef +:108b2c000400827c005062ac8c8180afd962400b17 +:108b3c000000000080bf023c1050428c0004423008 +:108b4c000500401000000000888180af211000005b +:108b5c007663400b0000000080bf023c0050428c4a +:108b6c0001004230f3ff4014000000001000c393da +:108b7c0080bf023c505043ac8c8180aff762400bfd +:108b8c000000000080bf023c1050428c00044230b8 +:108b9c000b004014000000008c81828f0c00033c01 +:108bac00013563342a18430001006338ff00633039 +:108bbc00010042248c8182af05006010000000008f +:108bcc00888180af211000007663400b000000000c +:108bdc0080bf023c1050428c00404230e9ff4014f0 +:108bec00000000000000c0af4e63400b000000000e +:108bfc0080bf033c0050628c01000424c418827caa +:108c0c00005062ac8c8180af1a63400b00000000f6 +:108c1c0080bf023c1050428c000442300b004014c8 +:108c2c00000000008c81828f0c00033c0135633402 +:108c3c002a18430001006338ff006330010042240e +:108c4c008c8182af0500601000000000888180af2d +:108c5c00211000007663400b0000000080bf023c36 +:108c6c000050428c08004230e9ff40140000000024 +:108c7c000000c28f1400c38f2110620080bf033c20 +:108c8c006050638cff006330000043a080bf033c46 +:108c9c000050628c010004244429827c005062ac98 +:108cac0080bf033c0050628c010004240421827cb0 +:108cbc00005062ac8c8180af4663400b000000001a +:108ccc0080bf023c1050428c000442300b00401418 +:108cdc00000000008c81828f0c00033c0135633452 +:108cec002a18430001006338ff006330010042245e +:108cfc008c8182af0500601000000000888180af7d +:108d0c00211000007663400b0000000080bf023c85 +:108d1c000050428c10004230e9ff4014000000006b +:108d2c000000c28f010042240000c2af1800c393a0 +:108d3c000000c28f2a104300adff40140000000059 +:108d4c0080bf033c0050628c010004248410827ca0 +:108d5c00005062ac8c8180af6e63400b0000000051 +:108d6c0080bf023c1050428c000442300b00401477 +:108d7c00000000008c81828f0c00033c01356334b1 +:108d8c002a18430001006338ff00633001004224bd +:108d9c008c8182af0500601000000000888180afdc +:108dac00211000007663400b0000000080bf023ce5 +:108dbc000050428c04004230e9ff401400000000d7 +:108dcc0001000224888182af0400c28f21e8c00315 +:108ddc000c00be8f1000bd270800e003000000004f +:108dec00f8ffbd270400beaf21f0a0038881828f5d +:108dfc0021e8c0030400be8f0800bd270800e00373 +:108e0c0000000000d0ffbd272c00bfaf2800beaf74 +:108e1c0021f0a003211880002110a0003800c6af5b +:108e2c003000c3a33400c2a71000c0a33000c3930a +:108e3c006b0002241c006214000000001400c22706 +:108e4c00212040002128000010000624836a400fd6 +:108e5c00000000001400c2273800c48f21284000f5 +:108e6c001000062421380000c930400f000000001b +:108e7c001000c2a31000c2832a004014000000009e +:108e8c008c80828f27004010000000008c80828f25 +:108e9c001400c3272120600009f8400000000000e6 +:108eac00cc63400b000000003000c3936c00022424 +:108ebc001c006214000000002400c2272120400086 +:108ecc002128000004000624836a400f00000000e3 +:108edc002400c2273800c48f212840000400062437 +:108eec0021380000c930400f000000001000c2a360 +:108efc001000c2830b004014000000008880828f99 +:108f0c0008004010000000008880828f2400c3936a +:108f1c00212060002500c3932128600009f840003f +:108f2c000000000021e8c0032c00bf8f2800be8f7a +:108f3c003000bd270800e00300000000e0ffbd2763 +:108f4c001c00bfaf1800beaf21f0a0032000c4afbf +:108f5c002400c5af1000c0a32000c28f0300401036 +:108f6c00000000002000c28f888082af2400c28fd6 +:108f7c0003004010000000002400c28f8c8082afe0 +:108f8c0004000424029d023c108e45246031400fe5 +:108f9c00000000001000c28321e8c0031c00bf8f3a +:108fac001800be8f2000bd270800e0030000000061 +:108fbc00d0ffbd272c00bfaf2800beaf21f0a0030f +:108fcc003000c4af2000c0a33000c48fa16a400f92 +:108fdc0000000000010042242200c2a72200c29718 +:108fec001000a0af1400a0af1800a0af0400042420 +:108ffc00670005243000c68f21384000462e400ff4 +:10900c00000000002000c2a32000c28321e8c0039e +:10901c002c00bf8f2800be8f3000bd270800e00356 +:10902c0000000000d0ffbd272c00bfaf2800beaf52 +:10903c0021f0a0032000c0a31000a0af1400a0af2b +:10904c001800a0af040004246500052421300000a2 +:10905c0021380000462e400f000000002000c2a363 +:10906c002000c28321e8c0032c00bf8f2800be8fd4 +:10907c003000bd270800e00300000000d0ffbd2732 +:10908c002c00bfaf2800beaf21f0a0033000c4af4e +:10909c002000c0a31000a0af1400a0af1800a0af18 +:1090ac000400042465000524213000002138000050 +:1090bc00462e400f000000002000c2a32000c283f7 +:1090cc0021e8c0032c00bf8f2800be8f3000bd27c5 +:1090dc000800e00300000000d0ffbd272c00bfaf4c +:1090ec002800beaf21f0a0033000c4af2000c0a305 +:1090fc003000c48fa16a400f000000000100422420 +:10910c002200c2a72200c2971000a0af1400a0af8b +:10911c001800a0af04000424670005243000c68f9b +:10912c0021384000462e400f000000002000c2a352 +:10913c002000c28321e8c0032c00bf8f2800be8f03 +:10914c003000bd270800e00300000000b8ffbd2779 +:10915c004400bfaf4000beaf21f0a0032000c0a36d +:10916c002400c227212040006516400f000000009b +:10917c002000c2a32000c28317004014000000008e +:10918c002400c29782130200ffff4230ff004230de +:10919c0003004330020002240d00621400000000a2 +:1091ac001000a0af1400a0af1800a0af040004245e +:1091bc00690005242130000021380000462e400fa4 +:1091cc00000000002000c2a37964400b00000000e6 +:1091dc00f4ff02242000c2a32000c28321e8c003b4 +:1091ec004400bf8f4000be8f4800bd270800e0033d +:1091fc0000000000d0ffbd272c00bfaf2800beaf81 +:10920c0021f0a0032000c0a31000a0af1400a0af59 +:10921c001800a0af040004246a00052421300000cb +:10922c0021380000462e400f000000002000c2a391 +:10923c002000c28321e8c0032c00bf8f2800be8f02 +:10924c003000bd270800e00300000000b8ffbd2778 +:10925c004400bfaf4000beaf21f0a0032000c0a36c +:10926c002400c227212040006516400f000000009a +:10927c002000c2a32000c28317004014000000008d +:10928c002400c29782130200ffff4230ff004230dd +:10929c0003004330020002240d00621400000000a1 +:1092ac001000a0af1400a0af1800a0af040004245d +:1092bc00680005242130000021380000462e400fa4 +:1092cc00000000002000c2a3b964400b00000000a5 +:1092dc00f4ff02242000c2a32000c28321e8c003b3 +:1092ec004400bf8f4000be8f4800bd270800e0033c +:1092fc000000000098ffbd276400bfaf6000beaf48 +:10930c0021f0a003010002241000c2afc404023cef +:10931c0000b442341400c2af050002241800c2afde +:10932c003f7e400f000000001c00c2af88bf023c13 +:10933c0040000324042043ac1800c28f01004230cb +:10934c00ff0042301d004010000000001400c28fce +:10935c002000c2af2400c0afe364400b000000004b +:10936c002400c28f010042242400c2af2000c38f0e +:10937c0036fe023c803c4234211062002000c2af19 +:10938c002000c38fc901023c81c342342b10620000 +:10939c00f3ff4010000000003f7e400f0000000073 +:1093ac002800c2af88bf023c2400c38f004043acee +:1093bc002800c48fcd7d400f000000001800c28f24 +:1093cc000200423068004010000000001400c28f00 +:1093dc002c00c2af2c00c28f3000c2af2c00c38f48 +:1093ec00c404023c01b442342b1062000800401447 +:1093fc00000000000800023c3400c2af3000c28ff5 +:10940c00421002003000c2af0865400b00000000a3 +:10941c003400c0af3400c28f3800c2af3f7e400f63 +:10942c00000000003c00c2af88bf023c0030428c00 +:10943c000003427cff0042304000c2af4000c28fac +:10944c00090040140000000088bf023c00100324f7 +:10945c00083043ac88bf023c0030428c00084230dc +:10946c00fcff4014000000004000c28f4400c2af5b +:10947c0081bf023c30f240ac81bf023c99aa033c54 +:10948c005566633430f243ac81bf023c6655033cf5 +:10949c00aa99633430f243ac81bf023c00f0428c99 +:1094ac005800c2af5800c28fc4a4027c5800c2af8f +:1094bc005800c38f3800c28f251062005800c2af0d +:1094cc005800c38f81bf023c00f043ac81bf023c0b +:1094dc0000f0428c5800c2af81bf023c3333033cd6 +:1094ec003333633430f243ac4400c28f4800c2af14 +:1094fc004800c28f130040100000000088bf023cdf +:10950c000030428c0003427cff0042304c00c2af62 +:10951c004c00c28f100040140000000088bf023cb9 +:10952c0000100324083043ac88bf023c0030428c4e +:10953c0000084230fcff4014000000005a65400b4c +:10954c000000000088bf023c00100324043043ac30 +:10955c005a65400b00000000000000003c00c48f66 +:10956c00cd7d400f000000001800c28f0400423077 +:10957c000c0040100000000088bf023c0040428cf0 +:10958c005000c2af5000c28f300042345000c2af06 +:10959c0088bf023c5000c38f004043ace77d400fb6 +:1095ac00000000001400c28f5400c2af81bf023c07 +:1095bc0000f0428cc00c427cff0042305400c38f40 +:1095cc00061043005400c2af1c00c48fcd7d400f69 +:1095dc000000000021200000807d400f00000000f2 +:1095ec0081bf023cffff0334609043aceb65400f3e +:1095fc00000000003d7e400f000000001551400fa0 +:10960c00000000002762400f000000000373400fb1 +:10961c00000000003a6d400f000000009120400f48 +:10962c0000000000b456400f00000000fb53400f38 +:10963c0000000000029d023c94f64424517d400f32 +:10964c00000000005854400f000000009647400fe7 +:10965c0000000000fd38400f000000002120000039 +:10966c0090010524e952400f000000000100022483 +:10967c001000c2afc165400b00000000f439400f70 +:10968c0000000000b647400f000000007d25400f91 +:10969c00000000001a73400f00000000566d400fd0 +:1096ac000000000021200000fc51400f00000000d1 +:1096bc00110040100000000088bf023c2061428c69 +:1096cc004001427cff00423027100200ff00423074 +:1096dc0001004230ff00443088bf033c2061628ca3 +:1096ec004429827c206162ac212000009001052479 +:1096fc00e952400f000000001000c38f010002244b +:10970c00deff6210000000001000c28f21e8c003d1 +:10971c006400bf8f6000be8f6800bd270800e003a7 +:10972c0000000000e8ffbd271400bfaf1000beaf63 +:10973c0021f0a003eb65400f0000000021e8c003fe +:10974c001400bf8f1000be8f1800bd270800e00367 +:10975c0000000000f8ffbd270400beaf21f0a003fd +:10976c00211080000800c2a30800c38380bf023c04 +:10977c00206843ac0000000080bf023c1068428ca3 +:10978c0000014230fcff40100000000021e8c00343 +:10979c000400be8f0800bd270800e0030000000095 +:1097ac00e8ffbd271400beaf21f0a00388bf033c27 +:1097bc000061628c4429027c006162ac88bf033c6e +:1097cc000061628c8431027c006162ac88bf033c16 +:1097dc002061628c010004248431827c206162aca3 +:1097ec0088bf033c2061628c4429027c206162acfe +:1097fc0088bf033c4061628c4408027c406162accf +:10980c0088bf033c6061628c010004244408827ca4 +:10981c00606162ac88bf033c8061628c01000424ef +:10982c00c439827c806162ac88bf033c4060628c2e +:10983c00446b027c406062ac88bf033c8061628cec +:10984c000442027c806162ac88bf033c8061628c04 +:10985c008431027c806162ac88bf033c0061628c05 +:10986c00c418027c006162ac88bf033c2061628c2e +:10987c0001000424c418827c206162ac88bf033cc4 +:10988c000061628c0400027c006162ac88bf033c06 +:10989c002061628c010004240400827c206162ac93 +:1098ac0088bf033cc060628c010004240400827ced +:1098bc00c06062ac88bf033c0061628c8410027c87 +:1098cc00006162ac88bf033c2061628c8410027c16 +:1098dc00206162ac88bf033c0061628c0421027c75 +:1098ec00006162ac88bf033c2061628c0421027c65 +:1098fc00206162ac88bf033c6010628cc418027c8f +:10990c00601062ac88bf033c3010628cc418027cbf +:10991c00301062ac88bf033c0010628c0400027ce7 +:10992c00001062ac88bf033c9010628c03000424ce +:10993c0084e6827c901062ac88bf033c9010628cf1 +:10994c0004ce027c901062ac88bf033c6010628c29 +:10995c0001000424c418827c601062ac80bf023cfd +:10996c00005a40ac80bf033c005a628c01000424b6 +:10997c004429827c005a62ac80bf033c005a628c42 +:10998c00010004240442827c005a62ac80bf033c78 +:10999c00005a628c444a027c005a62ac80bf033c81 +:1099ac00005a628c8431027c005a62acc404023cc2 +:1099bc0000b442340000c2af0f00023c40424234bb +:1099cc000400c2af0400c28f401002000000c38f1d +:1099dc001b006200f401400010180000121000007f +:1099ec000800c2af0400c28f401002000000c38ff9 +:1099fc001b006200f4014000101000000400401035 +:109a0c00000000000800c28f010042240800c2af11 +:109a1c000800c28f0101422c03004014000000001a +:109a2c00000102240800c2af0800c28f04004010dd +:109a3c00000000000800c28fffff42240800c2afe4 +:109a4c000800c28fff0042302118400080bf023c4a +:109a5c00305a43ac80bf033c005a628c0100042492 +:109a6c00c47b827c005a62ac88bf033c0061628c70 +:109a7c00c439027c006162ac88bf033c8061628c9b +:109a8c00444a027c806162ac88bf033c2061628cda +:109a9c00c439027c206162ac88bf033ca061628c3b +:109aac00444a027ca06162ac88bf033c4060628c7b +:109abc000400027c406062ac88bf033c6060628c36 +:109acc000400027c606062ac88bf033c4060628c26 +:109adc0001000424c47b827c406062ac88bf033ce0 +:109aec004060628c010004244408827c406062acbb +:109afc0088bf033c6010628cc439027c601062ac7d +:109b0c0088bf033c3010628cc439027c301062accc +:109b1c0088bf033c0010628c010004244408827c42 +:109b2c00001062ac88bf033ca010628c02000424bd +:109b3c0084e6827ca01062ac88bf033ca010628ccf +:109b4c000100042404ce827ca01062ac81bf023cd4 +:109b5c00ffff0334609043ac81bf033c6090628c88 +:109b6c004408027c609062ac88bf033c4060628c0d +:109b7c00010004244408827c406062ac81bf023c3a +:109b8c00009040ac81bf023c109040ac81bf023cc5 +:109b9c00209040ac81bf023c409040ac81bf033c64 +:109bac004090628c01000424049c827c409062ac46 +:109bbc0081bf023cf0ff0324209043a081bf033cf3 +:109bcc002090628c010004240462827c209062aca0 +:109bdc0081bf033c0090628c01000424c47b827c16 +:109bec00009062ac81bf033c0090628c01000424a5 +:109bfc004408827c009062ac0100022421e8c0037e +:109c0c001400be8f1800bd270800e0030000000000 +:109c1c002148c000214080003b00e0142118a00026 +:109c2c002b10a600480040102010c27008004010f5 +:109c3c00023c09002320020006208800041845007d +:109c4c00044846002518830004404800023c0900e3 +:109c5c001b006700f401e000ffff2b31022c080011 +:109c6c00125000001020000002504b710034040010 +:109c7c002530c5002b60ca001b006700f401e00012 +:109c8c00090080512330ca002130c9002b18c900ab +:109c9c00050060542330ca002b20ca002118c900cb +:109cac000b3064002330ca001b00c700f401e00035 +:109cbc00ffff0831122000001018000002208b70ea +:109ccc00001c0300254068002b1804011b00c70072 +:109cdc00f401e00009006050234004012140090117 +:109cec002b18090105006054234004012b180401b2 +:109cfc00214809010b4023012340040106104800b0 +:109d0c000800e003211800002b10a70047004014a6 +:109d1c002050ea704800401520000c242b10e50060 +:109d2c0005004014231086002b108600cd004054f3 +:109d3c0021108000231086002328a7002b208200ee +:109d4c000800e0032318a4000600c01420102271a0 +:109d5c00010002241b004600f401c0001248000060 +:109d6c002010227182004054200008242328a900ce +:109d7c00021c0900ffff27311b00a300f401600047 +:109d8c00025c0800122000001050000002208770b6 +:109d9c0000340a002530cb002b50c4001b00a3005c +:109dac00f4016000090040512330c4002130c90087 +:109dbc002b28c9000500a0542330c4002b50c4002c +:109dcc002128c9000b30aa002330c4001b00c3009b +:109ddc00f4016000ffff0831122000001028000081 +:109dec0002388770002c05002540a8002b200701a5 +:109dfc001b00c300f40160000900805023400701e0 +:109e0c00214009012b18090105006054234007016a +:109e1c002b180701214809010b402301234007019e +:109e2c00061048000800e0032118000021108000f3 +:109e3c000800e0032118a00023608a0104384701c0 +:109e4c00065886012558670106688501023c0b00ff +:109e5c001b00a701f401e000ffff6f310610840125 +:109e6c00042845012528450002140500043046014c +:109e7c00127000001018000002c0cf71004c0300db +:109e8c00254822012b1038011b00a701f401e0002a +:109e9c000a0040100420440121482b012b102b01f7 +:109eac0006004014ffffce252b1038010400405053 +:109ebc0023483801ffffce2521482b0123483801c8 +:109ecc001b002701f401e000ffffa5301268000021 +:109edc00101800000278af71001403002510450023 +:109eec002b184f001b002701f401e0000b00601041 +:109efc0000440e0021104b002b184b00070060147f +:109f0c00ffffad252b184f00050060102540a80160 +:109f1c00ffffad2521104b0000440e002540a80189 +:109f2c001900060123784f00104800001240000071 +:109f3c002b28e90121182001213820013d00a01413 +:109f4c00121000004300e9512b1882002318e30182 +:109f5c00233088002b2086002318640004608301c2 +:109f6c000610460125104c000800e00306184301ba +:109f7c00234002010448490006300501021c090077 +:109f8c001b00c300f4016000ffff273106580401d9 +:109f9c000428450025586501022c0b0004404400a0 +:109fac0012500000106000000250477100640c0059 +:109fbc002520ac002b288a001b00c300f401600094 +:109fcc000600a05023208a00212089002b2889001c +:109fdc001d00a0102b308a0023208a001b00830058 +:109fec00f4016000ffff6b311230000010500000d4 +:109ffc000230c770002c0a002528ab002b50a6009d +:10a00c001b008300f40160005bff40512328a60075 +:10a01c002128a9002b20a90057ff80542328a60033 +:10a02c002b50a6002120a9000b288a006167400b49 +:10a03c002328a600234046002318eb002b104800d1 +:10a04c00d667400b2318620021288900f967400b62 +:10a05c000b20a600f8ff605423404600d767400b46 +:10a06c00211800000800e00300000000e0ffbd27fd +:10a07c001c00bfaf1800beaf21f0a0032000c4af7e +:10a08c002400c5af1000c0a32000c48f2400c58fce +:10a09c00906e400f000000001000c2a31000c2839d +:10a0ac0021e8c0031c00bf8f1800be8f2000bd2705 +:10a0bc000800e00300000000e0ffbd271c00bfaf5c +:10a0cc001800beaf21f0a0031000c0a3f06e400f2b +:10a0dc00000000001000c2a31000c28321e8c003de +:10a0ec001c00bf8f1800be8f2000bd270800e003a6 +:10a0fc0000000000f0ffbd270c00beaf21f0a00354 +:10a10c001000c4af0000c0a30000c28321e8c0034c +:10a11c000c00be8f1000bd270800e00300000000fb +:10a12c00e8ffbd271400bfaf1000beaf21f0a003a5 +:10a13c001800c4af1800c48f9a43400f00000000f1 +:10a14c0021e8c0031400bf8f1000be8f1800bd277c +:10a15c000800e00300000000e8ffbd271400bfafbb +:10a16c001000beaf21f0a0031800c4af1c00c5af97 +:10a17c001800c48f1c00c58f8842400f00000000df +:10a18c0021e8c0031400bf8f1000be8f1800bd273c +:10a19c000800e00300000000e8ffbd271400bfaf7b +:10a1ac001000beaf21f0a0031800c4af1c00c5af57 +:10a1bc001800c48f1c00c58f1042400f0000000017 +:10a1cc0021e8c0031400bf8f1000be8f1800bd27fc +:10a1dc000800e00300000000e8ffbd271400bfaf3b +:10a1ec001000beaf21f0a0031800c4af1c00c5af17 +:10a1fc002110c0002000c2a72000c2971800c48ff5 +:10a20c001c00c58f21304000db42400f00000000d5 +:10a21c0021e8c0031400bf8f1000be8f1800bd27ab +:10a22c000800e00300000000e0ffbd271c00bfafea +:10a23c001800beaf21f0a0032000c4af2400c5afae +:10a24c002800c6af10808297f8ff42241600c2a7e0 +:10a25c001000c0af1400c0a31600c3972800c28f13 +:10a26c002b10620012004014000000002400c38f69 +:10a27c001000c28f211862002800c28fffff4230ed +:10a28c002000c48f21286000213040007968400fe5 +:10a29c0000000000ff0043301400c2932110620044 +:10a2ac00ff0042301400c2a3cf68400b0000000036 +:10a2bc002400c38f1000c28f211862001600c297b1 +:10a2cc002000c48f21286000213040007968400fa5 +:10a2dc0000000000ff0043301400c2932110620004 +:10a2ec00ff0042301400c2a31400c2830f004014bc +:10a2fc00000000001600c2972800c38f23106200d4 +:10a30c002800c2af1600c2971000c38f2110620044 +:10a31c001000c2af1600c2972000c38f211062003c +:10a32c002000c2af9968400b000000000000000044 +:10a33c001400c28321e8c0031c00bf8f1800be8f1d +:10a34c002000bd270800e00300000000e8ffbd2747 +:10a35c001400bfaf1000beaf21f0a0031800c4afb3 +:10a36c001c00c5af2110c0002000c2a72000c2975e +:10a37c001800c48f1c00c58f213040004642400f8e +:10a38c000000000021e8c0031400bf8f1000be8f36 +:10a39c001800bd270800e00300000000e0ffbd2707 +:10a3ac001c00bfaf1800beaf21f0a0032000c4af4b +:10a3bc002400c5af2800c6af10808297f8ff422456 +:10a3cc001600c2a71000c0af1400c0a31600c3979c +:10a3dc002800c28f2b1062001200401400000000f5 +:10a3ec002400c38f1000c28f211862002800c28f76 +:10a3fc00ffff42302000c48f212860002130400034 +:10a40c00d668400f00000000ff0043301400c293d8 +:10a41c0021106200ff0042301400c2a32c69400bd3 +:10a42c00000000002400c38f1000c28f21186200ae +:10a43c001600c2972000c48f2128600021304000f4 +:10a44c00d668400f00000000ff0043301400c29398 +:10a45c0021106200ff0042301400c2a31400c2831a +:10a46c000f004014000000001600c2972800c38f94 +:10a47c00231062002800c2af1600c2971000c38fd1 +:10a48c00211062001000c2af1600c2972000c38fcb +:10a49c00211062002000c2aff668400b00000000e3 +:10a4ac00000000001400c28321e8c0031c00bf8f11 +:10a4bc001800be8f2000bd270800e003000000003c +:10a4cc002110c000214080003e00e0142118a000a3 +:10a4dc002b30a6004600c010000000002020447065 +:10a4ec0008008010022c0200232804000628a80073 +:10a4fc0004188300041082002518a300044088006f +:10a50c00022c02001b006500f401a000ffff493083 +:10a51c00026408001250000010580000022049711b +:10a52c00003c0b002538ec002b30e4001b006500d0 +:10a53c00f401a0000b00c0102318e4002138e20045 +:10a54c002b18e20006006014ffff4a252b18e400cc +:10a55c00040060102318e400ffff4a252138e200b4 +:10a56c002318e4001b006500f401a000ffff083174 +:10a57c00122000001038000002488970003c0700cf +:10a58c002540e8002b3009011b006500f401a000f8 +:10a59c000600c010214002012b10020103004014e0 +:10a5ac00ffff84242b48090123208900004c0a005a +:10a5bc002548890021280000211020010800e00313 +:10a5cc002118a0002b10a7004200405421280000a5 +:10a5dc002018e3704300601420000a242b28e500a7 +:10a5ec00c500a0142b2086007169400b0100892c3a +:10a5fc000600401420184370010003241b00620065 +:10a60c00f401400012100000201843707a006054ce +:10a61c00200008242348a200023c0200ffff4b301c +:10a62c00010005241b002701f401e000026c080066 +:10a63c00125000001060000002204b71001c0c0036 +:10a64c0025186d002b3064001b002701f401e0007d +:10a65c000900c05023186400211862002b306200de +:10a66c000400c014ffff4a252b306400a500c05421 +:10a67c00ffff4a25231864001b006700f401e0006b +:10a68c00ffff0831122000001048000002588b70a8 +:10a69c00004c0900254028012b300b011b006700e2 +:10a6ac00f401e0000600c010214002012b10020151 +:10a6bc0003004014ffff84242b580b0123208b0034 +:10a6cc00004c0a0025488900211020010800e003f5 +:10a6dc002118a00021480000211020010800e003ef +:10a6ec002118a000235043010610460104386700ce +:10a6fc002538470006484501021407001b002201bb +:10a70c00f4014000ffffec300650440104286500c2 +:10a71c002528450102540500125800001070000055 +:10a72c0002686c7100440e0025400a012b500d018b +:10a73c001b002201f40140000a00401104306600a5 +:10a74c00214007012b48070106002015ffff6b2550 +:10a75c002b480d010400205123400d01ffff6b25f8 +:10a76c002140070123400d011b000201f4014000b0 +:10a77c00ffffa530124800001068000002602c7129 +:10a78c00006c0d002528a5012b50ac001b0002010c +:10a79c00f40140000b004051005c0b002128a70085 +:10a7ac002b10a70006004014ffff29252b10ac002e +:10a7bc0004004050005c0b00ffff29252128a70056 +:10a7cc00005c0b0025482b01190026012328ac0046 +:10a7dc00103800002b40a700440000151230000078 +:10a7ec003f00a75004206400212800002110200104 +:10a7fc000800e0032118a0002340030104106200ac +:10a80c0006300501023c02001b00c700f401e00009 +:10a81c00ffff4b3004286500064804010440640027 +:10a82c0025482501026c0900125000001060000040 +:10a83c0002204b7100640c002518ac012b2864001d +:10a84c001b00c700f401e0000b00a05023186400ab +:10a85c00211862002b2862000600a014ffff4a2575 +:10a86c002b2864000400a05023186400ffff4a2525 +:10a87c0021186200231864001b006700f401e0003b +:10a88c00ffff2931122000001060000002308b7095 +:10a89c0000640c00254889012b2826011b00670049 +:10a8ac00f401e0000b00a050002c0a00214822010a +:10a8bc002b18220106006014ffff84242b1826019c +:10a8cc0004006050002c0a00ffff84242148220160 +:10a8dc00002c0a00234826018c69400b2528850092 +:10a8ec002b308600c1ffc05021280000ffff292516 +:10a8fc00fe69400b21280000212800007169400be3 +:10a90c0001000924a069400b21186200f8ffbd2743 +:10a91c000400beaf21f0a0030800c4af0c00c5af0b +:10a92c001000c6af1000c28f1300401000000000d2 +:10a93c000c00c28f000043900800c28f000043a09f +:10a94c000800c28f010042240800c2af0c00c28f65 +:10a95c00010042240c00c2af1000c28fffff422442 +:10a96c001000c2af1000c28ff1ff401400000000b5 +:10a97c00626a400b000000000000000021e8c003e8 +:10a98c000400be8f0800bd270800e0030000000093 +:10a99c00f0ffbd270c00beaf21f0a0031000c4af28 +:10a9ac001400c5af0000c0a3776a400b0000000084 +:10a9bc001000c28f000043900000c293261062006a +:10a9cc000000c2a31000c28f010042241000c2afcd +:10a9dc001400c28fffff42241400c2af1400c28fb8 +:10a9ec00f3ff4014000000000000c29321e8c003f4 +:10a9fc000c00be8f1000bd270800e0030000000013 +:10aa0c00f8ffbd270400beaf21f0a0030800c4afbf +:10aa1c002110a0001000c6af0c00c2a31000c28f02 +:10aa2c000f004010000000000800c28f0c00c39300 +:10aa3c00000043a00800c28f010042240800c2afee +:10aa4c001000c28fffff42241000c2af1000c28f53 +:10aa5c00f5ff4014000000009c6a400b0000000051 +:10aa6c000000000021e8c0030400be8f0800bd27d1 +:10aa7c000800e00300000000f0ffbd270c00beaf93 +:10aa8c0021f0a0031000c4af0000c0a7ae6a400bb9 +:10aa9c00000000000000c297010042240000c2a781 +:10aaac001000c28f010042241000c2af1000c28ff0 +:10aabc0000004290f7ff4014000000000000c29715 +:10aacc0021e8c0030c00be8f1000bd270800e00376 +:10aadc0000000000f8ffbd270400beaf21f0a0036a +:10aaec000800c4af0c00c5af2110c0001000c2a7f5 +:10aafc00e46a400b000000000800c28f0000439085 +:10ab0c000c00c28f000042900e006210000000008a +:10ab1c000800c28f000043900c00c28f00004290ce +:10ab2c002b1062000400401000000000ff00022403 +:10ab3c00d26a400b0000000001000224e86a400bbe +:10ab4c00000000000800c28f000042900400401476 +:10ab5c000000000021100000e86a400b000000001b +:10ab6c000800c28f010042240800c2af0c00c28f43 +:10ab7c00010042240c00c2af1000c297ffff422418 +:10ab8c001000c2a71000c297dbff401400000000a9 +:10ab9c002110000021e8c0030400be8f0800bd276f +:10abac000800e00300000000e0ffbd271c00bfaf61 +:10abbc001800beaf21f0a0032000c4af2400c5af25 +:10abcc002400c28f000042901000c2a32400c28f48 +:10abdc00010042242400c2af1000c29304004014b0 +:10abec00000000002000c28f1d6b400b0000000015 +:10abfc002400c48fa16a400f000000001200c2a7fd +:10ac0c002000c28f000042901400c2a32000c28f0b +:10ac1c00010042242000c2af1400c293040040146f +:10ac2c0000000000211000001d6b400b0000000014 +:10ac3c001400c3931000c293f1ff621400000000d3 +:10ac4c001200c2972000c48f2400c58f2130400011 +:10ac5c00b86a400f00000000e9ff4014000000003b +:10ac6c002000c28fffff422421e8c0031c00bf8fcd +:10ac7c001800be8f2000bd270800e0030000000074 +:10ac8c00f0ffbd270c00beaf21f0a0031000c4af35 +:10ac9c001400c5af1800c6af0400c0a30000c0afbd +:10acac003e6b400b000000001000c38f0000c28ff1 +:10acbc0021106200000043901400c48f0000c28f6a +:10accc00211082000000429005006210000000007c +:10acdc00010002240400c2a3436b400b00000000df +:10acec000000c28f010042240000c2af0000c38fdd +:10acfc001800c28f2b106200ebff40140000000004 +:10ad0c000400c28321e8c0030c00be8f1000bd27d5 +:08ad1c000800e0030000000044 +:020000040000fa +:020000041d01dc +:10ad24002558000000000000c70000004900000092 +:10ad34008e0000009200000055000000db000000bf +:10ad44001c000000e300000024000000aa00000032 +:10ad54006d00000071000000b60000003800000023 +:10ad6400ff00000001000000c600000048000000d1 +:10ad74008f0000009300000054000000da0000007f +:10ad84001d000000e200000025000000ab000000f0 +:10ad94006c00000070000000b700000039000000e3 +:10ada400fe00000002000000c50000004b0000008f +:10adb4008c0000009000000057000000d900000043 +:10adc4001e000000e100000026000000a8000000b2 +:10add4006f00000073000000b40000003a0000009f +:10ade400fd00000003000000c40000004a00000051 +:10adf4008d0000009100000056000000d800000003 +:10ae04001f000000e000000027000000a90000006f +:10ae14006e00000072000000b50000003b0000005e +:10ae2400fc00000004000000c30000004d0000000e +:10ae34008a0000009600000051000000df000000be +:10ae440018000000e700000020000000ae00000031 +:10ae54006900000075000000b20000003c00000022 +:10ae6400fb00000005000000c20000004c000000d0 +:10ae74008b0000009700000050000000de0000007e +:10ae840019000000e600000021000000af000000ef +:10ae94006800000074000000b30000003d000000e2 +:10aea400fa00000006000000c10000004f0000008e +:10aeb400880000009400000053000000dd00000042 +:10aec4001a000000e500000022000000ac000000b1 +:10aed4006b00000077000000b00000003e0000009e +:10aee400f900000007000000c00000004e00000050 +:10aef400890000009500000052000000dc00000002 +:10af04001b000000e400000023000000ad0000006e +:10af14006a00000076000000b10000003f0000005d +:10af2400f800000008000000cf000000410000000d +:10af3400860000009a0000005d000000d3000000bd +:10af440014000000eb0000002c000000a200000030 +:10af54006500000079000000be0000003000000021 +:10af6400f700000009000000ce00000040000000cf +:10af7400870000009b0000005c000000d20000007d +:10af840015000000ea0000002d000000a3000000ee +:10af94006400000078000000bf00000031000000e1 +:10afa400f60000000a000000cd000000430000008d +:10afb40084000000980000005f000000d100000041 +:10afc40016000000e90000002e000000a0000000b0 +:10afd400670000007b000000bc000000320000009d +:10afe400f50000000b000000cc000000420000004f +:10aff40085000000990000005e000000d000000001 +:10b0040017000000e80000002f000000a10000006d +:10b01400660000007a000000bd000000330000005c +:10b02400f40000000c000000cb000000450000000c +:10b03400820000009e00000059000000d7000000bc +:10b0440010000000ef00000028000000a60000002f +:10b05400610000007d000000ba0000003400000020 +:10b06400f30000000d000000ca00000044000000ce +:10b07400830000009f00000058000000d60000007c +:10b0840011000000ee00000029000000a7000000ed +:10b09400600000007c000000bb00000035000000e0 +:10b0a400f20000000e000000c9000000470000008c +:10b0b400800000009c0000005b000000d500000040 +:10b0c40012000000ed0000002a000000a4000000af +:10b0d400630000007f000000b8000000360000009c +:10b0e400f10000000f000000c8000000460000004e +:10b0f400810000009d0000005a000000d400000000 +:10b1040013000000ec0000002b000000a50000006c +:10b11400620000007e000000b9000000370000005b +:10b12400f00000004a462e636f6d00000a0d000017 +:10b134002573202573202573202573202573000093 +:10b1440068656c7000000000706f77657200000025 +:10b154000a5b73746174655d20706172616d6574fe +:10b16400657220697320696e76616c69642e202093 +:10b1740054797065202768656c702720666f72208b +:10b184006d6f726520696e666f0a00006f6e000055 +:10b194005475726e696e67206368616c6574277399 +:10b1a40020696e766572746572204f4e0a00000045 +:10b1b4006f6666005475726e696e67206368616cb1 +:10b1c4006574277320696e766572746572204f46c4 +:10b1d400460a00000a5b73746174655d20706172d5 +:10b1e400616d6574657220697320696e76616c693e +:10b1f400642e202054797065202768656c702720a0 +:10b20400666f722076616c69642076616c75657313 +:10b214000a0000000a000000776966690000000067 +:10b224000a5b76616c75655d20706172616d657431 +:10b23400657220697320696e76616c69642e2020c2 +:10b2440054797065202768656c702720666f7220ba +:10b254006d6f726520696e666f0a00005475726eb8 +:10b26400696e672057694669206d6f64756c652047 +:10b274004f4e0a005769466920616c7265616479b2 +:10b2840020636f6e6e65637465642e2e2e0a000053 +:10b294005475726e696e672057694669206d6f64d4 +:10b2a400756c65204f46462e2e2e20476f6f6462c4 +:10b2b4007965210a0000000057694669206d6f64b2 +:10b2c400756c6520616c7265616479204f46462e09 +:10b2d4002e2e207468617427732077656972642147 +:10b2e4000a0000007374617475730000576946693d +:10b2f400206d6f64756c65204f46460a000000009f +:10b304005769466920436f6e6e65637465640a000d +:10b314005769466920446973636f6e6e656374652b +:10b32400640a000057694669204552524f520a0088 +:10b334005769466920737461746520556e6b6e6f2e +:10b34400776e210a000000006261747465727900ee +:10b35400256600004261747465727920566f6c74be +:10b364006167653a2000000025640000426174743e +:10b3740065727920636861726765206375727265ae +:10b384006e743a20000000006d410a00766f6c7400 +:10b394006167650063757272656e7400736f630034 +:10b3a4004261747465727920534f433a200000005f +:10b3b400250a000047656e6572616c2073746174c0 +:10b3c40075733a0a00000000496e766572746572fe +:10b3d40020706f7765722072656c61793a204f46f0 +:10b3e400460a0000496e76657274657220706f7744 +:10b3f40065722072656c61793a204f4e0a00000034 +:10b40400496e76657274657220706f77657220720a +:10b41400656c61793a20554e4b4e4f574e0a0000e9 +:10b42400576946693a204d6f64756c6520697320cd +:10b434007475726e6564204f46460a005769466902 +:10b444003a20436f6e6e656374656420746f2041a7 +:10b45400500a0000576946693a20446973636f6e65 +:10b464006e65637465642066726f6d2041500a00d6 +:10b47400576946693a204d6f64756c6520696e6939 +:10b484007469616c697a6174696f6e206572726f38 +:10b49400720a0000576946693a20556e6b6e6f77e1 +:10b4a4006e2073746174650a00000000252e3266f4 +:10b4b40000000000560a000025646d410a000000e7 +:10b4c400256425250a000000646562756700000094 +:10b4d400556e6b6e6f776e20636f6d6d616e640a6f +:04b4e4000a0000005a +:020000040000fa +:020000041d01dc +:10b4e800e8ffbd271400bfaf1000beaf21f0a003d6 +:10b4f80021100000808182af708180af7c8180af95 +:10b5080001000224848182af03000424640005241e +:10b51800e952400f0000000021100000748182af42 +:10b52800788180af1a60400f0000000002004014cc +:10b5380000000000848180af21e8c0031400bf8fa1 +:10b548001000be8f1800bd270800e00300000000af +:10b55800d8ffbd272400bfaf2000beaf21f0a00355 +:10b5680003000424fc51400f000000005a00401062 +:10b578000000000081bf033c0090628c4408027cfc +:10b58800009062ac0000000081bf023c0090428c39 +:10b5980001004230fcff40100000000081bf023c67 +:10b5a8007090428c1000c2af81bf033c0090628c47 +:10b5b800010004244408827c009062ac1000c48f0f +:10b5c800847c400f0000000021184000029d023cce +:10b5d8002120600074f7458c7772400f000000004e +:10b5e8001400c2af029d023c1400c48f78f7458c4a +:10b5f8001474400f000000001400c2af1400c28f82 +:10b608001800c2af029d023c1400c48f7cf7458c21 +:10b618001474400f000000001400c2af7881828fbc +:10b62800881342280600401400000000788180af8b +:10b638001400c28f748182af9b6d400b0000000024 +:10b648007881828f01004224788182af7481828f51 +:10b65800212040001400c58f3d71400f00000000fc +:10b66800748182af1400c28f808182af03000424ea +:10b6780064000524e952400f000000008481838f94 +:10b688000100022409006214000000009960400fc4 +:10b6980000000000708182af7b63400f0000000053 +:10b6a8000200401400000000848180affc80828f7b +:10b6b8000a0043380100632cff0063300100422474 +:10b6c800fc8082af0400601000000000fc8080afa6 +:10b6d800ea6d400f0000000021e8c0032400bf8f7e +:10b6e8002000be8f2800bd270800e00300000000ee +:10b6f800e0ffbd271c00bfaf1800beaf1400b0affd +:10b7080021f0a0037481908f7881828f21204000de +:10b71800847c400f00000000212000022128400006 +:10b728007772400f00000000808182af2110000076 +:10b73800748182af788180af8081828f21e8c003d5 +:10b748001c00bf8f1800be8f1400b08f2000bd27cb +:10b758000800e00300000000f8ffbd270400beafaa +:10b7680021f0a0037081828f21e8c0030400be8ffe +:10b778000800bd270800e00300000000f8ffbd270f +:10b788000400beaf21f0a0037c81828f21e8c003b2 +:10b798000400be8f0800bd270800e0030000000079 +:10b7a800d0ffbd272c00bfaf2800beaf21f0a003fb +:10b7b8008081838f029d023c2120600080f7458ca8 +:10b7c8001474400f0000000021204000647b400feb +:10b7d800000000001000c2af7081828f1400c2af59 +:10b7e8001000c28f2014027c1800c2a31000c28f60 +:10b7f800031202001000c2af1000c28f2014027c96 +:10b808001900c2a31400c28f2014027c1a00c2a31c +:10b818001400c28f031202001400c2af1400c28fba +:10b828002014027c1b00c2a31800c227212040005c +:10b8380004000524cc3a400f0000000021e8c003b2 +:10b848002c00bf8f2800be8f3000bd270800e00302 +:10b8580000000000f8ffbd270400beaf21f0a003e0 +:10b868008481828f21e8c0030400be8f0800bd27b1 +:10b878000800e00300000000e0ffbd271c00bfaf88 +:10b888001800beaf21f0a0032000c4af2400c5af4c +:10b898002110c0002800c2a71400c0a31000c0a334 +:10b8a8001100c0a32000c28f070040140000000050 +:10b8b8001400c2272000c2af010002241000c2a356 +:10b8c800406e400b000000002400c28f07004014a7 +:10b8d800000000001400c2272400c2af01000224a7 +:10b8e8001100c2a3406e400b00000000faff0224c2 +:10b8f8008a6e400b000000001100c2932000401423 +:10b90800000000005a6e400b0000000088bf033c96 +:10b918002061628c0400027c206162ac2c818293dd +:10b9280021200000212840001a7c400f0000000060 +:10b938001200c2a388bf033c2061628c010004246a +:10b948000400827c206162ac2400c28f1200c39381 +:10b95800000043a02400c28f010042242400c2af8b +:10b968002800c2972b100200ff0042302800c3971e +:10b97800ffff63242800c3a7e4ff40140000000071 +:10b988001000c29320004014000000007c6e400ba1 +:10b998000000000088bf033c2061628c0400027c28 +:10b9a800206162ac2000c28f000042902118400044 +:10b9b8002000c28f010042242000c2af2c81829354 +:10b9c80021206000212840001a7c400f0000000060 +:10b9d8001300c2a388bf033c2061628c01000424c9 +:10b9e8000400827c206162ac2800c2972b10020000 +:10b9f800ff0042302800c397ffff63242800c3a735 +:10ba0800e4ff40140000000088bf033c2061628c02 +:10ba1800010004240400827c206162ac2110000033 +:10ba280021e8c0031c00bf8f1800be8f2000bd276f +:10ba38000800e00300000000d8ffbd272400bfafc6 +:10ba48002000beaf21f0a0032800c4af2c00c5af72 +:10ba58001000c0a3c404023c00b442341400c2afb6 +:10ba6800e400023cc0e142341800c2af1800c28fa3 +:10ba7800401002001400c38f1b006200f401400054 +:10ba880010180000121000001c00c2af1800c28f6e +:10ba9800401002001400c38f1b006200f401400034 +:10baa8001010000004004010000000001c00c28fad +:10bab800010042241c00c2af1c00c28f0101422cad +:10bac8000300401400000000000102241c00c2af63 +:10bad8001c00c28f04004010000000001c00c28f30 +:10bae800ffff42241c00c2af1c00c28fff0042307f +:10baf8002c8182a34070400f000000000100042444 +:10bb08006270400f000000001000c28321e8c003eb +:10bb18002400bf8f2000be8f2800bd270800e00347 +:10bb280000000000e0ffbd271c00bfaf1800beaf3b +:10bb380021f0a003211080002400c5af2000c2a37b +:10bb48001000c0a32000c393030002241000621455 +:10bb5800000000002400c28f1400c2af1400c28f7e +:10bb68000000448c1400c28f0400438c1400c28f60 +:10bb7800080042942128600021304000206e400fc8 +:10bb8800000000001000c2a3e96e400b0000000096 +:10bb9800ffff02241000c2a3000000001000c283af +:10bba80021e8c0031c00bf8f1800be8f2000bd27ee +:10bbb8000800e00300000000f0ffbd270c00beaf46 +:10bbc80021f0a0030000c0a30000c28321e8c00345 +:10bbd8000c00be8f1000bd270800e0030000000025 +:10bbe800f8ffbd270400beaf21f0a0030800c4afd2 +:10bbf8002110000021e8c0030400be8f0800bd2703 +:10bc08000800e00300000000f8ffbd270400beaff5 +:10bc180021f0a003211080000800c2a30800c293ed +:10bc28000500422c0400401400000000ffff02241d +:10bc3800336f400b000000000800c293040040145a +:10bc48000000000003000224336f400b00000000d6 +:10bc58000800c393010002240400621400000000dd +:10bc680004000224336f400b000000000800c39357 +:10bc78000200022404006214000000000f000224e5 +:10bc8800336f400b000000000800c3930300022438 +:10bc9800040062140000000010000224336f400bff +:10bca800000000000800c39304000224040062148a +:10bcb8000000000012000224336f400b0000000057 +:10bcc800feff022421e8c0030400be8f0800bd2740 +:10bcd8000800e00300000000e0ffbd271c00bfaf24 +:10bce8001800beaf21f0a0032118a0002110c00049 +:10bcf8002c00c7af2000c4a32400c3a32800c2a3fc +:10bd0800df2c400f000000001000c2a31000c28307 +:10bd180036004014000000002400c2932120400097 +:10bd2800046f400f000000001100c2a31100c2837d +:10bd380028004004000000002000c2930b004014bb +:10bd4800000000001100c293211840002800c2938f +:10bd580021206000212840003e2b400f00000000f9 +:10bd68001000c2a3786f400b000000002000c393ae +:10bd7800010002240b006214000000001100c293ad +:10bd8800211840002800c29321206000212840008b +:10bd9800732b400f000000001000c2a3786f400b07 +:10bda800000000002000c393020002240a0062146d +:10bdb800000000001100c293212040002c00c58f14 +:10bdc800a82b400f000000001000c2a3786f400ba2 +:10bdd8000000000000000000282d400f00000000b7 +:10bde8001000c2a37e6f400b00000000000000009e +:10bdf8001000c28321e8c0031c00bf8f1800be8f4b +:10be08002000bd270800e00300000000f8ffbd2760 +:10be18000400beaf21f0a0030800c4af2110000049 +:10be280021e8c0030400be8f0800bd270800e00316 +:10be380000000000e8ffbd271400bfaf1000beaf30 +:10be480021f0a003211880002110a0001800c3a32e +:10be58001c00c2a31800c3931c00c2932120000039 +:10be6800212860002130400021380000386f400f41 +:10be78000000000021e8c0031400bf8f1000be8f2f +:10be88001800bd270800e00300000000e8ffbd27f8 +:10be98001400bfaf1000beaf21f0a003211880002e +:10bea8002110a0001800c3a31c00c2a31800c3934c +:10beb8001c00c293010004242128600021304000a6 +:10bec80021380000386f400f0000000021e8c0034f +:10bed8001400bf8f1000be8f1800bd270800e003b4 +:10bee80000000000e8ffbd271400bfaf1000beaf80 +:10bef80021f0a003211080001c00c5af1800c2a3c8 +:10bf08001800c293020004242128400021300000b8 +:10bf18001c00c78f386f400f0000000021e8c003e5 +:10bf28001400bf8f1000be8f1800bd270800e00363 +:10bf380000000000e8ffbd271400bfaf1000beaf2f +:10bf480021f0a0031800c4af2110a0001c00c2a358 +:10bf58001c00c2931800c48f21284000cb2b400f2f +:10bf68000000000021e8c0031400bf8f1000be8f3e +:10bf78001800bd270800e0030000000000e85d414c +:10bf880000701a4000601b4090ffbd276c00baafdc +:10bf98006800bbaf44781b7c000c7b3700609b407b +:10bfa8005c00bfaf5800beaf5400b9af5000b8af87 +:10bfb8004c00afaf4800aeaf4400adaf4000acafef +:10bfc8003c00abaf3800aaaf3400a9af3000a8af2f +:10bfd8002c00a7af2800a6af2400a5af2000a4af6f +:10bfe8001c00a3af1800a2af1400a1af12100000ec +:10bff8006400a2af101800006000a3af21f0a003f6 +:10c008006480828f04004010000000006480828fea +:10c0180009f840000000000088bf033c3010628c23 +:10c02800c418027c301062ac21e8c0036400a28fff +:10c03800130040006000a38f110060005c00bf8ff8 +:10c048005800be8f5400b98f5000b88f4c00af8f86 +:10c058004800ae8f4400ad8f4000ac8f3c00ab8fe2 +:10c068003800aa8f3400a98f3000a88f2c00a78f22 +:10c078002800a68f2400a58f2000a48f1c00a38f62 +:10c088001800a28f1400a18f00606041c00000005a +:10c098006c00ba8f6800bb8f00709a407000bd2793 +:10c0a80000e8dd4100609b4018000042f8ffbd2712 +:10c0b8000400beaf21f0a003648080af211000000f +:10c0c80021e8c0030400be8f0800bd270800e00374 +:10c0d80000000000f8ffbd270400beaf21f0a00358 +:10c0e8002110000021e8c0030400be8f0800bd270e +:10c0f8000800e00300000000e8ffbd271400bfaf00 +:10c108001000beaf21f0a00388bf033c2061628c01 +:10c118008410027c206162ac88bf033c2061628c81 +:10c128000421027c206162ac640004249f53400f08 +:10c138000000000088bf033c2061628c01000424d9 +:10c148008410827c206162ac960004249f53400fc7 +:10c158000000000088bf033c2061628c01000424b9 +:10c168000421827c206162ac21e8c0031400bf8fe7 +:10c178001000be8f1800bd270800e0030000000073 +:10c18800e8ffbd271400bfaf1000beaf21f0a00329 +:10c198001800c4af1800c48f9f53400f0000000060 +:10c1a80021e8c0031400bf8f1000be8f1800bd2700 +:10c1b8000800e00300000000f8ffbd270400beaf40 +:10c1c80021f0a0030800c4af0800c28f648082afca +:10c1d80021e8c0030400be8f0800bd270800e00363 +:10c1e80000000000f8ffbd270400beaf21f0a00347 +:10c1f800211080000800c2a30800c2930700401461 +:10c208000000000088bf033c6010628cc418027ce8 +:10c21800601062ac8e70400b0000000088bf033cc9 +:10c228006010628c01000424c418827c601062ac27 +:10c2380021e8c0030400be8f0800bd270800e00302 +:04c2480000000000f2 +:020000040000fa +:020000041d01dc +:10c24c00d8ffbd271400b0af2400bfaf2000b3afa0 +:10c25c001c00b2af1800b1af4400800421808000f4 +:10c26c006e0082280e0040100b00822879004010ce +:10c27c00029d023ca8f1422480800400218002022d +:10c28c000000028e2400bf8f2000b38f1c00b28fe1 +:10c29c001800b18f1400b08f0800e0032800bd27f0 +:10c2ac00eb51023c1f85423418008200c3970400f6 +:10c2bc00102800006666133c431905002318720011 +:10c2cc0080100300001903002110430080180200a5 +:10c2dc0021104300231082002014027c6766732611 +:10c2ec0018005300c317020010180000029d113ce7 +:10c2fc0083180300231062002014027c09004224de +:10c30c00a8f1312680100200211051004c00248e1f +:10c31c001474400f0000458c1800130221204000bb +:10c32c0010980000839813002390720240101200a2 +:10c33c00c090120021905200238012022084107ca5 +:10c34c0080801000218811021474400f0000258e8b +:10c35c002400bf8f2000b38f1c00b28f1800b18f48 +:10c36c001400b08f0800e0032800bd2723800400d0 +:10c37c002084107c6e00022a1d004010eb51023c00 +:10c38c000b00022a51004054029d023c6666023c9e +:10c39c006766422418000202c31f10001010000030 +:10c3ac00831002002310430040200200c01802003a +:10c3bc0021188300238003022024027c090084249a +:10c3cc002014107c029d033cdcf1632480200400cb +:10c3dc008010020021208300211043000000848c77 +:10c3ec001474400f0000458ca570400b2400bf8fc7 +:10c3fc001f85423418000202c39710001028000059 +:10c40c006666133c43190500231872008010030064 +:10c41c000019030021104300801802002110430072 +:10c42c00231002022014027c676673261800530046 +:10c43c00c317020010180000029d113c8318030062 +:10c44c00231062002014027c09004224c470400bab +:10c45c00dcf131266666023c6766422418008200d5 +:10c46c00c31f0400101000008310020023104300af +:10c47c0040200200c0180200211883002380030210 +:10c48c002014027c090042242084107c029d033c71 +:10c49c00a8f1632480100200808010002180030228 +:10c4ac00211043000000058e1474400f0000448cd2 +:10c4bc002400bf8f2000b38f1c00b28f1800b18fe7 +:10c4cc001400b08f0800e0032800bd27dcf14224e3 +:10c4dc008080100021800202a470400b0000028eac +:020000040000fa +:020000041d01dc +:10c4ec000080013c2628a100c24d0400ff00293128 +:10c4fc00c25d0500ff006b310080073c0042040068 +:10c50c00254007010052050025504701ffff2d254e +:10c51c00fe00a12d6100201000000000ffff6d2522 +:10c52c00fe00a12d770020100000000023602b01dd +:10c53c000d0080050000000020008129030020145c +:10c54c00000000001500001002000a2425300a002b +:10c55c0006508a0104688a011000a6110000000030 +:10c56c000e00001002004a3525480b0023600c0019 +:10c57c002000812903002014000000000700001097 +:10c58c000200082425300800064088010468880150 +:10c59c000200a6110000000002000835246087008c +:10c5ac00266885011000a0050000000021400a014a +:10c5bc002b680a011700a0110000000001000d31ca +:10c5cc000200a011000000000200083542400800e3 +:10c5dc0001002925ff0001240e0021150000000098 +:10c5ec000c000010000008242b680a010400a011a4 +:10c5fc0023400a0123400800030000102660870135 +:10c60c005000001100000000203006712348260164 +:10c61c000440c8000e00201900000000800008250e +:10c62c0080000d2d21482d01026a08000100ad315a +:10c63c0023400d014040080042420800c06d090033 +:10c64c0025400d0125100c010800e003000000003e +:10c65c00010006242330c9002000c12c3900201011 +:10c66c00000000000080013c2540010120000d2449 +:10c67c002368a6010448a801020020110640c80046 +:10c68c00010008350000092480000d25e3ffa105f9 +:10c69c0000000000e1ff0010010009240e0020152d +:10c6ac0000000000214008010500001100000000fe +:10c6bc0020600c7123482c0198ff00100440880165 +:10c6cc00ff0001240f006111000000000080013cfc +:10c6dc001800a11400000000216808011b00a0151f +:10c6ec0000000000ff000124140061150000000090 +:10c6fc00266885001500a005000000000d00001044 +:10c70c0000000000080060150000000021504a01e4 +:10c71c000a0040110000000020604c7123586c018d +:10c72c0082ff001004508a0121684a010700a015fd +:10c73c0000000000c4ff001025100500c2ff00100f +:10c74c0025100400c0ff001000000224beff0010e2 +:08c75c00c0ff023c00000000d8 +:020000040000fa +:020000041d01dc +:10c76400c0ffbd272c00b5af00a0153c6435a28ed8 +:10c774003c00bfaf3800beaf3400b7af3000b6af37 +:10c784002800b4af2400b3af2000b2af1c00b1af97 +:10c794007f0040101800b0af00a0023c1400a2af0c +:10c7a4000f009324c2981300c098130087006326d7 +:10c7b4001400a48fc219030004007e26bfff76264e +:10c7c400c019030077ff17342c01828c40f01e003f +:10c7d4001000a3af213000003f00d62e00a0143c6f +:10c7e4002bb87702040043900100633012006054b8 +:10c7f4000000508c0000438c0400649001008430dd +:10c8040007008014212053000000638c040064900e +:10c8140001008430fcff8010000043ac2120530051 +:10c824002b2864000400a0540000508c3b006106d7 +:10c834001400a58f0000508cfeff03242480030203 +:10c844002b105000e7ff4054211000022d00c0506f +:10c85400010006241f00c0162190c0030200e01648 +:10c864001000b28f08007226f47c400f2120400291 +:10c87400ffff03241c004310218840003001838ef5 +:10c884000800642421004410000062ac0400649099 +:10c8940001008434040064a0f8ff52262190520061 +:10c8a400040044926435a32601008434040044a2a5 +:10c8b40004004490000052acfe008430300192ae7b +:10c8c400040044a0000043ae21300000fa71400b84 +:10c8d40021100002f47c400f21204002ffff0324ba +:10c8e400e6ff43142188400008007226f47c400fc0 +:10c8f40021204002e2ff51143001838e5972400b13 +:10c9040021100000fa71400b211000020400649011 +:10c91400fe0084302772400b040064a02b188300af +:10c924000a0060102c01a4ac0000858c00a0033c1c +:10c934000400868c340165ac0000458c340163240a +:10c94400040066ac000085ac040080a004004390a1 +:10c95400000044ac01006334040043a008004224f6 +:10c964003c00bf8f3800be8f3400b78f3000b68fc5 +:10c974002c00b58f2800b48f2400b38f2000b28f11 +:10c984001c00b18f1800b08f0800e0034000bd27e1 +:10c994006435a22600a0073c00a0033c6c35632448 +:10c9a400040046900c0045901400a7af00a0073c7b +:10c9b4006435a3ae3001e3ac1400a38f0100c63488 +:10c9c4000100a534080042ac2c0162ac040046a06e +:08c9d400e971400b0c0045a0c5 +:020000040000fa +:020000041d01dc +:10c9dc0000800b3cc2450400ff000831c255050025 +:10c9ec00ff004a31003a04002538eb00004a0500ec +:10c9fc0025482b012670850024586e01ffff0e255b +:10ca0c00fe00c12d3f00201000000000ffff4e254e +:10ca1c00fe00c12d53002010000000002b08e9007f +:10ca2c000300201400000000423807000100082514 +:10ca3c0082630900f40180011b00ec00122000004d +:10ca4c0010300000ff3f2d311900a4011228000006 +:10ca5c00803306002b70c5000400c0112330c500c4 +:10ca6c00ffff84242130c9002b70c900f401800120 +:10ca7c001b00cc0012380000103000001900a70178 +:10ca8c0012280000803306002b70c5000400c01172 +:10ca9c002330c500ffffe7242130c9002b70c900eb +:10caac00807304002138ee000200c010003907002a +:10cabc000100e7347e000e242370ca0121400e01d0 +:10cacc00ffff0e25fe00c12d3400201000000000d9 +:10cadc008000e7248000ee2c21400e01027207003a +:10caec000100ce312338ee0040380700423a0700ef +:10cafc00c07508002538ee002510eb000800e00397 +:10cb0c000000000008000015000000002138e700bc +:10cb1c000500e010000000002060ec7023400c01c8 +:10cb2c00baff00100438870104004815000000000b +:10cb3c00217029012f00c01100000000ff0001240a +:10cb4c00080041110000000012000011000000005c +:10cb5c002170e7002700c015000000002200001023 +:10cb6c0000000000080040150000000021482901c9 +:10cb7c001d0020110000000020602c7123504c017e +:10cb8c00a6ff001004488901217029011900c01565 +:10cb9c0000000000d9ff001025100b001200001d32 +:10cbac000000000001000c24236088012000812d6e +:10cbbc00f8ff20100000000020000e242370cc0190 +:10cbcc000440c70102000011063887010200e73457 +:10cbdc00000008248000ee24bdffc1050000000009 +:10cbec00bbff001001000824807f013cc3ff001034 +:10cbfc0025106101c1ff0010c0ff023c00000000c5 +:020000040000fa +:020000041d01dc +:10cc0c00e8ffbd271400bfaf1000beaf21f0a0039a +:10cc1c0088bf033c2061628cc439027c206162ac09 +:10cc2c0088bf033ca061628c444a027ca06162ac68 +:10cc3c00020002246c8182af010004248e53400f49 +:10cc4c000000000021e8c0031400bf8f1000be8f4d +:10cc5c001800bd270800e00300000000e8ffbd2716 +:10cc6c001400bfaf1000beaf21f0a00388bf023c80 +:10cc7c005060428c008042300500401400000000df +:10cc8c00010002246c8182af2873400b000000006d +:10cc9c006c8180af010004247d53400f0000000024 +:10ccac002118400001000224110062140000000051 +:10ccbc0001000424fc51400f000000000c00401047 +:10cccc000000000088bf033c2061628cc439027ce8 +:10ccdc00206162ac88bf033ca061628c444a027c38 +:10ccec00a06162ac010004248e53400f00000000d0 +:10ccfc0004000424fc51400f00000000030040100d +:10cd0c00000000006e73400f0000000021e8c0031b +:10cd1c001400bf8f1000be8f1800bd270800e00361 +:10cd2c0000000000e8ffbd271400bfaf1000beaf2d +:10cd3c0021f0a00304000424c0a805343353400f91 +:10cd4c000000000021e8c0031400bf8f1000be8f4c +:10cd5c001800bd270800e00300000000e8ffbd2715 +:10cd6c001400bfaf1000beaf21f0a00388bf033c7e +:10cd7c002061628c01000424c439827c206162ac85 +:10cd8c000100042464000524e952400f0000000057 +:10cd9c000100022421e8c0031400bf8f1000be8fd5 +:10cdac001800bd270800e00300000000e8ffbd27c5 +:10cdbc001400bfaf1000beaf21f0a00388bf033c2e +:10cdcc00a061628c01000424444a827ca06162aca4 +:10cddc000100042464000524e952400f0000000007 +:10cdec000100022421e8c0031400bf8f1000be8f85 +:10cdfc001800bd270800e00300000000f8ffbd2765 +:10ce0c000400beaf21f0a0036c81828f2014027c41 +:10ce1c0021e8c0030400be8f0800bd270800e00312 +:04ce2c000000000002 +:020000040000fa +:020000041d01dc +:10ce3000251085008400401021100000010002240c +:10ce400046008210c2470500ffff022465008210e1 +:10ce50000a00022467008210f6ff02245a008210a2 +:10ce6000ffff022409000011401905004100801055 +:10ce70000080023c23200400232805002b1004001e +:10ce80002310a2002128400040190500c21604000a +:10ce900025106200c21e0500251043003900401411 +:10cea000801905008216040025106200821e05000c +:10ceb0002510430012004054990002241a00022455 +:10cec000c23f040040180500403004002518e3006c +:10ced0002120c0002128600080310300821e040050 +:10cee0002518c3008236050025186600f4ff60107f +:10cef000ffff42247f004224460040180100032423 +:10cf0000070083300a006010ff004328c000837cc4 +:10cf10000300842421208300c21e0400040060104a +:10cf2000ff0043284220040001004224ff00432860 +:10cf300034006010c2200400c005837c02006050f1 +:10cf40002110000000b0847c004208002510480039 +:10cf5000c01502000800e00325104400bbffa054e8 +:10cf6000ffff0224001208007f0042340800e003a3 +:10cf7000c0150200c0ffa2142320040021200000dd +:10cf80000080053c1a000224c03705004218040046 +:10cf90002518c30001008730423005002520e3003a +:10cfa0002128c000c21e0400403106002518c3001d +:10cfb000c236050025186600f3ff60140100422404 +:10cfc000be73400b7f004224a6ffa214001208008b +:10cfd00082004234c01502002000033c0800e00338 +:10cfe000251043009bffa4540a000224da73400b6f +:10cff0000012080099ffa054f6ff0224f473400bbe +:10d000000012080000120800ff0042340800e0038c +:10d01000c0150200231062001b0043280800605066 +:10d0200021200000231802000418640006104400a8 +:10d030002b20030025208200c073400b0100022436 +:10d04000d273400b211000000800e0030000000034 +:020000040000fa +:020000041d01dc +:10d05000c23d0400ff00e730c24d0500ff0029314a +:10d0600000800a3c003204002530ca00004205005e +:10d0700025400a012660850024504c01ffffec2466 +:10d08000fe00812d2100201000000000ffff2c2554 +:10d09000fe00812d36002010000000001900c8009d +:10d0a0001258000002006011103000000100c63468 +:10d0b0000300c0040000000040300600ffffe7242a +:10d0c00082ff2c252138ec00ffffec24fe00812d8f +:10d0d0003a002010000000008000c6248000cc2c04 +:10d0e0002138ec000262060001008c312330cc00b4 +:10d0f0004030060042320600c06507002530cc00f3 +:10d100002510ca000800e003000000000d00e01434 +:10d11000000000002130c6000500c0100000000023 +:10d120002058cb702338eb00d8ff00100430660184 +:10d13000ff0001241f002111000000001500001055 +:10d14000000000002160c6001a00801500000000e9 +:10d150000400201500000000216008011500801166 +:10d1600000000000ff0001240f0021150000000056 +:10d170000a002015000000002140080105000011f0 +:10d180000000000020580b7123482b01c3ff001042 +:10d1900004406801dbff001025100a00216008012f +:10d1a0000400801500000000807f013cd5ff0010c6 +:10d1b00025104101d3ff0010c0ff023cfaffe01c24 +:10d1c0000000000001000b24235867012000612d9e +:10d1d000f0ff20100000000020000c2423608b01d1 +:10d1e000043886010200e010063066010200c634f1 +:10d1f000000007248000cc24b7ff81050000000058 +:0cd20000b5ff0010010007240000000032 +:020000040000fa +:020000041d01dc +:10d20c002540850003000831030000112110800027 +:10d21c00380000100000aa900000aa8c0101093c03 +:10d22c0001012935c07909002340490124400f012f +:10d23c000700001124600a0105008811000000009d +:10d24c000000a5240000aa902a00001000008424ed +:10d25c000400ab8c00008aac2340690124400f0110 +:10d26c000700001124600b0105008811000000006c +:10d27c000400a5240000aa901e00001004008424c1 +:10d28c000800aa8c04008bac2340490124400f01f8 +:10d29c000700001124600a0105008811000000003d +:10d2ac000800a5240000aa90120000100800842495 +:10d2bc000c00ab8c08008aac2340690124400f01a0 +:10d2cc000700001124600b0105008811000000000c +:10d2dc000c00a5240000aa90060000100c00842469 +:10d2ec001000aa8c0c008bac10008424ceff001014 +:10d2fc001000a5240300401500008aa00800e003dc +:10d30c00000000000100ab900300601501008ba031 +:10d31c000800e003000000000200aa900300401582 +:10d32c0002008aa00800e003000000000300ab909c +:10d33c000300601503008ba00800e0030000000050 +:10d34c000400aa900300401504008aa00800e00322 +:10d35c00000000000500ab900300601505008ba0d9 +:10d36c000800e003000000000600aa90030040152e +:10d37c0006008aa00800e003000000000700ab9044 +:10d38c000300601507008ba00800e00300000000fc +:10d39c000800aa9008008424d6ff00100800a524d9 +:020000040000fa +:020000041d01dc +:10d3ac00d8ffbd271400b0af2400bfaf2000b3af2f +:10d3bc001c00b2af1800b1af4000a010218080005b +:10d3cc0054008010f8ff822404004380f8ff938cf3 +:10d3dc00010064302900801400a0043cd971400f76 +:10d3ec002120a00037004010218840003d00501043 +:10d3fc0023987002f8ff528c23904202c3901200c3 +:10d40c00c39813002b3072020a9846022120400068 +:10d41c0021280002d576400fc03013002b103002ab +:10d42c001e004010c0901200219032022b101202ec +:10d43c001a00401000a0023c23805002c380100050 +:10d44c00340144243401438cc08010000400828ccd +:10d45c0021803002040002ae000003ae2110200235 +:10d46c002400bf8f2000b38f1c00b28f1800b18f27 +:10d47c001400b08f0800e0032800bd272c01868c17 +:10d48c002b3046000100c0542c0182acfeff04245a +:10d49c0024186400fa74400b040043a02400bf8fce +:10d4ac00211020022000b38f1c00b28f1800b18f06 +:10d4bc001400b08f0800e0032800bd270b00801477 +:10d4cc0000a0023c2400bf8f211000002000b38f6d +:10d4dc001c00b28f1800b18f1400b08f0800e0034d +:10d4ec002800bd271b75400b211000022c01438c1a +:10d4fc00f8ff90242b180302010060542c0150ac4f +:10d50c000400039221100000fe0063301b75400bd9 +:10d51c00040003a22400bf8f2000b38f1c00b28f25 +:10d52c001800b18f1400b08f2120a000d971400bce +:04d53c002800bd27df +:020000040000fa +:020000041d01dc +:10d54000d8ffbd271000b0af00a0103c4835028eb8 +:10d550002400bfaf2000b4af1c00b3af1800b2afbf +:10d56000090040101400b1af2400bf8f2000b48f19 +:10d570001c00b38f1800b28f1400b18f1000b08f51 +:10d580000800e0032800bd2700a0133c4001638e83 +:10d590004200605000a0033c00a0143c4401828e75 +:10d5a000390040100000043c828f03008297020083 +:10d5b00000e0447c00e0657c0200313a0200523a0f +:10d5c0000a18b1000a10920021886000987d400f6f +:10d5d000219040000000438c0400428c2b20230249 +:10d5e000240080102110620000a0043cb42b84248d +:10d5f00000e0847c2b206400dbff80142188600025 +:10d600002b185102050060142b1822022b1842021d +:10d610000500605400a0023c2b182202d2ff6010cb +:10d620002190400000a0023cb42b4224421702008b +:10d63000050003241b0043140400032400a0023c43 +:10d640002588220225904202400171ae440192ae2b +:10d65000483511ae2400bf8f2000b48f1c00b38f5b +:10d660001800b28f1400b18f1000b08f0800e003d3 +:10d670002800bd272b202202e2ff80542b185102e4 +:10d680007b75400b00a0043c00a0023c00028424f7 +:10d69000803542246a75400b211044006675400baa +:10d6a00080356324070043140080023c2588220251 +:10d6b00025104202400171ae440182ae9575400bc7 +:10d6c000483511ae21884002400172ae9575400b7d +:04d6d000483511ae1a +:020000040000fa +:020000041d01dc +:10d6d4000c008294d0ffbd27010042301800b0af87 +:10d6e4002c00bfaf2800b4af2400b3af2000b2af0a +:10d6f4001c00b1af218080003e004010040080accb +:10d7040000a0143c28018282130040501000068eb1 +:10d7140000a0113c4c333126a0003326cc75400bbd +:10d72400020112240b003352280180a20c0022961d +:10d7340002014230fbff5254140031262120200202 +:10d74400d87a400f14003126f9ff33560c00229684 +:10d75400280180a21000068e1700c0100e00049647 +:10d764007876400f0800058e30004010040002aea9 +:10d77400ffff0324350043500c0002960800038e7b +:10d78400ffff4224000003ae040002ae0100642443 +:10d7940000006290000004ae2c00bf8f2800b48ffc +:10d7a4002400b38f2000b28f1c00b18f1800b08ffb +:10d7b4000800e0033000bd27040000ae1000a527d8 +:10d7c4007876400f0100062401000324120043145c +:10d7d4002c00bf8f1000a2932800b48f2400b38fb5 +:10d7e4002000b28f1c00b18f1800b08f0800e00336 +:10d7f4003000bd272c00bf8fffff02242800b48f08 +:10d804002400b38f2000b28f1c00b18f1800b08f9a +:10d814000800e0033000bd270c000396ffff02243c +:10d8240010006334e775400b0c0003a60c0002964d +:10d83400100042340c0002a60800028e040000ae60 +:10d84400000002aee775400bffff022430004234b3 +:08d854000f76400b0c0002a648 +:020000040000fa +:020000041d01dc +:10d85c004a462e636f6d0000486f73742049502048 +:10d86c0069732025642e25642e25642e25640d0aeb +:10d87c0000000000486f7374204e616d6520697361 +:10d88c002025730d0a00000042696e642046616910 +:10d89c006c656400736f636b6574202564206c6920 +:10d8ac007374656e204661696c65640a0000000043 +:10d8bc004269656e76656e75652061752063686179 +:10d8cc006c6574210a4c65206368616c657420700a +:10d8dc0061726c6520656e20616e676c6169732086 +:10d8ec00636f6d6d65204d722e20506570696e0ae8 +:10d8fc00496620796f75206e6565642068656c706b +:10d90c002e2e2e20747970652068656c700a0a00c2 +:10d91c00536f636b6574202564203a204163636503 +:10d92c007074204661696c65640a000057692d4665 +:10d93c006920636f6e6e65637465640d0000000092 +:10d94c0057692d466920646973636f6e6e656374e5 +:10d95c0065640d0057692d46692049502069732074 +:10d96c0025752e25752e25752e25750d0a000000a2 +:10d97c00776966695f63623a204d324d5f5749465d +:10d98c00495f524553505f50524f564953494f4e81 +:10d99c005f494e464f2e0d00776966695f63623aa8 +:10d9ac002050726f766973696f6e206661696c6561 +:10d9bc00642e0d00496d707256456d6172640000e5 +:10d9cc003132333435666666666600006572726f96 +:04d9dc0072000000d5 +:020000040000fa +:020000041d01dc +:10d9e000e0ffbd271000b0af1c00bfaf1800b2af02 +:10d9f0001400b1af1c00a0102180a0001b00c0507b +:10da00001c00bf8f110080142190c0000000023c58 +:10da1000000042241c0040102188a6000000000cd9 +:10da200001000424000002a201001026fbff1116d1 +:10da30001c00bf8f211040021400b18f1800b28f5c +:10da40001000b08f0800e0032000bd271c00bf8f2e +:10da5000211040021400b18f1800b28f1000b08f57 +:10da60000800e0032000bd271c00bf8f21900000ac +:10da7000211040021400b18f1800b28f1000b08f37 +:10da80000800e0032000bd2700a0023c8000438c7a +:10da9000020002242400621080bf023c80bf023cce +:10daa00080bf053c80bf043c0060428c3060a524f0 +:10dab0001060842400804230050040142190c00092 +:10dac0000080033480bf023c086043ac2190c0005a +:10dad0000000828c0100423009004014a0000224a2 +:10dae000bc76400b00000000050040100000000064 +:10daf0000000838c01006330fbff6010ffff4224b5 +:10db00000000828c01004230d0ff40542390d200ac +:10db10000000a28cffff52260c004012000002a25f +:10db2000b476400b0100102640684224dbff401011 +:10db300080bf023c80bf053c80bf043c0068428c33 +:10db40003068a524ad76400b106884249376400b92 +:04db50002390d2004c +:020000040000fa +:020000041d01dc +:10db5400211080005600c0100c00ca2c4d00401546 +:10db64002618a40003006330233804002900601041 +:10db74000300e7300600e0102330c7000000a3983c +:10db84000300a3882128a700000083b82120870070 +:10db94000f00c3302338c3001100e01021306000af +:10dba4002138e5000000a3980300a3880400a89886 +:10dbb4000700a8880800a9980b00a9880c00aa9857 +:10dbc4000f00aa88000083ac040088ac080089ac6c +:10dbd4001000a52410008424f2ffa714fcff8aacd3 +:10dbe4000300c3302338c3002a00e0102130600052 +:10dbf4002138e5000000a3980300a3880400a524ad +:10dc040004008424fbffa714fcff83ac2100001054 +:10dc1400000000000500e0102330c7000000a398b6 +:10dc24002128a700000083b8212087000f00c330fb +:10dc34002338c3000d00e010213060002138e500d6 +:10dc44000000a38c0400a88c0800a98c0c00aa8cea +:10dc5400000083ac040088ac080089ac1000a52443 +:10dc640010008424f6ffa714fcff8aac0300c33021 +:10dc74002338c3000700e010213060002138e5009c +:10dc84000000a38c0400a52404008424fcffa71432 +:10dc9400fcff83ac0600c0102138c5000000a3902f +:10dca4000100a52401008424fcffa714ffff83a026 +:10dcb4000800e0030000000000008a9021108000aa +:10dcc40003004015000000000800e00300000224e7 +:10dcd40001008a9003004015000000000800e003e2 +:10dce4000100022402008a90030040150000000095 +:10dcf4000800e0030200022403008a900300401598 +:10dd0400822004000800e0030300022401008424ac +:10dd14008020040000008a8c0101093c010129359e +:10dd2400c07909002340490124400f010600001175 +:10dd340024600a01040088110000000000008a9099 +:10dd4400220000100000842404008b8c234069010d +:10dd540024400f010600001124600b010400881107 +:10dd64000000000004008a901800001004008424bd +:10dd740008008a8c2340490124400f010600001149 +:10dd840024600a01040088110000000008008a9041 +:10dd94000e000010080084240c008b8c23406901c1 +:10dda40024400f010600001124600b0104008811b7 +:10ddb400000000000c008a90040000100c00842471 +:10ddc40010008a8cd7ff0010100084240400401532 +:10ddd40000000000000084240800e00323108200f7 +:10dde40001008a9004004015000000000100842412 +:10ddf4000800e0032310820002008a90040040150a +:10de040000000000020084240800e00323108200c4 +:10de140003008a90030084240800e0032310820096 +:020000040000fa +:020000041d01dc +:10de24000c00a294e0ffbd27020043301400b0af01 +:10de34001c00bfaf1800b1af2b0060102180a00000 +:10de4400000243301c0060100400a38c0002423422 +:10de54000c00a2a41d006010ff0091300a000424ed +:10de640028002412800042301000028e3e0062100e +:10de7400010063240000028e01004424040003ae68 +:10de8400000051a00100032400a0023c000004aee5 +:10de9400280143a00a000224210022520c00029609 +:10dea4001c00bf8f211020021400b08f1800b18f06 +:10deb4000800e0032000bd270b0060140002423478 +:10dec4000c00a2a4ff009130211800000800048e69 +:10ded400000004ae0a000424e4ff24561000028e5d +:10dee400c277400b800042301c00bf8fffff11241b +:10def400211020021400b08f1800b18f0800e00335 +:10df04002000bd27d9ff40541000028e0d000424c8 +:10df14008977400f212800029b77400b0400038e71 +:10df240000014230dfff40101c00bf8f0e0004963a +:10df34000800058efd7a400f0400068e0400038e4f +:10df4400060043500800028e0c000296ffff1124c5 +:10df5400300042340c0002a60800028e040000ae19 +:10df6400a977400b000002ae2024117ce077400f1b +:0cdf740021280002a977400b2188400002 +:020000040000fa +:020000041d01dc +:10df80000c00a294e8ffbd27400043301000b0af62 +:10df90001400bfaf2180a0001c0060141800a4a3cf +:10dfa000020043303d006050300042341000a38c2a +:10dfb0001b0060500e00a4940800a58c2d00a050fa +:10dfc00000a0053c0400068efd7a400f0e0004966a +:10dfd000ffff02240800038e040002ae1800a29383 +:10dfe000000062a01800a28301006324000003aeb9 +:10dff0000a000324130043500c0003961400bf8f43 +:10e000001000b08f0800e0031800bd271400bf8f78 +:10e010002014047c1000b08f0800e0031800bd2716 +:10e0200001000624fd7a400f1800a5271400bf8fb9 +:10e030001800a283040000ae1000b08f0800e003b7 +:10e040001800bd2700016330edff60101400bf8f82 +:10e050000e0004960800058efd7a400f0400068e1f +:10e060000800038e1800a283040000aeff77400b67 +:10e07000000003ae2835a524200003240800423404 +:10e08000080005ae000005ae100003ae040003aeac +:10e090000c0002a6f277400b200006240c00a2a47c +:0ce0a0000400a0acff77400bffff02243f +:020000040000fa +:020000041d01dc +:10e0ac000c008394e0ffbd271000b0af01000224e8 +:10e0bc0021808000110064301c00bfaf1800b2af8b +:10e0cc00300082141400b1af00026230180040140a +:10e0dc000400028efffd63300c0003a61a0011240d +:10e0ec000d00122418004018ffff44240000028e7b +:10e0fc00040004ae0100442400004290000004ae71 +:10e10c0080006430050080141c00bf8f1500515036 +:10e11c000800028e0a0052500400028e1800b28fc2 +:10e12c001400b18f1000b08f0800e0032000bd2751 +:10e13c0014004014211000003978400bfffd6330af +:10e14c00eaff401cffff4424400062300d004014e5 +:10e15c0021200002b575400f000000004378400bf1 +:10e16c000c000396080040101c00bf8f0400048ea6 +:10e17c000000028e01008424ffff4224040004ae40 +:10e18c00000002ae1c00bf8f100063340c0003a60d +:10e19c00ffff02241800b28f1400b18f1000b08f53 +:08e1ac000800e0032000bd277c +:020000040000fa +:020000041d01dc +:10e1b4000020202020202020202028282828282053 +:10e1c400202020202020202020202020202020204b +:10e1d40020801010101010101010101010101010bb +:10e1e40010040404040404040404041010101010a3 +:10e1f400101041414141414101010101010101016d +:10e2040001010101010101010101010110101010be +:10e21400101042424242424202020202020202023e +:10e224000202020202020202020202021010101092 +:10e2340020000000000000000000000000000000ba +:10e2440000000000000000000000000000000000ca +:10e2540000000000000000000000000000000000ba +:10e2640000000000000000000000000000000000aa +:10e27400000000000000000000000000000000009a +:10e28400000000000000000000000000000000008a +:10e29400000000000000000000000000000000007a +:10e2a400000000000000000000000000000000006a +:10e2b400000000000009121b242d363f48415a5328 +:10e2c4006c657e7719100b023d342f265158434a52 +:10e2d400757c676e323b2029161f040d7a736861c2 +:10e2e4005e574c452b2239300f061d14636a717832 +:10e2f400474e555c646d767f4049525b2c253e3712 +:10e3040008011a137d746f6659504b42353c272e11 +:10e314001118030a565f444d727b60691e170c0581 +:10e324003a3328214f465d546b627970070e151cf1 +:10e33400232a31384148535a656c777e09001b12f1 +:10e344002d243f3658514a437c756e671019020bd1 +:10e35400343d262f737a6168575e454c3b32292041 +:10e364001f160d046a6378714e475c55222b3039b1 +:10e37400060f141d252c373e0108131a6d647f7691 +:10e3840049405b523c352e2718110a03747d666f91 +:10e394005059424b171e050c333a21285f564d4401 +:10e3a4007b7269600e071c152a233831464f545d71 +:04e3b400626b7079af +:020000040000fa +:020000041d01dc +:10e3b800e0ffbd27040002241800b0af1c00bfaf67 +:10e3c8001c00c21021808000000102240300c2103a +:10e3d800000000001300c0141c00bf8f2800a050cc +:10e3e8000800058e0c000296080042340c0002a6b4 +:10e3f8000c000296080005aefbfe42302530c20034 +:10e40800100007ae0c0006a6040000ae21100000a4 +:10e418001c00bf8f1800b08f0800e0032000bd2744 +:10e428001c00bf8fffff02241800b08f0800e00314 +:10e438002000bd270c008294080042300700405499 +:10e448000c0002960800848c040080500c00029690 +:10e45800357e400f000000000c000296000000ae60 +:10e46800f7fe4230040042340c0002a6080000ae59 +:10e47800100000ae040000ae0679400b2110000029 +:10e488000300a01000000000fe78400b1000078e6b +:10e49800df7c400f1000a6af21284000e0ff4010ad +:0ce4a8001000a68ffe78400b2000072417 +:020000040000fa +:020000041d01dc +:10e4b800286e756c6c2900003031323334353637ac +:10e4c8003839414243444546000000003031323378 +:10e4d8003435363738396162636465660000000098 +:10e4e80001000000000000000a0000000000000019 +:10e4f8006400000000000000e803000000000000c5 +:10e508001027000000000000a086010000000000a5 +:10e5180040420f00000000008096980000000000b4 +:10e5280000e1f5050000000000ca9a3b0000000069 +:10e5380000e40b540200000000e8764817000000d1 +:10e548000010a5d4e800000000a0724e18090000d1 +:10e5580000407a10f35a00000080c6a47e8d0300a4 +:10e568000000c16ff286230000008a5d78456301d0 +:10e57800000064a7b3b6e00d0000e8890423c78a49 +:10e588000000803f000020410000003f5f7089408c +:020000040000fa +:020000041d01dc +:10e59800a8ffbd270400a1af0800a2af0c00a3afdd +:10e5a8001000a4af1400a5af1800a6af1c00a7afb9 +:10e5b8002000a8af2400a9af2800aaaf2c00abaf59 +:10e5c8003000acaf3400adaf3800aeaf3c00afaff9 +:10e5d8004000b8af4400b9af4800bfaf12400000d8 +:10e5e8004c00a8af104000005000a8af029d1a3c94 +:10e5f800d0f25a270000000000680440006005407f +:10e6080009f84003000000005000a88f1100000125 +:10e618004c00a88f130000010400a18f0800a28fee +:10e628000c00a38f1000a48f1400a58f1800a68fcc +:10e638001c00a78f2000a88f2400a98f2800aa8f6c +:10e648002c00ab8f3000ac8f3400ad8f3800ae8f0c +:10e658003c00af8f4000b88f4400b98f4800bf8f8f +:0ce668005800bd27c00000001800004250 +:020000040000fa +:020000041d01dc +:10e67400e0ffbd271c00bfaf1800b2af1400b1af5c +:10e684001000b0af2700a010211080002020a4703b +:10e694002000112423802402403005002718100094 +:10e6a40004306600061802022518c3000628050275 +:10e6b400200006320a286600042082000100a334e8 +:10e6c4000b2864001b7d400f2120a0000f001112b5 +:10e6d400219040001f0002240f00021201000424b4 +:10e6e400847c400f04200402212840001474400f4d +:10e6f400212040021c00bf8f1800b28f1400b18f7c +:10e704001000b08f0800e0032000bd27029d023cea +:10e71400bc79400b3cf9458c029d023cbc79400b12 +:10e7240040f9458c1b7d400f000000001c00bf8f8a +:10e734001800b28f1400b18f1000b08f0800e003ee +:04e744002000bd27cd +:020000040000fa +:020000041d01dc +:10e7480053504920466c61736820636f6e66696731 +:10e7580075726564000000004552524f523a2053ca +:10e76800504920466c617368206e6f74206465742c +:10e778006563746564000000466c61736820737497 +:10e7880061747573207265676973746572203a20c5 +:10e79800307825780a00000053504920466c617390 +:10e7a8006820646574656374696f6e204641494cde +:10e7b80045442e202056656e646f723a20307825c5 +:10e7c800782c20436869702049443a2030782578ad +:10e7d8000a00000053504920466c61736820646544 +:10e7e8007465637465642e202056656e646f723a92 +:10e7f80020307825782c20436869702049443a20d5 +:08e80800307825780a000000b9 +:020000040000fa +:020000041d01dc +:10e81000e0ffbd271800b0af00a0103c4835028ec5 +:10e82000100040101c00bfaf1b00801821184400ce +:10e830002b206200110080141c00bf8f00a0043c3c +:10e840004401848c2b2083000d00805400a0023ce6 +:10e850001c00bf8f483503ae1800b08f0800e003de +:10e860002000bd275075400f1000a4af4835028e20 +:10e87000edff40141000a48f1c00bf8f00a0023ccd +:10e880000c0003243c0143ac1800b08fffff0224ae +:10e890000800e0032000bd272b2043000500801462 +:10e8a00000a0043c4001848c2b206400e9ff801010 +:10e8b0001c00bf8f1c00bf8f00a0023c1600032469 +:10e8c0003c0143ac1800b08fffff02240800e003b6 +:04e8d0002000bd2740 +:020000040000fa +:020000041d01dc +:10e8d400211080002600c0101000ca2c1f00401513 +:10e8e400ff00a530005205002528aa0000540500a9 +:10e8f4002528aa00030083300500601004000724c3 +:10e904002338e3002330c700000085b821208700a6 +:10e914000f00c3302338c3000800e010213060002a +:10e924002138e400000085ac040085ac080085ac07 +:10e9340010008424fbff8714fcff85ac0300c33064 +:10e944002338c3000500e010213060002138e400c2 +:10e9540004008424feff8714fcff85ac0400c0106f +:10e964002138c40001008424feff8714ffff85a022 +:08e974000800e00300000000b0 +:020000040000fa +:020000041d01dc +:10e97c00200002240900052400008380feff625061 +:10e98c0001008424030065542d000224617a400b9d +:10e99c0001008424190062102b0002241b00625019 +:10e9ac000100842421380000029d063cb4e1c624f9 +:10e9bc002110c30001004290040042300c004010b2 +:10e9cc002110000040280200c01002002110a200fb +:10e9dc000100842421104300000083802128c300ff +:10e9ec000100a5900400a530f6ffa014d0ff42242e +:10e9fc00231802000800e0030b10670001008424b8 +:10ea0c00000083806d7a400b010007240000838096 +:08ea1c006d7a400b2138000067 +:020000040000fa +:020000041d01dc +:10ea2400e0ffbd271800b0af029d103cb4e11026f2 +:10ea340021189000010063901c00bfaf04006730f0 +:10ea44000900e01021108000d0ff82242a2845000c +:10ea54001100a0101c00bf8fff0042301800b08fbf +:10ea64000800e0032000bd27010067300400e050e7 +:10ea7400030063300c00c014000000000300633086 +:10ea840004006010a9ff42242a284500f2ffa014c4 +:10ea94001c00bf8f1c00bf8fff0002241800b08f22 +:10eaa4000800e0032000bd27ac7d400f1000a5af97 +:10eab4002180500001000392a07a400b1000a58f22 +:020000040000fa +:020000041d01dc +:10eac400feff082440300400403805002548c700f4 +:10ead4001b0020110000000000ff013c0100213454 +:10eae4002b08c1001a0020100000000000ff013ca8 +:10eaf400010021342b08e100150020100000000063 +:10eb04000200810442300600233006000200a10402 +:10eb140042380700233807002a08c70003002010e2 +:10eb24000000000007000010ffff02242a08e6008e +:10eb34000300201000000000020000100100022465 +:10eb4400000002240800e0030000000000000000b0 +:0ceb5400fcff001025100800000000006d +:020000040000fa +:020000041d01dc +:10eb60000c008294e8ffbd271000b0af0100032421 +:10eb70002180800001024430170083101400bfafd1 +:10eb80000202423002020324060043500800058eb0 +:10eb9000211000001400bf8f1000b08f0800e003a8 +:10eba0001800bd27fbffa010211000000400068ef6 +:10ebb000f9ffc0101400bf8ffd7a400f0e000496bd +:10ebc0000400038e040043100c000296300042340f +:10ebd000ffff42300c0002a60800048e20004330e4 +:10ebe000ffff0224040000ae000004aee57a400bf3 +:04ebf0000a10030004 +:020000040000fa +:020000041d01dc +:10ebf400e0ffbd271c00bfaf1200a0101800b0af8b +:10ec04001000c0100300842c060080140000023c95 +:10ec14001c00bf8f2110c0001800b08f0800e00353 +:10ec24002000bd27000042240b0040102120a0003a +:10ec34002128c0000000000c1400a6af057b400b87 +:10ec44001400a68f1c00bf8f211000001800b08f85 +:10ec54000800e0032000bd272180a6000000a48056 +:10ec64000100a5241000a5afd865400f1400a6af7d +:10ec74001000a58ff9ffb0141400a68f067b400b7b +:04ec84001c00bf8f22 +:020000040000fa +:020000041d01dc +:10ec8800c2350400ff00c630ffffc924fe00212d55 +:10ec98000b0020100000000082ffc6247f80013c8a +:10eca800ffff213424208100003f013c2520810002 +:10ecb8000000a6ac251004000800e00300000000d6 +:10ecc8000d00c0140000000021488400f8ff201146 +:10ecd80000000000403a04002040e8702330c800db +:10ece800043807010080013c24208100024a070003 +:10ecf800e9ff001025208900c0ff043cecff00104c +:08ed08000000062400000000d9 +:020000040000fa +:020000041d01dc +:10ed1000c8ffbd273400bfaf3000beaf21f0a00355 +:10ed20003800c4af2d70400f000000001400c2274f +:10ed300021204000212800001c000624357a400fc5 +:10ed4000000000003800c28f0000428c1400c2afe7 +:10ed50001400c227212040003e11400f0000000097 +:10ed60001000c2a31000c283030040100000000086 +:10ed70005c7b400b0000000021e8c0033400bf8f23 +:10ed80003000be8f3800bd270800e00300000000ff +:020000040000fa +:020000041d01dc +:10ed9000002a04000080013c2528a100c23d040097 +:10eda000ff00e7309e0006242330c7000d00c01886 +:10edb000000000002000c128030020140000000013 +:10edc0000500001000000224020081040628c5008e +:10edd00023280500251005000800e00300000000be +:10ede00000000000807f013c010021342b088100dd +:10edf0000300201400000000f7ff00100080023c18 +:10ee0000ff7f023cf4ff0010ffff423400000000cf +:020000040000fa +:020000041d01dc +:10ee1000002a04000080013c2528a100c23d040016 +:10ee2000ff00e7309e0006242330c7000d00c00419 +:10ee3000000000002000c128030020140000000092 +:10ee40000500001000000224020081040628c5000d +:10ee500023280500251005000800e003000000003d +:10ee600000000000807f013c010021342b0881005c +:10ee70000300201400000000f7ff00100080023c97 +:0cee8000f5ff0010ffff0224000000005e +:020000040000fa +:020000041d01dc +:10ee8c00e8ffbd271400bfaf3f7e400f000000001d +:10ee9c0088bf023c0030438c0003637c0800601484 +:10eeac0099aa033c0010042488bf033c083064acce +:10eebc000030438c00086330fdff601499aa033cba +:10eecc0081bf023c5566632430f240ac30f243ac57 +:10eedc006655033caa99633430f243ac81bf023cc3 +:10eeec000100032418f643ac81bf023c10f6428c9f +:08eefc00bf7b400b0000000089 +:020000040000fa +:020000041d01dc +:10ef0400e0ffbd271800b2af1400b1af1000b0afde +:10ef14001c00bfaf218080002188a000ce7b400b65 +:10ef2400ffff12248977400f000000000b005210ed +:10ef3400010010260000028221282002f9ff40145b +:10ef4400212040001c00bf8f1800b28f1400b18f25 +:10ef54001000b08f0800e0032000bd271c00bf8f05 +:10ef6400ffff02241800b28f1400b18f1000b08f7d +:08ef74000800e0032000bd27a6 +:020000040000fa +:020000041d01dc +:10ef7c001b00c01021100000000082801100401006 +:10ef8c000000a38012004314ffffc624ee7b400b4d +:10ef9c00ffff072400008280090040100100a52417 +:10efac000000a3800b004314ff004230ffffc62477 +:10efbc00f8ffc714010084240800e00321100000ae +:10efcc000000a380ff0063300800e003231043001f +:10efdc00ff004230ff0063300800e00323104300c1 +:08efec000800e0030000000032 +:020000040000fa +:020000041d01dc +:10eff400ffff032403008314211080000800e003b2 +:10f00400000000000c00a4940100032401028430d9 +:10f01400030083500800a68c0800e003ffff0224cd +:10f02400f6ffc050ffff02240400a48c1000a38c40 +:10f03400f2ff8350ffff02240000a38c0600c310dc +:10f04400010084240400a4acffff64240000a4ace9 +:10f054000800e003ffff62a001006324137c400b5f +:04f064000000a3ac59 +:020000040000fa +:020000041d01dc +:10f06800f8ffbd270400beaf21f0a00321188000df +:10f078002110a0000800c3a30c00c2a30c00c39376 +:10f0880080bf023c305a43ac0800c39380bf023ca7 +:10f09800205a43ac0000000080bf023c105a428c4a +:10f0a80001004230fcff40100000000080bf023c1d +:10f0b800205a428c0800c2a30800c29321e8c0036a +:10f0c8000400be8f0800bd270800e0030000000010 +:10f0d800f8ffbd270400beaf21f0a00388bf033ca2 +:10f0e8006060628c0400027c606062ac21e8c0034e +:10f0f8000400be8f0800bd270800e00300000000e0 +:10f10800f8ffbd270400beaf21f0a00388bf033c71 +:10f118006060628c010004240400827c606062ac40 +:10f128000100022421e8c0030400be8f0800bd27a7 +:08f138000800e00300000000e4 +:020000040000fa +:020000041d01dc +:10f14000d0ffbd273800a2273800a6af1000a2af1d +:10f1500021304000ff7f02242800b0af2400a2af7e +:10f1600021808000c20002241400a4272c00bfaf1d +:10f170001400b0af1c00b0af3c00a7af1800a0afa8 +:10f180009a31400f2000a2a71400a28f000040a0d7 +:10f190001400a28f2c00bf8f231050002800b08fc6 +:08f1a0000800e0033000bd2768 +:020000040000fa +:020000041d01dc +:10f1a8000000803f000020410000c84200007a446f +:10f1b80000401c460050c347002474498096184bf1 +:10f1c80020bcbe4c286b6e4ef9021550ec78ad6031 +:10f1d800caf249710000803fcdcccc3d0ad7233c10 +:10f1e8006f12833a17b7d138acc52737bd37863584 +:10f1f80095bfd63377cc2b325f708930ffe6db2e94 +:08f2080008e53c1e6042a20d66 +:020000040000fa +:020000041d01dc +:10f210000080013c12008010243081000200810433 +:10f2200000000000232004009e0005242038877081 +:10f230002328a7000420e400800084248000882c78 +:10f240002128a8000342040001000831232088007f +:10f250004020040042220400c0450500252088000b +:10f26000251086000800e0030000000000000000f8 +:020000040000fa +:020000041d01dc +:10f27000e0ffbd271400b0af029d103c1800b1aff5 +:10f280001c00bfaf00a0113cb4e110262b78400f4a +:10f290007835248e211802020100638088006330d3 +:10f2a000faff6014ffff03240400431000a0033c96 +:10f2b0007835658cfd7b400f212040001c00bf8ffe +:10f2c0001800b18f1400b08f0800e0032000bd27a4 +:020000040000fa +:020000041d01dc +:10f2d000e0ffbd271c00bfaf1800beaf21f0a003a8 +:10f2e000004802401000c2af006802401f004230d8 +:10f2f000d88082af00700240e08082af006003409f +:10f30000ff0f023cfeff4234241062000060824086 +:10f31000c00000004000000040000000400000006d +:08f32000a37b400f0000000078 +:020000040000fa +:020000041d01dc +:10f32800c8ffbd274000a3273400bfaf4000a6afe9 +:10f338004400a7af1000a3af1400a4af1c00a4aff3 +:10f348002f77400f2800a5af1000a68f2800a58fa3 +:10f358001800a2af2400a2af1400a427c100022401 +:10f36800315b400f2000a2a73400bf8f0800e003e4 +:04f378003800bd2775 +:020000040000fa +:020000041d01dc +:10f37c0000a0033c7435628ce8ffbd270d004010e3 +:10f38c001400bfaf0000448c743564acffff032441 +:10f39c00030043101400bf8f0800e0031800bd27c2 +:10f3ac00e966042400a0033c3c0164ac0800e003c3 +:10f3bc001800bd27f47c400f20000424e77c400b90 +:04f3cc00ffff032418 +:020000040000fa +:020000041d01dc +:10f3d000e0ffbd271800b1af1400b0af1c00bfaff5 +:10f3e000047a400f218880000700201a2180400005 +:10f3f000ffff022404000212212000022128000045 +:10f40000357a400f213020021c00bf8f21100002ee +:10f410001800b18f1400b08f0800e0032000bd2752 +:020000040000fa +:020000041d01dc +:10f420000000043ce8ffbd27000084240300801096 +:10f430001400bfaf09f88000000000000000843015 +:10f440000000a530c064400f000000000000023c36 +:10f4500000004224030040100000000009f84000b2 +:0cf4600000000000f9ff00100000000098 +:020000040000fa +:020000041d01dc +:10f46c00e8ffbd271400bfaf060080042110800008 +:10f47c00847c400f000000001400bf8f0800e003e4 +:10f48c001800bd270100423042200400847c400f4c +:10f49c0025208200212040003d71400f2128400092 +:0cf4ac001400bf8f0800e0031800bd270b +:020000040000fa +:020000041d01dc +:10f4b8000000023ce8ffbd2700004224060040107f +:10f4c8001400bfaf0000023c0000422403004010bb +:10f4d800029d023c3f000070029d023c00f5422460 +:10f4e800030040100000000009f840000000000080 +:08f4f8003e7d400b0000000006 +:020000040000fa +:020000041d01dc +:10f5000000606041c000000099aa033c81bf023c3a +:10f510005566632430f240ac30f243ac6655033c90 +:10f52000aa99633430f243ac81bf023c010003244a +:10f5300018f643ac81bf023c10f6428c427d400b72 +:04f5400000000000c7 +:020000040000fa +:020000041d01dc +:10f54400e0ffbd271400b0af00a0103c60330526d7 +:10f554001c00bfafc17b400f1800b1af603305265c +:10f564000a0004248977400f218840001c00bf8fc3 +:10f57400211020021400b08f1800b18f0800e0039e +:04f584002000bd277f +:020000040000fa +:020000041d01dc +:10f58800e0ffbd272400a2272118800000a0043c2a +:10f598002400a5af2800a6af60338424212860008a +:10f5a800213040001c00bfaf2c00a7af9a31400f9c +:10f5b8001000a2af1c00bf8f0800e0032000bd2789 +:020000040000fa +:020000041d01dc +:10f5c8000000023c00004224050040100000023cfc +:10f5d8000000422403004010029d023c3f000070de +:10f5e800029d023c00f54224fdff4010000000008f +:08f5f80009f8400000000000ca +:020000040000fa +:020000041d01dc +:10f60000006803408000023c2510620000688240d0 +:10f61000040080100010032488bf023c0800e003af +:10f62000041043ac88bf023c0800e003081043ac60 +:020000040000fa +:020000041d01dc +:10f630000900801000a0023c2c01438cf8ff8424b8 +:10f640002b188300010060542c0144ac040082900c +:10f65000fe004230040082a00800e0030000000029 +:020000040000fa +:020000041d01dc +:10f6600000a0033c4c35622401000424080044ac93 +:10f6700000a0043c803584244c3564ac0000033c7d +:0cf68000000263240800e003040043ac17 +:020000040000fa +:020000041d01dc +:10f68c004a462e636f6d00004368616c6574447567 +:10f69c00696e6f20563220496e697469616c697aa3 +:04f6ac006564000091 +:020000040000fa +:020000041d01dc +:10f6b000029d033cb4e163242118830021108000e3 +:10f6c0000100649020004324010084300800e0031e +:04f6d0000b106400b7 +:020000040000fa +:020000041d01dc +:10f6d400029d023cb4e142242110820001004290c8 +:10f6e400e0ff8324020042300b2062000800e003a4 +:04f6f4002110800061 +:020000040000fa +:020000041d01dc +:10f6f800f8ffbd270400beaf21f0a00321e8c00336 +:10f708000400be8f0800bd270800e00300000000c9 +:020000040000fa +:020000041d01dc +:10f718005052494e544600005258204649464f2000 +:0cf728004f766572666c6f770000000081 +:020000040000fa +:020000041d01dc +:10f734000100843003008014000000000800e0038e +:0cf74400006060410800e00320606041ac +:020000040000fa +:020000041d01dc +:10f750000300a01021300000ee78400b20000724a9 +:0cf7600004000624ee78400b2138000065 +:020000040000fa +:020000041d01dc +:10f76c004a462e636f6d000000c07f443d0a57402f +:08f77c000000304100007a4456 +:020000040000fa +:020000041d01dc +:10f78400f8ff022400800340241062000200423487 +:08f794000800e0030080824040 +:020000040000fa +:020000041d01dc +:10f79c00f8ff02240080034024106200030042346e +:08f7ac000800e0030080824028 +:020000040000fa +:020000041d01dc +:10f7b40000601a40bfff1b3cffff7b3724d05b0374 +:08f7c40000609a4018000042a9 +:020000040000fa +:020000041d01dc +:10f7cc00029d023cb4e1422421104400010042900d +:08f7dc000800e00307004230c1 +:020000040000fa +:020000041d01dc +:10f7e400029d023cb4e142242110440001004290f5 +:08f7f4000800e00303004230ad +:020000040000fa +:020000041d01dc +:10f7fc00029d023cb4e142242110440001004290dd +:08f80c000800e0032000423077 +:020000040000fa +:020000041d01dc +:10f81400029d023cb4e142242110440001004290c4 +:08f824000800e003040042307b +:020000040000fa +:020000041d01dc +:10f82c00029d023cb4e142242110440001004290ac +:08f83c000800e0031700423050 +:020000040000fa +:020000041d01dc +:10f84400029d023cb4e14224211044000100429094 +:08f854000800e003020042304d +:020000040000fa +:020000041d01dc +:10f85c00029d023cb4e1422421104400010042808c +:08f86c000800e00397004230a0 +:020000040000fa +:020000041d01dc +:10f87400029d023cb4e14224211044000100429064 +:08f884000800e003100042300f +:020000040000fa +:020000041d01dc +:10f88c00029d023cb4e1422421104400010042805c +:08f89c000800e003880042307f +:020000040000fa +:020000041d01dc +:10f8a400029d023cb4e14224211044000100429034 +:08f8b4000800e00301004230ee +:020000040000fa +:020000041d01dc +:10f8bc00029d023cb4e1422421104400010042901c +:08f8cc000800e0034400423093 +:020000040000fa +:020000041d01dc +:10f8d40000a0023c7435438c743544ac0800e0034a +:04f8e400000083acf1 +:020000040000fa +:020000041d01dc +:0cf8e8005541525431204f45525200004f +:020000040000fa +:020000041d01dc +:08f8f4000800e00320606241fe +:020000040000fa +:020000041d01dc +:08f8fc000800e0030060624116 +:020000040000fa +:020000041d01dc +:08f904000800e0030000000010 +:020000040000fa +:020000041d01dc +:08f90c000800e0030000000008 +:020000040000fa +:020000041d01dc +:08f914000800e0038000822cd2 +:020000040000fa +:020000041d01dc +:08f91c000800e0037f008230c7 +:020000040000fa +:020000041d01dc +:08f924000800e003200082242a +:020000040000fa +:020000041d01dc +:08f92c000800e003e0ff822463 +:020000040000fa +:020000041d01dc +:08f934000800e003800002243a +:020000040000fa +:020000041d01dc +:08f93c000000804f0000004fa5 +:00000001FF diff --git a/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.map b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.map new file mode 100644 index 0000000..7958051 --- /dev/null +++ b/ChaloupeLora.X/dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.map @@ -0,0 +1,4899 @@ +Archive member included because of file (symbol) + +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + build/ChaletDuino_775F512H_/production/Source/exceptions.o (SoftReset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + build/ChaletDuino_775F512H_/production/Source/main.o (CheKseg0CacheOn) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + build/ChaletDuino_775F512H_/production/Source/main.o (INTConfigureSystem) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + build/ChaletDuino_775F512H_/production/Source/main.o (INTEnableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + build/ChaletDuino_775F512H_/production/Source/main.o (INTDisableInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + build/ChaletDuino_775F512H_/production/Source/main.o (INTRestoreInterrupts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o (memcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o (memset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + build/ChaletDuino_775F512H_/production/Source/Terminal.o (strcpy) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + build/ChaletDuino_775F512H_/production/Source/Terminal.o (strlen) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_bootstrap_exception_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_reset) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_on_bootstrap) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_nmi_handler) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o (_general_exception_context) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_0) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_1) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_2) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_5) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_6) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_7) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_8) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_9) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_10) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_11) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_12) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_13) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_14) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_15) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_16) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_17) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_18) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_19) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_20) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_21) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_22) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_23) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_25) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_26) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_27) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_28) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_29) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_30) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_31) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_33) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_34) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_35) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_36) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_37) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_38) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_39) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_40) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_41) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_42) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_43) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_44) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_45) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_46) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_47) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_48) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_49) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_50) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_51) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_52) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_53) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_54) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_55) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_56) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_57) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_58) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_59) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_60) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_61) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_62) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o (__vector_dispatch_63) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) (_DefaultInterrupt) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o (fpdiv) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o (fpmul) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o (fpadd) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o (fptosi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o (sitofp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + build/ChaletDuino_775F512H_/production/Source/Uart.o (_iob) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + build/ChaletDuino_775F512H_/production/Source/Uart.o (fflush) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o (malloc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + build/ChaletDuino_775F512H_/production/Source/InternalUart.o (puts) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + build/ChaletDuino_775F512H_/production/Source/Uart.o (setbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + build/ChaletDuino_775F512H_/production/Source/Terminal.o (strncmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o (_printf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) + build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o (_printf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + build/ChaletDuino_775F512H_/production/Source/Terminal.o (_sprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdnopuxX.eo) + build/ChaletDuino_775F512H_/production/Source/Util.o (_sprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + build/ChaletDuino_775F512H_/production/Source/Terminal.o (_sscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) (fputc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) (_bufallo) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) (errno) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) (_vfprintf_cdfFnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopsuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) (_vfprintf_cdnopsuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdnopuxX.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopuxX.eo) (_vfprintf_cdnopuxX) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) (_vfscanf_s) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) (_flsbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (fgetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (atoi) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (_ctype) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (tolower) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (_powers_f) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) (ungetc) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) (_filbuf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) (sbrk) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) (read) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) (write) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) (__XC_UART) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (fpcmp) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (frexpf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (fptoui) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (__floatdisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (__floatundisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (__udivdi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopuxX.eo) (__umoddi3) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) (__floatunsisf) +c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + (_vfprintf_cdfFnopsuxX) + +Allocating common symbols +Common symbol size file + +u8IsMacAddrValid 0x1 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +mTerminalOpened 0x4 build/ChaletDuino_775F512H_/production/Source/Terminal.o +TerminalDataPtr 0x4 build/ChaletDuino_775F512H_/production/Source/Terminal.o +gpfAppResolveCb 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +mTerminalPendingAction + 0x4 build/ChaletDuino_775F512H_/production/Source/Terminal.o +acIntUartRxBuff 0x2 build/ChaletDuino_775F512H_/production/Source/InternalUart.o +mBatteryCurrent 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +mVoltageMeanSum 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +mSPIFlashHighSpeedBaudrate + 0x1 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o +NetworkRxBuf 0x400 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +TerminalRxBuf 0x400 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +TerminalWorkString 0x12c build/ChaletDuino_775F512H_/production/Source/Terminal.o +gu16BufferSize 0x2 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +mWifiSPIBaudrate 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +PrintfRxBuf 0x400 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +mVoltageMeanCount 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +mBatterySOC 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +gpfAppSocketCb 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +mac_addr 0x6 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +mRxData 0x136 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o +mHelpStringPtr 0x4 build/ChaletDuino_775F512H_/production/Source/Terminal.o +addr_in 0x10 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +PowerRelayState 0x4 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o +param 0x1c build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +mModuleIPConfig 0x10 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +gsockerrno 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +astUartData 0x620 build/ChaletDuino_775F512H_/production/Source/Uart.o +mLastTransactionOK 0x4 build/ChaletDuino_775F512H_/production/Source/I2C.o +I2CSlaveBuffer 0xa build/ChaletDuino_775F512H_/production/Source/ina219.o +mSPIFlashBaudrate 0x1 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o +TerminalPrevDataBuf + 0x12c build/ChaletDuino_775F512H_/production/Source/Terminal.o +mTxData 0x136 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o +mBatteryVoltage 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +mI2CWaitCounter 0x4 build/ChaletDuino_775F512H_/production/Source/I2C.o +gastrSockets 0xb0 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +mCurrentModuleOK 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +at_sb_printf 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +mTerminalTickState 0x4 build/ChaletDuino_775F512H_/production/Source/Terminal.o +I2CMasterBuffer 0xa build/ChaletDuino_775F512H_/production/Source/ina219.o +gfpPingCb 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +mFlashSectorBuffer 0x1000 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o +gu8OpCode 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +astTimer 0xa8 build/ChaletDuino_775F512H_/production/Source/timer.o +TerminalDataBuf 0x12c build/ChaletDuino_775F512H_/production/Source/Terminal.o +astInternalUartData + 0x40 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + +Microchip PIC32 Memory-Usage Report + +kseg0 Program-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.text 0x9d003800 0x8e68 36456 App's exec code +.text._vfprintf_cdfFnop 0x9d00c668 0x13d4 5076 +.text 0x9d00da3c 0x8a08 35336 App's exec code +.dinit 0x9d016444 0x880 2176 +.text._vfscanf_s 0x9d016cc4 0x868 2152 +.text 0x9d01752c 0x37f8 14328 App's exec code +.rodata 0x9d01ad24 0x7c4 1988 Read-only const +.text 0x9d01b4e8 0xd64 3428 App's exec code +.text.scale 0x9d01c24c 0x2a0 672 +.text.fpsubadd 0x9d01c4ec 0x278 632 +.text.malloc 0x9d01c764 0x278 632 +.text.fp32div 0x9d01c9dc 0x230 560 +.text 0x9d01cc0c 0x224 548 App's exec code +.text.__floatdisf 0x9d01ce30 0x220 544 +.text.fp32mul 0x9d01d050 0x1bc 444 +.text 0x9d01d20c 0x1a0 416 App's exec code +.text.realloc 0x9d01d3ac 0x194 404 +.text._sbrk_init 0x9d01d540 0x194 404 +.text._filbuf 0x9d01d6d4 0x188 392 +.rodata 0x9d01d85c 0x184 388 Read-only const +.text.read 0x9d01d9e0 0x174 372 +.text 0x9d01db54 0x2d0 720 App's exec code +.text.fputc 0x9d01de24 0x15c 348 +.text._flsbuf 0x9d01df80 0x12c 300 +.text.fgetc 0x9d01e0ac 0x108 264 +.rodata 0x9d01e1b4 0x204 516 Read-only const +.text.setvbuf 0x9d01e3b8 0xfc 252 +.rodata 0x9d01e4b8 0xe0 224 Read-only const +.text.general_exception 0x9d01e598 0xdc 220 +.text 0x9d01e674 0xd4 212 App's exec code +.rodata 0x9d01e748 0xc8 200 Read-only const +.text._sbrk 0x9d01e810 0xc4 196 +.text 0x9d01e8d4 0xa8 168 App's exec code +.text.atoi 0x9d01e97c 0xa8 168 +.text.range 0x9d01ea24 0xa0 160 +.text.fpcmp 0x9d01eac4 0x9c 156 +.text.fflush 0x9d01eb60 0x94 148 +.text.write 0x9d01ebf4 0x94 148 +.text.libm 0x9d01ec88 0x88 136 +.text 0x9d01ed10 0x80 128 App's exec code +.text.fptoli 0x9d01ed90 0x80 128 +.text.fptoul 0x9d01ee10 0x7c 124 +.text.SoftReset 0x9d01ee8c 0x78 120 +.text.fputs 0x9d01ef04 0x78 120 +.text.strncmp 0x9d01ef7c 0x78 120 +.text.ungetc 0x9d01eff4 0x74 116 +.text 0x9d01f068 0xd8 216 App's exec code +.text._sprintf_cdfFnopu 0x9d01f140 0x68 104 +.rodata 0x9d01f1a8 0x68 104 Read-only const +.text.sitofp 0x9d01f210 0x60 96 +.text.wspace 0x9d01f270 0x60 96 +.text 0x9d01f2d0 0x58 88 App's exec code +.text._sscanf_s 0x9d01f328 0x54 84 +.text._bufallo 0x9d01f37c 0x54 84 +.text.sbrk 0x9d01f3d0 0x50 80 +.text.main_entry 0x9d01f420 0x4c 76 +.text 0x9d01f46c 0x4c 76 App's exec code +.text._bootstrap_except 0x9d01f4b8 0x48 72 +.text 0x9d01f500 0x44 68 App's exec code +.text.puts 0x9d01f544 0x44 68 +.text._printf_cdnopsuxX 0x9d01f588 0x40 64 +.vector_default 0x9d01f5c8 0x38 56 +.text.INTConfigureSyste 0x9d01f600 0x30 48 +.text.free 0x9d01f630 0x30 48 +.text._stub_sbd_memlayo 0x9d01f660 0x2c 44 +.rodata 0x9d01f68c 0x24 36 Read-only const +.text.tolower 0x9d01f6b0 0x24 36 +.text.toupper 0x9d01f6d4 0x24 36 +.text 0x9d01f6f8 0x20 32 App's exec code +.rodata 0x9d01f718 0x1c 28 Read-only const +.text.INTRestoreInterru 0x9d01f734 0x1c 28 +.text.setbuf 0x9d01f750 0x1c 28 +.rodata 0x9d01f76c 0x18 24 Read-only const +.text.CheKseg0CacheOff 0x9d01f784 0x18 24 +.text.CheKseg0CacheOn 0x9d01f79c 0x18 24 +.text 0x9d01f7b4 0x18 24 App's exec code +.text.isalnum 0x9d01f7cc 0x18 24 +.text.isalpha 0x9d01f7e4 0x18 24 +.text.iscntrl 0x9d01f7fc 0x18 24 +.text.isdigit 0x9d01f814 0x18 24 +.text.isgraph 0x9d01f82c 0x18 24 +.text.islower 0x9d01f844 0x18 24 +.text.isprint 0x9d01f85c 0x18 24 +.text.ispunct 0x9d01f874 0x18 24 +.text.isspace 0x9d01f88c 0x18 24 +.text.isupper 0x9d01f8a4 0x18 24 +.text.isxdigit 0x9d01f8bc 0x18 24 +.text._buffree 0x9d01f8d4 0x14 20 +.rodata 0x9d01f8e8 0xc 12 Read-only const +.text.INTEnableInterrup 0x9d01f8f4 0x8 8 +.text.INTDisableInterru 0x9d01f8fc 0x8 8 +.text._on_reset 0x9d01f904 0x8 8 +.text._on_bootstrap 0x9d01f90c 0x8 8 +.text.isascii 0x9d01f914 0x8 8 +.text.toascii 0x9d01f91c 0x8 8 +.text._tolower 0x9d01f924 0x8 8 +.text._toupper 0x9d01f92c 0x8 8 +.text.getpagesize 0x9d01f934 0x8 8 +.rodata 0x9d01f93c 0x8 8 Read-only const + Total kseg0_program_mem used : 0x1c140 115008 22.6% of 0x7c7ff + +kseg0 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- + Total kseg0_boot_mem used : 0 0 <1% of 0x7f0 + +Exception-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.app_excpt 0x9d002180 0x10 16 General-Exception +.vector_0 0x9d002200 0x8 8 Interrupt Vector 0 +.vector_1 0x9d002220 0x8 8 Interrupt Vector 1 +.vector_2 0x9d002240 0x8 8 Interrupt Vector 2 +.vector_3 0x9d002260 0x8 8 Interrupt Vector 3 +.vector_4 0x9d002280 0x8 8 Interrupt Vector 4 +.vector_5 0x9d0022a0 0x8 8 Interrupt Vector 5 +.vector_6 0x9d0022c0 0x8 8 Interrupt Vector 6 +.vector_7 0x9d0022e0 0x8 8 Interrupt Vector 7 +.vector_8 0x9d002300 0x8 8 Interrupt Vector 8 +.vector_9 0x9d002320 0x8 8 Interrupt Vector 9 +.vector_10 0x9d002340 0x8 8 Interrupt Vector 10 +.vector_11 0x9d002360 0x8 8 Interrupt Vector 11 +.vector_12 0x9d002380 0x8 8 Interrupt Vector 12 +.vector_13 0x9d0023a0 0x8 8 Interrupt Vector 13 +.vector_14 0x9d0023c0 0x8 8 Interrupt Vector 14 +.vector_15 0x9d0023e0 0x8 8 Interrupt Vector 15 +.vector_16 0x9d002400 0x8 8 Interrupt Vector 16 +.vector_17 0x9d002420 0x8 8 Interrupt Vector 17 +.vector_18 0x9d002440 0x8 8 Interrupt Vector 18 +.vector_19 0x9d002460 0x8 8 Interrupt Vector 19 +.vector_20 0x9d002480 0x8 8 Interrupt Vector 20 +.vector_21 0x9d0024a0 0x8 8 Interrupt Vector 21 +.vector_22 0x9d0024c0 0x8 8 Interrupt Vector 22 +.vector_23 0x9d0024e0 0x8 8 Interrupt Vector 23 +.vector_24 0x9d002500 0x8 8 Interrupt Vector 24 +.vector_25 0x9d002520 0x8 8 Interrupt Vector 25 +.vector_26 0x9d002540 0x8 8 Interrupt Vector 26 +.vector_27 0x9d002560 0x8 8 Interrupt Vector 27 +.vector_28 0x9d002580 0x8 8 Interrupt Vector 28 +.vector_29 0x9d0025a0 0x8 8 Interrupt Vector 29 +.vector_30 0x9d0025c0 0x8 8 Interrupt Vector 30 +.vector_31 0x9d0025e0 0x8 8 Interrupt Vector 31 +.vector_32 0x9d002600 0x8 8 Interrupt Vector 32 +.vector_33 0x9d002620 0x8 8 Interrupt Vector 33 +.vector_34 0x9d002640 0x8 8 Interrupt Vector 34 +.vector_35 0x9d002660 0x8 8 Interrupt Vector 35 +.vector_36 0x9d002680 0x8 8 Interrupt Vector 36 +.vector_37 0x9d0026a0 0x8 8 Interrupt Vector 37 +.vector_38 0x9d0026c0 0x8 8 Interrupt Vector 38 +.vector_39 0x9d0026e0 0x8 8 Interrupt Vector 39 +.vector_40 0x9d002700 0x8 8 Interrupt Vector 40 +.vector_41 0x9d002720 0x8 8 Interrupt Vector 41 +.vector_42 0x9d002740 0x8 8 Interrupt Vector 42 +.vector_43 0x9d002760 0x8 8 Interrupt Vector 43 +.vector_44 0x9d002780 0x8 8 Interrupt Vector 44 +.vector_45 0x9d0027a0 0x8 8 Interrupt Vector 45 +.vector_46 0x9d0027c0 0x8 8 Interrupt Vector 46 +.vector_47 0x9d0027e0 0x8 8 Interrupt Vector 47 +.vector_48 0x9d002800 0x8 8 Interrupt Vector 48 +.vector_49 0x9d002820 0x8 8 Interrupt Vector 49 +.vector_50 0x9d002840 0x8 8 Interrupt Vector 50 +.vector_51 0x9d002860 0x8 8 Interrupt Vector 51 +.vector_52 0x9d002880 0x8 8 Interrupt Vector 52 +.vector_53 0x9d0028a0 0x8 8 Interrupt Vector 53 +.vector_54 0x9d0028c0 0x8 8 Interrupt Vector 54 +.vector_55 0x9d0028e0 0x8 8 Interrupt Vector 55 +.vector_56 0x9d002900 0x8 8 Interrupt Vector 56 +.vector_57 0x9d002920 0x8 8 Interrupt Vector 57 +.vector_58 0x9d002940 0x8 8 Interrupt Vector 58 +.vector_59 0x9d002960 0x8 8 Interrupt Vector 59 +.vector_60 0x9d002980 0x8 8 Interrupt Vector 60 +.vector_61 0x9d0029a0 0x8 8 Interrupt Vector 61 +.vector_62 0x9d0029c0 0x8 8 Interrupt Vector 62 +.vector_63 0x9d0029e0 0x8 8 Interrupt Vector 63 + Total exception_mem used : 0x210 528 12.9% of 0x1000 + +kseg1 Boot-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.reset 0xbfc00000 0x1f0 496 Reset handler +.bev_excpt 0xbfc00380 0x10 16 BEV-Exception + Total kseg1_boot_mem used : 0x200 512 43.8% of 0x490 + -------------------------------------------------------------------------- + Total Program Memory used : 0x1c550 116048 22.4% of 0x7e47f + -------------------------------------------------------------------------- + + +kseg1 Data-Memory Usage +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +.eh_frame 0xa0000000 0x30 48 +.sdata 0xa0000030 0x54 84 Small init data +.sbss 0xa0000084 0x130 304 Small uninit data +.bss 0xa00001b4 0x2a00 10752 Uninitialized data +.bss 0xa0002bb4 0x400 1024 Uninitialized data +.data 0xa0002fb4 0x554 1364 Initialized data +.bss 0xa0003508 0x74 116 Uninitialized data + Total kseg1_data_mem used : 0x357c 13692 20.9% of 0x10000 + -------------------------------------------------------------------------- + Total Data Memory used : 0x357c 13692 20.9% of 0x10000 + -------------------------------------------------------------------------- + + +Dynamic Data-Memory Reservation +section address length [bytes] (dec) Description +------- ---------- ------------------------- ----------- +heap 0xa0003580 0x200 512 Reserved for heap +stack 0xa0003798 0xc858 51288 Reserved for stack + + -------------------------------------------------------------------------- + +Discarded input sections + + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/Uart.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/Util.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/main.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/system.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/template.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/timer.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/SPI.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/ina219.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/I2C.o + .reginfo 0x00000000 0x18 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .discard 0x00000000 0x100 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +Memory Configuration + +Name Origin Length Attributes +kseg0_program_mem 0x9d003800 0x0007c7ff xr +kseg0_boot_mem 0x9d003000 0x000007f0 +exception_mem 0x9d002000 0x00001000 +kseg1_boot_mem 0xbfc00000 0x00000490 +debug_exec_mem 0xbfc02000 0x00000ff0 +config3 0xbfc02ff0 0x00000004 +config2 0xbfc02ff4 0x00000004 +config1 0xbfc02ff8 0x00000004 +config0 0xbfc02ffc 0x00000004 +kseg1_data_mem 0xa0000000 0x00010000 w !x +sfrs 0xbf800000 0x00100000 +configsfrs 0xbfc02ff0 0x00000010 +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o +LOAD build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o +LOAD build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o +LOAD build/ChaletDuino_775F512H_/production/Source/DigitalIO.o +LOAD build/ChaletDuino_775F512H_/production/Source/InternalUart.o +LOAD build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o +LOAD build/ChaletDuino_775F512H_/production/Source/Terminal.o +LOAD build/ChaletDuino_775F512H_/production/Source/Uart.o +LOAD build/ChaletDuino_775F512H_/production/Source/Util.o +LOAD build/ChaletDuino_775F512H_/production/Source/exceptions.o +LOAD build/ChaletDuino_775F512H_/production/Source/interrupts.o +LOAD build/ChaletDuino_775F512H_/production/Source/main.o +LOAD build/ChaletDuino_775F512H_/production/Source/system.o +LOAD build/ChaletDuino_775F512H_/production/Source/template.o +LOAD build/ChaletDuino_775F512H_/production/Source/timer.o +LOAD build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o +LOAD build/ChaletDuino_775F512H_/production/Source/SPI.o +LOAD build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o +LOAD build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o +LOAD build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o +LOAD build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o +LOAD build/ChaletDuino_775F512H_/production/Source/ina219.o +LOAD build/ChaletDuino_775F512H_/production/Source/I2C.o +LOAD build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + 0x00000001 __MPLAB_BUILD = 0x1 + 0x00000200 _min_heap_size = 0x200 +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x00000400 PROVIDE (_min_stack_size, 0x400) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral.a +END GROUP +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a +END GROUP + 0x00000001 PROVIDE (_vector_spacing, 0x1) + 0x9d002000 _ebase_address = 0x9d002000 + 0xbfc00000 _RESET_ADDR = 0xbfc00000 + 0xbfc00380 _BEV_EXCPT_ADDR = 0xbfc00380 + 0xbfc00480 _DBG_EXCPT_ADDR = 0xbfc00480 + 0xbfc02000 _DBG_CODE_ADDR = 0xbfc02000 + 0x00000ff0 _DBG_CODE_SIZE = 0xff0 + 0x9d002180 _GEN_EXCPT_ADDR = (_ebase_address + 0x180) + +.config_BFC02FF0 + *(.config_BFC02FF0) + +.config_BFC02FF4 + 0xbfc02ff4 0x4 + *(.config_BFC02FF4) + .config_BFC02FF4 + 0xbfc02ff4 0x4 build/ChaletDuino_775F512H_/production/Source/main.o + +.config_BFC02FF8 + 0xbfc02ff8 0x4 + *(.config_BFC02FF8) + .config_BFC02FF8 + 0xbfc02ff8 0x4 build/ChaletDuino_775F512H_/production/Source/main.o + +.config_BFC02FFC + 0xbfc02ffc 0x4 + *(.config_BFC02FFC) + .config_BFC02FFC + 0xbfc02ffc 0x4 build/ChaletDuino_775F512H_/production/Source/main.o + 0xbfc02000 PROVIDE (_DBG_CODE_ADDR, 0xbfc02000) + 0x00000ff0 PROVIDE (_DBG_CODE_SIZE, 0xff0) + +.reset 0xbfc00000 0x1f0 + *(.reset) + .reset 0xbfc00000 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0xbfc00000 _reset + *(.reset.startup) + .reset.startup + 0xbfc00008 0x1e8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.bev_excpt 0xbfc00380 0x10 + *(.bev_handler) + .bev_handler 0xbfc00380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.dbg_excpt 0xbfc00480 0x0 + 0xbfc00480 . = (. + DEFINED (_DEBUGGER)?0x8:0x0) + +.dbg_code 0xbfc02000 0x0 + 0xbfc02000 . = (. + DEFINED (_DEBUGGER)?_DBG_CODE_SIZE:0x0) + +.app_excpt 0x9d002180 0x10 + *(.gen_handler) + .gen_handler 0x9d002180 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.vector_0 0x9d002200 0x8 + *(.vector_0) + .vector_0 0x9d002200 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + 0x9d002200 __vector_dispatch_0 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_0) <= (_vector_spacing << 0x5))), function at exception vector 0 too large) + +.vector_1 0x9d002220 0x8 + *(.vector_1) + .vector_1 0x9d002220 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + 0x9d002220 __vector_dispatch_1 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_1) <= (_vector_spacing << 0x5))), function at exception vector 1 too large) + +.vector_2 0x9d002240 0x8 + *(.vector_2) + .vector_2 0x9d002240 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + 0x9d002240 __vector_dispatch_2 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_2) <= (_vector_spacing << 0x5))), function at exception vector 2 too large) + +.vector_3 0x9d002260 0x8 + *(.vector_3) + .vector_3 0x9d002260 0x8 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d002260 __vector_dispatch_3 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_3) <= (_vector_spacing << 0x5))), function at exception vector 3 too large) + +.vector_4 0x9d002280 0x8 + *(.vector_4) + .vector_4 0x9d002280 0x8 build/ChaletDuino_775F512H_/production/Source/timer.o + 0x9d002280 __vector_dispatch_4 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_4) <= (_vector_spacing << 0x5))), function at exception vector 4 too large) + +.vector_5 0x9d0022a0 0x8 + *(.vector_5) + .vector_5 0x9d0022a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + 0x9d0022a0 __vector_dispatch_5 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_5) <= (_vector_spacing << 0x5))), function at exception vector 5 too large) + +.vector_6 0x9d0022c0 0x8 + *(.vector_6) + .vector_6 0x9d0022c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + 0x9d0022c0 __vector_dispatch_6 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_6) <= (_vector_spacing << 0x5))), function at exception vector 6 too large) + +.vector_7 0x9d0022e0 0x8 + *(.vector_7) + .vector_7 0x9d0022e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + 0x9d0022e0 __vector_dispatch_7 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_7) <= (_vector_spacing << 0x5))), function at exception vector 7 too large) + +.vector_8 0x9d002300 0x8 + *(.vector_8) + .vector_8 0x9d002300 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + 0x9d002300 __vector_dispatch_8 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_8) <= (_vector_spacing << 0x5))), function at exception vector 8 too large) + +.vector_9 0x9d002320 0x8 + *(.vector_9) + .vector_9 0x9d002320 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + 0x9d002320 __vector_dispatch_9 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_9) <= (_vector_spacing << 0x5))), function at exception vector 9 too large) + +.vector_10 0x9d002340 0x8 + *(.vector_10) + .vector_10 0x9d002340 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + 0x9d002340 __vector_dispatch_10 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_10) <= (_vector_spacing << 0x5))), function at exception vector 10 too large) + +.vector_11 0x9d002360 0x8 + *(.vector_11) + .vector_11 0x9d002360 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + 0x9d002360 __vector_dispatch_11 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_11) <= (_vector_spacing << 0x5))), function at exception vector 11 too large) + +.vector_12 0x9d002380 0x8 + *(.vector_12) + .vector_12 0x9d002380 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + 0x9d002380 __vector_dispatch_12 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_12) <= (_vector_spacing << 0x5))), function at exception vector 12 too large) + +.vector_13 0x9d0023a0 0x8 + *(.vector_13) + .vector_13 0x9d0023a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + 0x9d0023a0 __vector_dispatch_13 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_13) <= (_vector_spacing << 0x5))), function at exception vector 13 too large) + +.vector_14 0x9d0023c0 0x8 + *(.vector_14) + .vector_14 0x9d0023c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + 0x9d0023c0 __vector_dispatch_14 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_14) <= (_vector_spacing << 0x5))), function at exception vector 14 too large) + +.vector_15 0x9d0023e0 0x8 + *(.vector_15) + .vector_15 0x9d0023e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + 0x9d0023e0 __vector_dispatch_15 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_15) <= (_vector_spacing << 0x5))), function at exception vector 15 too large) + +.vector_16 0x9d002400 0x8 + *(.vector_16) + .vector_16 0x9d002400 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + 0x9d002400 __vector_dispatch_16 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_16) <= (_vector_spacing << 0x5))), function at exception vector 16 too large) + +.vector_17 0x9d002420 0x8 + *(.vector_17) + .vector_17 0x9d002420 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + 0x9d002420 __vector_dispatch_17 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_17) <= (_vector_spacing << 0x5))), function at exception vector 17 too large) + +.vector_18 0x9d002440 0x8 + *(.vector_18) + .vector_18 0x9d002440 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + 0x9d002440 __vector_dispatch_18 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_18) <= (_vector_spacing << 0x5))), function at exception vector 18 too large) + +.vector_19 0x9d002460 0x8 + *(.vector_19) + .vector_19 0x9d002460 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + 0x9d002460 __vector_dispatch_19 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_19) <= (_vector_spacing << 0x5))), function at exception vector 19 too large) + +.vector_20 0x9d002480 0x8 + *(.vector_20) + .vector_20 0x9d002480 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + 0x9d002480 __vector_dispatch_20 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_20) <= (_vector_spacing << 0x5))), function at exception vector 20 too large) + +.vector_21 0x9d0024a0 0x8 + *(.vector_21) + .vector_21 0x9d0024a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + 0x9d0024a0 __vector_dispatch_21 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_21) <= (_vector_spacing << 0x5))), function at exception vector 21 too large) + +.vector_22 0x9d0024c0 0x8 + *(.vector_22) + .vector_22 0x9d0024c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + 0x9d0024c0 __vector_dispatch_22 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_22) <= (_vector_spacing << 0x5))), function at exception vector 22 too large) + +.vector_23 0x9d0024e0 0x8 + *(.vector_23) + .vector_23 0x9d0024e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + 0x9d0024e0 __vector_dispatch_23 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_23) <= (_vector_spacing << 0x5))), function at exception vector 23 too large) + +.vector_24 0x9d002500 0x8 + *(.vector_24) + .vector_24 0x9d002500 0x8 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0x9d002500 __vector_dispatch_24 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_24) <= (_vector_spacing << 0x5))), function at exception vector 24 too large) + +.vector_25 0x9d002520 0x8 + *(.vector_25) + .vector_25 0x9d002520 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + 0x9d002520 __vector_dispatch_25 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_25) <= (_vector_spacing << 0x5))), function at exception vector 25 too large) + +.vector_26 0x9d002540 0x8 + *(.vector_26) + .vector_26 0x9d002540 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + 0x9d002540 __vector_dispatch_26 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_26) <= (_vector_spacing << 0x5))), function at exception vector 26 too large) + +.vector_27 0x9d002560 0x8 + *(.vector_27) + .vector_27 0x9d002560 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + 0x9d002560 __vector_dispatch_27 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_27) <= (_vector_spacing << 0x5))), function at exception vector 27 too large) + +.vector_28 0x9d002580 0x8 + *(.vector_28) + .vector_28 0x9d002580 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + 0x9d002580 __vector_dispatch_28 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_28) <= (_vector_spacing << 0x5))), function at exception vector 28 too large) + +.vector_29 0x9d0025a0 0x8 + *(.vector_29) + .vector_29 0x9d0025a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + 0x9d0025a0 __vector_dispatch_29 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_29) <= (_vector_spacing << 0x5))), function at exception vector 29 too large) + +.vector_30 0x9d0025c0 0x8 + *(.vector_30) + .vector_30 0x9d0025c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + 0x9d0025c0 __vector_dispatch_30 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_30) <= (_vector_spacing << 0x5))), function at exception vector 30 too large) + +.vector_31 0x9d0025e0 0x8 + *(.vector_31) + .vector_31 0x9d0025e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + 0x9d0025e0 __vector_dispatch_31 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_31) <= (_vector_spacing << 0x5))), function at exception vector 31 too large) + +.vector_32 0x9d002600 0x8 + *(.vector_32) + .vector_32 0x9d002600 0x8 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0x9d002600 __vector_dispatch_32 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_32) <= (_vector_spacing << 0x5))), function at exception vector 32 too large) + +.vector_33 0x9d002620 0x8 + *(.vector_33) + .vector_33 0x9d002620 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + 0x9d002620 __vector_dispatch_33 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_33) <= (_vector_spacing << 0x5))), function at exception vector 33 too large) + +.vector_34 0x9d002640 0x8 + *(.vector_34) + .vector_34 0x9d002640 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + 0x9d002640 __vector_dispatch_34 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_34) <= (_vector_spacing << 0x5))), function at exception vector 34 too large) + +.vector_35 0x9d002660 0x8 + *(.vector_35) + .vector_35 0x9d002660 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + 0x9d002660 __vector_dispatch_35 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_35) <= (_vector_spacing << 0x5))), function at exception vector 35 too large) + +.vector_36 0x9d002680 0x8 + *(.vector_36) + .vector_36 0x9d002680 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + 0x9d002680 __vector_dispatch_36 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_36) <= (_vector_spacing << 0x5))), function at exception vector 36 too large) + +.vector_37 0x9d0026a0 0x8 + *(.vector_37) + .vector_37 0x9d0026a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + 0x9d0026a0 __vector_dispatch_37 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_37) <= (_vector_spacing << 0x5))), function at exception vector 37 too large) + +.vector_38 0x9d0026c0 0x8 + *(.vector_38) + .vector_38 0x9d0026c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + 0x9d0026c0 __vector_dispatch_38 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_38) <= (_vector_spacing << 0x5))), function at exception vector 38 too large) + +.vector_39 0x9d0026e0 0x8 + *(.vector_39) + .vector_39 0x9d0026e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + 0x9d0026e0 __vector_dispatch_39 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_39) <= (_vector_spacing << 0x5))), function at exception vector 39 too large) + +.vector_40 0x9d002700 0x8 + *(.vector_40) + .vector_40 0x9d002700 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + 0x9d002700 __vector_dispatch_40 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_40) <= (_vector_spacing << 0x5))), function at exception vector 40 too large) + +.vector_41 0x9d002720 0x8 + *(.vector_41) + .vector_41 0x9d002720 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + 0x9d002720 __vector_dispatch_41 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_41) <= (_vector_spacing << 0x5))), function at exception vector 41 too large) + +.vector_42 0x9d002740 0x8 + *(.vector_42) + .vector_42 0x9d002740 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + 0x9d002740 __vector_dispatch_42 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_42) <= (_vector_spacing << 0x5))), function at exception vector 42 too large) + +.vector_43 0x9d002760 0x8 + *(.vector_43) + .vector_43 0x9d002760 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + 0x9d002760 __vector_dispatch_43 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_43) <= (_vector_spacing << 0x5))), function at exception vector 43 too large) + +.vector_44 0x9d002780 0x8 + *(.vector_44) + .vector_44 0x9d002780 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + 0x9d002780 __vector_dispatch_44 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_44) <= (_vector_spacing << 0x5))), function at exception vector 44 too large) + +.vector_45 0x9d0027a0 0x8 + *(.vector_45) + .vector_45 0x9d0027a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + 0x9d0027a0 __vector_dispatch_45 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_45) <= (_vector_spacing << 0x5))), function at exception vector 45 too large) + +.vector_46 0x9d0027c0 0x8 + *(.vector_46) + .vector_46 0x9d0027c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + 0x9d0027c0 __vector_dispatch_46 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_46) <= (_vector_spacing << 0x5))), function at exception vector 46 too large) + +.vector_47 0x9d0027e0 0x8 + *(.vector_47) + .vector_47 0x9d0027e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + 0x9d0027e0 __vector_dispatch_47 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_47) <= (_vector_spacing << 0x5))), function at exception vector 47 too large) + +.vector_48 0x9d002800 0x8 + *(.vector_48) + .vector_48 0x9d002800 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + 0x9d002800 __vector_dispatch_48 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_48) <= (_vector_spacing << 0x5))), function at exception vector 48 too large) + +.vector_49 0x9d002820 0x8 + *(.vector_49) + .vector_49 0x9d002820 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + 0x9d002820 __vector_dispatch_49 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_49) <= (_vector_spacing << 0x5))), function at exception vector 49 too large) + +.vector_50 0x9d002840 0x8 + *(.vector_50) + .vector_50 0x9d002840 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + 0x9d002840 __vector_dispatch_50 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_50) <= (_vector_spacing << 0x5))), function at exception vector 50 too large) + +.vector_51 0x9d002860 0x8 + *(.vector_51) + .vector_51 0x9d002860 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + 0x9d002860 __vector_dispatch_51 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_51) <= (_vector_spacing << 0x5))), function at exception vector 51 too large) + +.vector_52 0x9d002880 0x8 + *(.vector_52) + .vector_52 0x9d002880 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + 0x9d002880 __vector_dispatch_52 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_52) <= (_vector_spacing << 0x5))), function at exception vector 52 too large) + +.vector_53 0x9d0028a0 0x8 + *(.vector_53) + .vector_53 0x9d0028a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + 0x9d0028a0 __vector_dispatch_53 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_53) <= (_vector_spacing << 0x5))), function at exception vector 53 too large) + +.vector_54 0x9d0028c0 0x8 + *(.vector_54) + .vector_54 0x9d0028c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + 0x9d0028c0 __vector_dispatch_54 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_54) <= (_vector_spacing << 0x5))), function at exception vector 54 too large) + +.vector_55 0x9d0028e0 0x8 + *(.vector_55) + .vector_55 0x9d0028e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + 0x9d0028e0 __vector_dispatch_55 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_55) <= (_vector_spacing << 0x5))), function at exception vector 55 too large) + +.vector_56 0x9d002900 0x8 + *(.vector_56) + .vector_56 0x9d002900 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + 0x9d002900 __vector_dispatch_56 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_56) <= (_vector_spacing << 0x5))), function at exception vector 56 too large) + +.vector_57 0x9d002920 0x8 + *(.vector_57) + .vector_57 0x9d002920 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + 0x9d002920 __vector_dispatch_57 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_57) <= (_vector_spacing << 0x5))), function at exception vector 57 too large) + +.vector_58 0x9d002940 0x8 + *(.vector_58) + .vector_58 0x9d002940 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + 0x9d002940 __vector_dispatch_58 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_58) <= (_vector_spacing << 0x5))), function at exception vector 58 too large) + +.vector_59 0x9d002960 0x8 + *(.vector_59) + .vector_59 0x9d002960 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + 0x9d002960 __vector_dispatch_59 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_59) <= (_vector_spacing << 0x5))), function at exception vector 59 too large) + +.vector_60 0x9d002980 0x8 + *(.vector_60) + .vector_60 0x9d002980 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + 0x9d002980 __vector_dispatch_60 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_60) <= (_vector_spacing << 0x5))), function at exception vector 60 too large) + +.vector_61 0x9d0029a0 0x8 + *(.vector_61) + .vector_61 0x9d0029a0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + 0x9d0029a0 __vector_dispatch_61 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_61) <= (_vector_spacing << 0x5))), function at exception vector 61 too large) + +.vector_62 0x9d0029c0 0x8 + *(.vector_62) + .vector_62 0x9d0029c0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + 0x9d0029c0 __vector_dispatch_62 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_62) <= (_vector_spacing << 0x5))), function at exception vector 62 too large) + +.vector_63 0x9d0029e0 0x8 + *(.vector_63) + .vector_63 0x9d0029e0 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + 0x9d0029e0 __vector_dispatch_63 + 0x00000001 ASSERT (((_vector_spacing == 0x0) || (SIZEOF (.vector_63) <= (_vector_spacing << 0x5))), function at exception vector 63 too large) + +.startup + *(.startup) + +.text 0x9d003800 0x0 + *(.stub .gnu.linkonce.t.*) + *(.text.*personality*) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + 0x9d003800 . = ALIGN (0x4) + +.init 0x9d003800 0x0 + *crti.o(.init) + *crtbegin.o(.init) + *(EXCLUDE_FILE(*crtn.o *crtend?.o *crtend.o) .init) + *crtend.o(.init) + *crtn.o(.init) + 0x9d003800 . = ALIGN (0x4) + +.fini 0x9d003800 0x0 + *(.fini) + 0x9d003800 . = ALIGN (0x4) + +.preinit_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__preinit_array_start, .) + *(.preinit_array) + 0x9d003800 PROVIDE (__preinit_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.init_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__init_array_start, .) + *(SORT(.init_array.*)) + *(.init_array) + 0x9d003800 PROVIDE (__init_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.fini_array 0x9d003800 0x0 + 0x9d003800 PROVIDE (__fini_array_start, .) + *(SORT(.fini_array.*)) + *(.fini_array) + 0x9d003800 PROVIDE (__fini_array_end, .) + 0x9d003800 . = ALIGN (0x4) + +.ctors 0x9d003800 0x0 + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + 0x9d003800 . = ALIGN (0x4) + +.dtors 0x9d003800 0x0 + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + 0x9d003800 . = ALIGN (0x4) + +.rodata 0x9d003800 0x0 + *(.gnu.linkonce.r.*) + *(.rodata1) + 0x9d003800 . = ALIGN (0x4) + +.sdata2 0x9d003000 0x0 + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + 0x9d003000 . = ALIGN (0x4) + +.sbss2 0x9d003000 0x0 + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame_hdr + *(.eh_frame_hdr) + 0x9d003000 . = ALIGN (0x4) + +.eh_frame + *(.eh_frame) + 0x9d003000 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0x9d003000 . = ALIGN (0x4) + +.dbg_data 0xa0000000 0x0 + 0xa0000000 . = (. + DEFINED (_DEBUGGER)?0x200:0x0) + +.jcr 0xa0000000 0x0 + *(.jcr) + 0xa0000000 . = ALIGN (0x4) + +.eh_frame 0xa0000000 0x30 + *(.eh_frame) + .eh_frame 0xa0000000 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .eh_frame 0xa0000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0xa0000030 . = ALIGN (0x4) + +.gcc_except_table + *(.gcc_except_table .gcc_except_table.*) + 0xa0000030 . = ALIGN (0x4) + +.persist 0xa0000030 0x0 + 0xa0000030 _persist_begin = . + *(.persist .persist.*) + *(.pbss .pbss.*) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 _persist_end = . + +.data 0xa0000030 0x0 + *(.gnu.linkonce.d.*) + *(.data1) + 0xa0000030 . = ALIGN (0x4) + 0xa0000030 . = . + 0xa0008020 _gp = (ALIGN (0x10) + 0x7ff0) + +.got 0xa0000030 0x0 + *(.got.plt) + *(.got) + 0xa0000030 . = ALIGN (0x4) + +.sdata 0xa0000030 0x54 + 0xa0000030 _sdata_begin = . + *(.sdata .sdata.* .gnu.linkonce.s.*) + .sdata 0xa0000030 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa0000030 egstrNmBusCapabilities + .sdata 0xa0000034 0x8 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .sdata 0xa000003c 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sdata 0xa0000040 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sdata 0xa0000044 0x2 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + 0xa0000044 State + *fill* 0xa0000046 0x2 + .sdata 0xa0000048 0xc build/ChaletDuino_775F512H_/production/Source/Terminal.o + .sdata 0xa0000054 0x4 build/ChaletDuino_775F512H_/production/Source/Uart.o + 0xa0000054 gUartStrings + .sdata 0xa0000058 0x8 build/ChaletDuino_775F512H_/production/Source/main.o + .sdata 0xa0000060 0x10 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + 0xa0000067 TerminalSocket + 0xa0000068 TerminalServerSocket + 0xa0000069 PrintfSocket + 0xa000006a PrintfServerSocket + 0xa000006b NetworkSocket + 0xa000006c NetworkServerSocket + 0xa000006d mWiFiState + .sdata 0xa0000070 0x4 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + 0xa0000070 mLoraPreamble + .sdata 0xa0000074 0x8 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .sdata 0xa000007c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000007c _Files + .sdata 0xa0000080 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + 0xa0000080 __XC_UART + 0xa0000084 . = ALIGN (0x4) + 0xa0000084 _sdata_end = . + +.lit8 + *(.lit8) + +.lit4 + *(.lit4) + 0xa0000084 . = ALIGN (0x4) + 0xa0000084 _data_end = . + 0xa0000084 _bss_begin = . + +.sbss 0xa0000084 0x130 + 0xa0000084 _sbss_begin = . + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + .sbss 0xa0000084 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .sbss 0xa0000088 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0xa0000090 pfWifiCb + 0xa0000094 pfIpCb + 0xa0000098 pfOtaCb + 0xa000009c pfSigmaCb + 0xa00000a0 pfHifCb + 0xa00000a4 pfSSLCb + .sbss 0xa00000a8 0x8 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .sbss 0xa00000b0 0x8 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .sbss 0xa00000b8 0x14 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .sbss 0xa00000cc 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .sbss 0xa00000d0 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + *fill* 0xa00000d1 0x1 + .sbss 0xa00000d2 0x6 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa00000d2 gu16SessionID + 0xa00000d4 gbSocketInit + .sbss 0xa00000d8 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .sbss 0xa00000dc 0x4 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0xa00000dc LoraData + .sbss 0xa00000e0 0x18 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + 0xa00000e0 DataSize + 0xa00000e4 DataCtr + 0xa00000e8 BufPtr + 0xa00000ec RxPtr + 0xa00000ed Command + 0xa00000ee CRC + 0xa00000ef SenderID + 0xa00000f0 SenderAddress + 0xa00000f1 Flags + 0xa00000f2 IsUpdating + 0xa00000f4 BmpDataPtr + .sbss 0xa00000f8 0xc build/ChaletDuino_775F512H_/production/Source/exceptions.o + .sbss 0xa0000104 0x18 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + 0xa0000104 gu32HostIp + 0xa0000108 gu8RetryCount + 0xa0000118 mWiFiInitOK + .sbss 0xa000011c 0x4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .sbss 0xa0000120 0x8 build/ChaletDuino_775F512H_/production/Source/ina219.o + 0xa0000120 ina219_currentDivider_mA + 0xa0000124 ina219_powerDivider_mW + .sbss 0xa0000128 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0000128 _outdone + *fill* 0xa0000129 0x3 + .sbss 0xa000012c 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa000012c __allocp + 0xa0000130 __alloct + 0xa0000134 __allocx + .sbss 0xa000013c 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + 0xa000013c errno + .sbss 0xa0000140 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0xa0000140 _minbrk + 0xa0000144 _maxbrk + *(.scommon) + .scommon 0xa0000148 0x4 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0xa0000148 at_sb_printf + .scommon 0xa000014c 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0xa000014c mWifiSPIBaudrate + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .scommon 0xa000014d 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + *fill* 0xa000014d 0x3 + .scommon 0xa0000150 0x15 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa0000150 gpfAppResolveCb + 0xa0000154 gu16BufferSize + 0xa0000158 gpfAppSocketCb + 0xa000015c gsockerrno + 0xa0000160 gfpPingCb + 0xa0000164 gu8OpCode + .scommon 0xa0000165 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .scommon 0xa0000165 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + *fill* 0xa0000165 0x3 + .scommon 0xa0000168 0x2 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0xa0000168 acIntUartRxBuff + *fill* 0xa000016a 0x2 + .scommon 0xa000016c 0x14 build/ChaletDuino_775F512H_/production/Source/Terminal.o + 0xa000016c mTerminalOpened + 0xa0000170 TerminalDataPtr + 0xa0000174 mTerminalPendingAction + 0xa0000178 mHelpStringPtr + 0xa000017c mTerminalTickState + .scommon 0xa0000180 0x0 build/ChaletDuino_775F512H_/production/Source/main.o + .scommon 0xa0000180 0xa build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + 0xa0000180 u8IsMacAddrValid + 0xa0000184 mac_addr + *fill* 0xa000018a 0x2 + .scommon 0xa000018c 0x4 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + 0xa000018c PowerRelayState + .scommon 0xa0000190 0x18 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + 0xa0000190 mBatteryCurrent + 0xa0000194 mVoltageMeanSum + 0xa0000198 mVoltageMeanCount + 0xa000019c mBatterySOC + 0xa00001a0 mBatteryVoltage + 0xa00001a4 mCurrentModuleOK + .scommon 0xa00001a8 0x8 build/ChaletDuino_775F512H_/production/Source/I2C.o + 0xa00001a8 mLastTransactionOK + 0xa00001ac mI2CWaitCounter + .scommon 0xa00001b0 0x2 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + 0xa00001b0 mSPIFlashHighSpeedBaudrate + 0xa00001b1 mSPIFlashBaudrate + 0xa00001b2 _sbss_end = . + 0xa00001b4 . = ALIGN (0x4) + *fill* 0xa00001b2 0x2 + +.bss 0xa00001b4 0x2a00 + *(.dynbss) + *(COMMON) + COMMON 0xa00001b4 0xb0 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + 0xa00001b4 gastrSockets + COMMON 0xa0000264 0x40 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0xa0000264 astInternalUartData + COMMON 0xa00002a4 0x26e build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + 0xa00002a4 mRxData + 0xa00003dc mTxData + *fill* 0xa0000512 0x2 + COMMON 0xa0000514 0x384 build/ChaletDuino_775F512H_/production/Source/Terminal.o + 0xa0000514 TerminalWorkString + 0xa0000640 TerminalPrevDataBuf + 0xa000076c TerminalDataBuf + COMMON 0xa0000898 0x620 build/ChaletDuino_775F512H_/production/Source/Uart.o + 0xa0000898 astUartData + COMMON 0xa0000eb8 0xa8 build/ChaletDuino_775F512H_/production/Source/timer.o + 0xa0000eb8 astTimer + COMMON 0xa0000f60 0xc3c build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + 0xa0000f60 NetworkRxBuf + 0xa0001360 TerminalRxBuf + 0xa0001760 PrintfRxBuf + 0xa0001b60 addr_in + 0xa0001b70 param + 0xa0001b8c mModuleIPConfig + COMMON 0xa0001b9c 0x16 build/ChaletDuino_775F512H_/production/Source/ina219.o + 0xa0001b9c I2CSlaveBuffer + 0xa0001ba8 I2CMasterBuffer + *fill* 0xa0001bb2 0x2 + COMMON 0xa0001bb4 0x1000 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + 0xa0001bb4 mFlashSectorBuffer + 0xa0002bb4 . = ALIGN ((. != 0x0)?0x4:0x1) + 0xa0002bb4 . = ALIGN (0x4) + 0xa0002bb4 _end = . + 0xa0002bb4 _bss_end = . + 0x00010000 _bmxdudba_address = 0x10000 + 0x00010000 _bmxdupba_address = 0x10000 + +/DISCARD/ + *(.pdr) + *(.rel.dyn) + *(.note.GNU-stack) + *(.note.GNU-stack) + *(.gnu_debuglink) + *(.gnu.lto_*) + *(.discard) + +.gptab.sdata + *(.gptab.data) + *(.gptab.sdata) + +.gptab.sbss + *(.gptab.bss) + *(.gptab.sbss) + +.mdebug.abi32 0xa0002bb4 0x0 + *(.mdebug.abi32) + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/Uart.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/Util.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/main.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/system.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/template.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/timer.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/SPI.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/ina219.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/I2C.o + .mdebug.abi32 0xa0002bb4 0x0 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .mdebug.abi32 0xa0002bb4 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.mdebug.abiN32 + *(.mdebug.abiN32) + +.mdebug.abi64 + *(.mdebug.abi64) + +.mdebug.abiO64 + *(.mdebug.abiO64) + +.mdebug.eabi32 + *(.mdebug.eabi32) + +.mdebug.eabi64 + *(.mdebug.eabi64) + +.gcc_compiled_long32 + *(.gcc_compiled_long32) + +.gcc_compiled_long64 + *(.gcc_compiled_long64) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x248 + *(.comment) + .comment 0x00000000 0x3c build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + 0x3d (size before relaxing) + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/Terminal.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/Uart.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/Util.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/exceptions.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/interrupts.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/main.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/system.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/template.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/timer.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/SPI.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/ina219.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/I2C.o + .comment 0x00000000 0x3d build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .comment 0x0000003c 0x3c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x3d (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .comment 0x00000078 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x19 (size before relaxing) + .comment 0x00000090 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x1a (size before relaxing) + .comment 0x000000a9 0x19 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x1a (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .comment 0x000000c2 0x4e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x8b (size before relaxing) + .comment 0x00000110 0x4f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x8c (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .comment 0x0000015f 0x4b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x88 (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .comment 0x000001aa 0x9e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0xdb (size before relaxing) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .comment 0x00000000 0x3d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0x9a8 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_aranges + 0x00000020 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_aranges + 0x00000040 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_aranges + 0x00000060 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_aranges + 0x00000080 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_aranges + 0x000000a0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_aranges + 0x000000c0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_aranges + 0x000000e0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_aranges + 0x00000100 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_aranges + 0x00000120 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_aranges + 0x00000140 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_aranges + 0x00000160 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_aranges + 0x00000180 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_aranges + 0x000001a0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_aranges + 0x000001c0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_aranges + 0x000001e0 0x20 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_aranges + 0x00000200 0x20 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_aranges + 0x00000220 0x20 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_aranges + 0x00000240 0x20 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_aranges + 0x00000260 0x20 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_aranges + 0x00000280 0x20 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_aranges + 0x000002a0 0x20 build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_aranges + 0x000002c0 0x20 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_aranges + 0x000002e0 0x20 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_aranges + 0x00000300 0x20 build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_aranges + 0x00000320 0x20 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_aranges + 0x00000340 0x20 build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_aranges + 0x00000360 0x20 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_aranges + 0x00000380 0x20 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_aranges + 0x000003a0 0x20 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_aranges + 0x000003c0 0x20 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_aranges + 0x000003e0 0x20 build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_aranges + 0x00000400 0x20 build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_aranges + 0x00000420 0x20 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_aranges + 0x00000440 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_aranges + 0x00000460 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_aranges + 0x00000488 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_aranges + 0x000004a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_aranges + 0x000004c8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_aranges + 0x000004e8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_aranges + 0x00000508 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_aranges + 0x00000528 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_aranges + 0x00000548 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_aranges + 0x00000568 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_aranges + 0x00000588 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_aranges + 0x000005a8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_aranges + 0x000005d8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_aranges + 0x00000600 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_aranges + 0x00000628 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_aranges + 0x00000648 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_aranges + 0x00000668 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_aranges + 0x00000688 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_aranges + 0x000006a8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_aranges + 0x000006c8 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_aranges + 0x000006f0 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_aranges + 0x00000720 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_aranges + 0x00000740 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_aranges + 0x00000760 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_aranges + 0x00000780 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_aranges + 0x00000820 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_aranges + 0x00000840 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_aranges + 0x00000860 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_aranges + 0x000008a0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_aranges + 0x000008c0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_aranges + 0x000008e0 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_aranges + 0x00000900 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_aranges + 0x00000920 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_aranges + 0x00000940 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_aranges + 0x00000960 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_aranges + 0x00000980 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_pubnames + 0x00000000 0x2a6c + *(.debug_pubnames) + .debug_pubnames + 0x00000000 0x20 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_pubnames + 0x00000020 0xa6 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubnames + 0x000000c6 0xa6 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubnames + 0x0000016c 0x8f build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubnames + 0x000001fb 0x23 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubnames + 0x0000021e 0x173 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubnames + 0x00000391 0xe5 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubnames + 0x00000476 0xa6 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubnames + 0x0000051c 0x104 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubnames + 0x00000620 0x6fd build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubnames + 0x00000d1d 0x207 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubnames + 0x00000f24 0xcd build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubnames + 0x00000ff1 0xee build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubnames + 0x000010df 0x23 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubnames + 0x00001102 0xb8 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubnames + 0x000011ba 0x23 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubnames + 0x000011dd 0x1ce build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubnames + 0x000013ab 0x75 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubnames + 0x00001420 0x31 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubnames + 0x00001451 0x24 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_pubnames + 0x00001475 0x125 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_pubnames + 0x0000159a 0x194 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_pubnames + 0x0000172e 0x174 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_pubnames + 0x000018a2 0x101 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_pubnames + 0x000019a3 0xd8 build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_pubnames + 0x00001a7b 0x31 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_pubnames + 0x00001aac 0x3a build/ChaletDuino_775F512H_/production/Source/main.o + .debug_pubnames + 0x00001ae6 0xec build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_pubnames + 0x00001bd2 0x22a build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_pubnames + 0x00001dfc 0x25 build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_pubnames + 0x00001e21 0x58 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubnames + 0x00001e79 0xca build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubnames + 0x00001f43 0x41 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_pubnames + 0x00001f84 0x13b build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_pubnames + 0x000020bf 0x1af build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_pubnames + 0x0000226e 0x92 build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_pubnames + 0x00002300 0x159 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_pubnames + 0x00002459 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_pubnames + 0x00002479 0x3b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_pubnames + 0x000024b4 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_pubnames + 0x000024dd 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_pubnames + 0x00002507 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_pubnames + 0x00002532 0x2b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_pubnames + 0x0000255d 0x33 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_pubnames + 0x00002590 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_pubnames + 0x000025b0 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_pubnames + 0x000025d4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_pubnames + 0x000025fc 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_pubnames + 0x00002619 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_pubnames + 0x0000264b 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_pubnames + 0x00002670 0x29 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_pubnames + 0x00002699 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_pubnames + 0x000026b7 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_pubnames + 0x000026df 0x2a c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_pubnames + 0x00002709 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_pubnames + 0x00002729 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_pubnames + 0x00002745 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_pubnames + 0x00002771 0x21 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_pubnames + 0x00002792 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_pubnames + 0x000027b0 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_pubnames + 0x000027cc 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_pubnames + 0x000027e7 0xe1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_pubnames + 0x000028c8 0x1d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_pubnames + 0x000028e5 0x1e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_pubnames + 0x00002903 0x5c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_pubnames + 0x0000295f 0x1b c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_pubnames + 0x0000297a 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_pubnames + 0x00002996 0x22 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_pubnames + 0x000029b8 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubnames + 0x000029dc 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubnames + 0x000029fc 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubnames + 0x00002a1c 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_pubnames + 0x00002a40 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_info 0x00000000 0x36356 + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x3332 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_info 0x00003332 0x1cdf build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_info 0x00005011 0x1654 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_info 0x00006665 0x3e6 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_info 0x00006a4b 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_info 0x00006a4b 0x146 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_info 0x00006b91 0x118f build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_info 0x00007d20 0x98d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_info 0x000086ad 0x47c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_info 0x00008b29 0xc18 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_info 0x00009741 0x3a40 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_info 0x0000d181 0xa04 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_info 0x0000db85 0x52c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_info 0x0000e0b1 0x680 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_info 0x0000e731 0x141 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_info 0x0000e872 0x92d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_info 0x0000f19f 0x142 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_info 0x0000f2e1 0x1ddb build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_info 0x000110bc 0x7e0 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_info 0x0001189c 0x557 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_info 0x00011df3 0x115b build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_info 0x00012f4e 0x3cc1 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_info 0x00016c0f 0x1aa3 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_info 0x000186b2 0x1963 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_info 0x0001a015 0x19e8 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_info 0x0001b9fd 0x14fb build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_info 0x0001cef8 0x127b build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_info 0x0001e173 0x113f build/ChaletDuino_775F512H_/production/Source/interrupts.o + .debug_info 0x0001f2b2 0x1bc2 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_info 0x00020e74 0x113b build/ChaletDuino_775F512H_/production/Source/system.o + .debug_info 0x00021faf 0x113d build/ChaletDuino_775F512H_/production/Source/template.o + .debug_info 0x000230ec 0x210f build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_info 0x000251fb 0x2e6c build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_info 0x00028067 0x131a build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_info 0x00029381 0x1c25 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_info 0x0002afa6 0x1751 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_info 0x0002c6f7 0x1355 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_info 0x0002da4c 0x18a4 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_info 0x0002f2f0 0x159f build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_info 0x0003088f 0x1703 build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_info 0x00031f92 0x16fd build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_info 0x0003368f 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_info 0x0003373d 0xbb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_info 0x000337f8 0xae c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_info 0x000338a6 0xb0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_info 0x00033956 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_info 0x00033a08 0xb2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_info 0x00033aba 0xe2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_info 0x00033b9c 0xbc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_info 0x00033c58 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_info 0x00033d1c 0xd6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_info 0x00033df2 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_info 0x00033df2 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_info 0x00033ea7 0xe4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_info 0x00033f8b 0xc5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_info 0x00034050 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_info 0x0003411b 0xb7 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_info 0x000341d2 0xc0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_info 0x00034292 0xc3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_info 0x00034355 0xb8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_info 0x0003440d 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_info 0x000344c0 0xda c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_info 0x0003459a 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_info 0x0003459a 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_info 0x0003467a 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_info 0x00034730 0xb3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_info 0x000347e3 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_info 0x00034894 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_info 0x00034894 0x219 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_info 0x00034aad 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_info 0x00034aad 0xb5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_info 0x00034b62 0xb6 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_info 0x00034c18 0x115 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_info 0x00034d2d 0xab c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_info 0x00034dd8 0xad c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_info 0x00034e85 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_info 0x00034e85 0xcb c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_info 0x00034f50 0x2c2 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_info 0x00035212 0x782 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_info 0x00035994 0x7b8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_info 0x0003614c 0x125 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_info 0x00036271 0xe5 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_abbrev 0x00000000 0x4efe + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x1d0 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_abbrev 0x000001d0 0x1f4 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_abbrev 0x000003c4 0x239 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_abbrev 0x000005fd 0xc8 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_abbrev 0x000006c5 0x1 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_abbrev 0x000006c6 0x55 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_abbrev 0x0000071b 0x23e build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_abbrev 0x00000959 0x157 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_abbrev 0x00000ab0 0x105 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_abbrev 0x00000bb5 0x1fd build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_abbrev 0x00000db2 0x224 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_abbrev 0x00000fd6 0x1ad build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_abbrev 0x00001183 0x102 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_abbrev 0x00001285 0x153 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_abbrev 0x000013d8 0x55 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_abbrev 0x0000142d 0x175 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_abbrev 0x000015a2 0x55 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_abbrev 0x000015f7 0x245 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_abbrev 0x0000183c 0x122 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_abbrev 0x0000195e 0xe8 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_abbrev 0x00001a46 0x17b build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_abbrev 0x00001bc1 0x2bb build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_abbrev 0x00001e7c 0x268 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_abbrev 0x000020e4 0x2a0 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_abbrev 0x00002384 0x2c7 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_abbrev 0x0000264b 0x223 build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_abbrev 0x0000286e 0x1a2 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_abbrev 0x00002a10 0x166 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .debug_abbrev 0x00002b76 0x315 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_abbrev 0x00002e8b 0x166 build/ChaletDuino_775F512H_/production/Source/system.o + .debug_abbrev 0x00002ff1 0x166 build/ChaletDuino_775F512H_/production/Source/template.o + .debug_abbrev 0x00003157 0x217 build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_abbrev 0x0000336e 0x2ee build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_abbrev 0x0000365c 0x18e build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_abbrev 0x000037ea 0x24c build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_abbrev 0x00003a36 0x1c4 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_abbrev 0x00003bfa 0x18e build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_abbrev 0x00003d88 0x237 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_abbrev 0x00003fbf 0x24d build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_abbrev 0x0000420c 0x1da build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_abbrev 0x000043e6 0x298 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_abbrev 0x0000467e 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_abbrev 0x000046b0 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_abbrev 0x000046d3 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_abbrev 0x000046f6 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_abbrev 0x00004719 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_abbrev 0x0000473c 0x23 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_abbrev 0x0000475f 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_abbrev 0x00004784 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_abbrev 0x000047a9 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_abbrev 0x000047ce 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_abbrev 0x000047f3 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_abbrev 0x000047f4 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_abbrev 0x00004819 0x41 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_abbrev 0x0000485a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_abbrev 0x0000487f 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_abbrev 0x000048a4 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_abbrev 0x000048c9 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_abbrev 0x000048ee 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_abbrev 0x00004913 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_abbrev 0x00004938 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_abbrev 0x0000495d 0x49 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_abbrev 0x000049a6 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_abbrev 0x000049a7 0x36 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_abbrev 0x000049dd 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_abbrev 0x00004a02 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_abbrev 0x00004a27 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_abbrev 0x00004a4c 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_abbrev 0x00004a4d 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_abbrev 0x00004a72 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_abbrev 0x00004a73 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_abbrev 0x00004a98 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_abbrev 0x00004abd 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_abbrev 0x00004af5 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_abbrev 0x00004b1a 0x25 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_abbrev 0x00004b3f 0x1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_abbrev 0x00004b40 0x32 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_abbrev 0x00004b72 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_abbrev 0x00004beb 0x132 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_abbrev 0x00004d1d 0x13f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_abbrev 0x00004e5c 0x5f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_abbrev 0x00004ebb 0x43 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_line 0x00000000 0x7011 + *(.debug_line) + .debug_line 0x00000000 0x1ce build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_line 0x000001ce 0x251 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_line 0x0000041f 0x339 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_line 0x00000758 0x195 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_line 0x000008ed 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_line 0x000008ed 0x7a build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_line 0x00000967 0x3b2 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_line 0x00000d19 0x22d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_line 0x00000f46 0x1e8 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_line 0x0000112e 0x2cd build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_line 0x000013fb 0x568 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_line 0x00001963 0x34b build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_line 0x00001cae 0x207 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_line 0x00001eb5 0x27e build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_line 0x00002133 0x7a build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_line 0x000021ad 0x2db build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_line 0x00002488 0x7a build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_line 0x00002502 0x4ef build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_line 0x000029f1 0x2d2 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_line 0x00002cc3 0x1f0 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_line 0x00002eb3 0x156 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_line 0x00003009 0x2cf build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_line 0x000032d8 0x262 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_line 0x0000353a 0x3ab build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_line 0x000038e5 0x2ef build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_line 0x00003bd4 0x25b build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_line 0x00003e2f 0x161 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_line 0x00003f90 0x101 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .debug_line 0x00004091 0x366 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_line 0x000043f7 0x101 build/ChaletDuino_775F512H_/production/Source/system.o + .debug_line 0x000044f8 0x101 build/ChaletDuino_775F512H_/production/Source/template.o + .debug_line 0x000045f9 0x23b build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_line 0x00004834 0x4e1 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_line 0x00004d15 0x155 build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_line 0x00004e6a 0x218 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_line 0x00005082 0x1b5 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_line 0x00005237 0x16d build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_line 0x000053a4 0x2e2 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_line 0x00005686 0x1fd build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_line 0x00005883 0x1f5 build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_line 0x00005a78 0x25f build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_line 0x00005cd7 0xb1 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_line 0x00005d88 0x62 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_line 0x00005dea 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_line 0x00005e5b 0x72 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_line 0x00005ecd 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_line 0x00005f40 0x73 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_line 0x00005fb3 0x97 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_line 0x0000604a 0x84 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_line 0x000060ce 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_line 0x00006156 0x96 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_line 0x000061ec 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_line 0x000061ec 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_line 0x0000625c 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_line 0x000062cc 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_line 0x0000633a 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_line 0x000063aa 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_line 0x0000641b 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_line 0x0000648b 0x71 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_line 0x000064fc 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_line 0x0000656c 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_line 0x000065db 0x6d c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_line 0x00006648 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_line 0x00006648 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_line 0x000066b8 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_line 0x00006728 0x6f c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_line 0x00006797 0x6e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_line 0x00006805 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_line 0x00006805 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_line 0x00006875 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_line 0x00006875 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_line 0x000068e5 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_line 0x00006955 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_line 0x000069cd 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_line 0x00006a45 0x79 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_line 0x00006abe 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_line 0x00006abe 0x93 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_line 0x00006b51 0x105 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_line 0x00006c56 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_line 0x00006dbe 0x155 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_line 0x00006f13 0x8e c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_line 0x00006fa1 0x70 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_frame 0x00000000 0x3064 + *(.debug_frame) + .debug_frame 0x00000000 0x2c build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_frame 0x0000002c 0xfc build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_frame 0x00000128 0x9c build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_frame 0x000001c4 0xd4 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_frame 0x00000298 0x208 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_frame 0x000004a0 0x10c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_frame 0x000005ac 0xd4 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_frame 0x00000680 0x10c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_frame 0x0000078c 0x748 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_frame 0x00000ed4 0x294 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_frame 0x00001168 0x128 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_frame 0x00001290 0x10c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_frame 0x0000139c 0x20c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_frame 0x000015a8 0x25c build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_frame 0x00001804 0x17c build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_frame 0x00001980 0x2c build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_frame 0x000019ac 0x2c build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_frame 0x000019d8 0x138 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_frame 0x00001b10 0x130 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_frame 0x00001c40 0xf4 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_frame 0x00001d34 0x128 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_frame 0x00001e5c 0x10c build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_frame 0x00001f68 0x2c build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_frame 0x00001f94 0x64 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_frame 0x00001ff8 0x148 build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_frame 0x00002140 0x1bc build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_frame 0x000022fc 0x2c build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_frame 0x00002328 0x48 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_frame 0x00002370 0xb8 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_frame 0x00002428 0x48 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_frame 0x00002470 0xd8 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_frame 0x00002548 0x198 build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_frame 0x000026e0 0x9c build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_frame 0x0000277c 0x128 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_frame 0x000028a4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_frame 0x000028cc 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_frame 0x000028fc 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_frame 0x0000291c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_frame 0x0000293c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_frame 0x0000295c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_frame 0x0000297c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_frame 0x000029a4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_frame 0x000029c4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_frame 0x000029e4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_frame 0x00002a04 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_frame 0x00002a30 0x6c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_frame 0x00002a9c 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_frame 0x00002ae4 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_frame 0x00002b1c 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_frame 0x00002b3c 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_frame 0x00002b64 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_frame 0x00002b90 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_frame 0x00002bb8 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_frame 0x00002be4 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_frame 0x00002c1c 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_frame 0x00002c90 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_frame 0x00002cb8 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_frame 0x00002ce8 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_frame 0x00002d08 0x120 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_frame 0x00002e28 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_frame 0x00002e48 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_frame 0x00002e78 0x8c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_frame 0x00002f04 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_frame 0x00002f30 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_frame 0x00002f58 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_frame 0x00002f78 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_frame 0x00002fa4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_frame 0x00002fc4 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_frame 0x00002fe4 0x28 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_frame 0x0000300c 0x58 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_str 0x00000000 0x2737 + *(.debug_str) + .debug_str 0x00000000 0x213 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_str 0x00000213 0x14a build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_str 0x0000035d 0x149 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_str 0x000004a6 0xa build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_str 0x000004b0 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .debug_str 0x000004b0 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_str 0x000004b0 0x36 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_str 0x000004e6 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_str 0x000004e6 0xa build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_str 0x000004f0 0x25 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_str 0x00000515 0x178 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_str 0x0000068d 0x2d build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_str 0x000006ba 0x31 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_str 0x000006eb 0x12 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_str 0x000006fd 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_str 0x000006fd 0x19 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_str 0x00000716 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_str 0x00000716 0x168 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_str 0x0000087e 0x2d build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_str 0x000008ab 0x16 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_str 0x000008c1 0x12f build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_str 0x000009f0 0x226 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_str 0x00000c16 0x14f build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_str 0x00000d65 0x1ac build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_str 0x00000f11 0x181 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_str 0x00001092 0x145 build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_str 0x000011d7 0x12f build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_str 0x00001306 0x12f build/ChaletDuino_775F512H_/production/Source/interrupts.o + .debug_str 0x00001435 0x157 build/ChaletDuino_775F512H_/production/Source/main.o + .debug_str 0x0000158c 0x12f build/ChaletDuino_775F512H_/production/Source/system.o + .debug_str 0x000016bb 0x12f build/ChaletDuino_775F512H_/production/Source/template.o + .debug_str 0x000017ea 0x17f build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_str 0x00001969 0x246 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_str 0x00001baf 0x146 build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_str 0x00001cf5 0x167 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_str 0x00001e5c 0x15b build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_str 0x00001fb7 0x138 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_str 0x000020ef 0x1ac build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_str 0x0000229b 0x18b build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_str 0x00002426 0x17e build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_str 0x000025a4 0x193 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .debug_str 0x00002737 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.debug_loc 0x00000000 0x1489 + *(.debug_loc) + .debug_loc 0x00000000 0xc9 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_loc 0x000000c9 0x9c3 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_loc 0x00000a8c 0x995 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_loc 0x00001421 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + 0x00000000 0x2b9f + *(.debug_pubtypes) + .debug_pubtypes + 0x00000000 0x23f build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .debug_pubtypes + 0x0000023f 0x149 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .debug_pubtypes + 0x00000388 0x14c build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .debug_pubtypes + 0x000004d4 0x3c build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .debug_pubtypes + 0x00000510 0x12 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .debug_pubtypes + 0x00000522 0x5e build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .debug_pubtypes + 0x00000580 0xa2 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .debug_pubtypes + 0x00000622 0x48 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .debug_pubtypes + 0x0000066a 0x10c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .debug_pubtypes + 0x00000776 0x41c build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .debug_pubtypes + 0x00000b92 0x40 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .debug_pubtypes + 0x00000bd2 0x56 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .debug_pubtypes + 0x00000c28 0x5a build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .debug_pubtypes + 0x00000c82 0x12 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .debug_pubtypes + 0x00000c94 0x47 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .debug_pubtypes + 0x00000cdb 0x12 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .debug_pubtypes + 0x00000ced 0x29d build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .debug_pubtypes + 0x00000f8a 0x3c build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .debug_pubtypes + 0x00000fc6 0xcf build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .debug_pubtypes + 0x00001095 0xe7 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .debug_pubtypes + 0x0000117c 0x1f8 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .debug_pubtypes + 0x00001374 0x136 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .debug_pubtypes + 0x000014aa 0x175 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .debug_pubtypes + 0x0000161f 0x155 build/ChaletDuino_775F512H_/production/Source/Uart.o + .debug_pubtypes + 0x00001774 0xe7 build/ChaletDuino_775F512H_/production/Source/Util.o + .debug_pubtypes + 0x0000185b 0xe7 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .debug_pubtypes + 0x00001942 0xe7 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .debug_pubtypes + 0x00001a29 0x14e build/ChaletDuino_775F512H_/production/Source/main.o + .debug_pubtypes + 0x00001b77 0xe7 build/ChaletDuino_775F512H_/production/Source/system.o + .debug_pubtypes + 0x00001c5e 0xe7 build/ChaletDuino_775F512H_/production/Source/template.o + .debug_pubtypes + 0x00001d45 0x14e build/ChaletDuino_775F512H_/production/Source/timer.o + .debug_pubtypes + 0x00001e93 0x2dc build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .debug_pubtypes + 0x0000216f 0xfc build/ChaletDuino_775F512H_/production/Source/SPI.o + .debug_pubtypes + 0x0000226b 0x16d build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .debug_pubtypes + 0x000023d8 0x13f build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .debug_pubtypes + 0x00002517 0x101 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .debug_pubtypes + 0x00002618 0x137 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .debug_pubtypes + 0x0000274f 0x119 build/ChaletDuino_775F512H_/production/Source/ina219.o + .debug_pubtypes + 0x00002868 0x119 build/ChaletDuino_775F512H_/production/Source/I2C.o + .debug_pubtypes + 0x00002981 0xf8 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .debug_pubtypes + 0x00002a79 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .debug_pubtypes + 0x00002ab9 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .debug_pubtypes + 0x00002b12 0x59 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .debug_pubtypes + 0x00002b6b 0x34 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.debug_ranges 0x00000000 0x280 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .debug_ranges 0x00000010 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .debug_ranges 0x00000020 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .debug_ranges 0x00000030 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .debug_ranges 0x00000040 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .debug_ranges 0x00000050 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .debug_ranges 0x00000070 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .debug_ranges 0x00000088 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .debug_ranges 0x000000a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .debug_ranges 0x000000b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .debug_ranges 0x000000c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .debug_ranges 0x000000d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .debug_ranges 0x000000e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .debug_ranges 0x000000f0 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .debug_ranges 0x00000108 0x20 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .debug_ranges 0x00000128 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .debug_ranges 0x00000138 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .debug_ranges 0x00000148 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .debug_ranges 0x00000158 0x90 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .debug_ranges 0x000001e8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .debug_ranges 0x000001f8 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .debug_ranges 0x00000208 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .debug_ranges 0x00000238 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .debug_ranges 0x00000248 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .debug_ranges 0x00000258 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .debug_ranges 0x00000268 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.gnu.attributes + 0x00000000 0x10 + *(.gnu.attributes) + .gnu.attributes + 0x00000000 0x10 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + .gnu.attributes + 0x00000010 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + .gnu.attributes + 0x00000020 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + .gnu.attributes + 0x00000030 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + .gnu.attributes + 0x00000040 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + .gnu.attributes + 0x00000050 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + .gnu.attributes + 0x00000060 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + .gnu.attributes + 0x00000070 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + .gnu.attributes + 0x00000080 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + .gnu.attributes + 0x00000090 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + .gnu.attributes + 0x000000a0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + .gnu.attributes + 0x000000b0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + .gnu.attributes + 0x000000c0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + .gnu.attributes + 0x000000d0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + .gnu.attributes + 0x000000e0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + .gnu.attributes + 0x000000f0 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + .gnu.attributes + 0x00000100 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + .gnu.attributes + 0x00000110 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + .gnu.attributes + 0x00000120 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + .gnu.attributes + 0x00000130 0x10 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + .gnu.attributes + 0x00000140 0x10 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + .gnu.attributes + 0x00000150 0x10 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + .gnu.attributes + 0x00000160 0x10 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + .gnu.attributes + 0x00000170 0x10 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .gnu.attributes + 0x00000180 0x10 build/ChaletDuino_775F512H_/production/Source/Uart.o + .gnu.attributes + 0x00000190 0x10 build/ChaletDuino_775F512H_/production/Source/Util.o + .gnu.attributes + 0x000001a0 0x10 build/ChaletDuino_775F512H_/production/Source/exceptions.o + .gnu.attributes + 0x000001b0 0x10 build/ChaletDuino_775F512H_/production/Source/interrupts.o + .gnu.attributes + 0x000001c0 0x10 build/ChaletDuino_775F512H_/production/Source/main.o + .gnu.attributes + 0x000001d0 0x10 build/ChaletDuino_775F512H_/production/Source/system.o + .gnu.attributes + 0x000001e0 0x10 build/ChaletDuino_775F512H_/production/Source/template.o + .gnu.attributes + 0x000001f0 0x10 build/ChaletDuino_775F512H_/production/Source/timer.o + .gnu.attributes + 0x00000200 0x10 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .gnu.attributes + 0x00000210 0x10 build/ChaletDuino_775F512H_/production/Source/SPI.o + .gnu.attributes + 0x00000220 0x10 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + .gnu.attributes + 0x00000230 0x10 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + .gnu.attributes + 0x00000240 0x10 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + .gnu.attributes + 0x00000250 0x10 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + .gnu.attributes + 0x00000260 0x10 build/ChaletDuino_775F512H_/production/Source/ina219.o + .gnu.attributes + 0x00000270 0x10 build/ChaletDuino_775F512H_/production/Source/I2C.o + .gnu.attributes + 0x00000280 0x10 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + .gnu.attributes + 0x00000290 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + .gnu.attributes + 0x000002a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + .gnu.attributes + 0x000002b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + .gnu.attributes + 0x000002c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + .gnu.attributes + 0x000002d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + .gnu.attributes + 0x000002e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + .gnu.attributes + 0x000002f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + .gnu.attributes + 0x00000300 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + .gnu.attributes + 0x00000310 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + .gnu.attributes + 0x00000320 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + .gnu.attributes + 0x00000330 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + .gnu.attributes + 0x00000340 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + .gnu.attributes + 0x00000350 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + .gnu.attributes + 0x00000360 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + .gnu.attributes + 0x00000370 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + .gnu.attributes + 0x00000380 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + .gnu.attributes + 0x00000390 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + .gnu.attributes + 0x000003a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + .gnu.attributes + 0x000003b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + .gnu.attributes + 0x000003c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + .gnu.attributes + 0x000003d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .gnu.attributes + 0x000003e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + .gnu.attributes + 0x000003f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + .gnu.attributes + 0x00000400 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + .gnu.attributes + 0x00000410 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + .gnu.attributes + 0x00000420 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + .gnu.attributes + 0x00000430 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + .gnu.attributes + 0x00000440 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + .gnu.attributes + 0x00000450 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + .gnu.attributes + 0x00000460 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + .gnu.attributes + 0x00000470 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + .gnu.attributes + 0x00000480 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .gnu.attributes + 0x00000490 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + .gnu.attributes + 0x000004a0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + .gnu.attributes + 0x000004b0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + .gnu.attributes + 0x000004c0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + .gnu.attributes + 0x000004d0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + .gnu.attributes + 0x000004e0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + .gnu.attributes + 0x000004f0 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + .gnu.attributes + 0x00000500 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + .gnu.attributes + 0x00000510 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +START GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdebug.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libdsp.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a +END GROUP +LOAD c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a +OUTPUT(dist/ChaletDuino_775F512H_/production/ChaletLora.X.production.elf elf32-tradlittlemips) +LOAD stack +LOAD data_init + +.reginfo 0x00000000 0x18 + .reginfo 0x00000000 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.stack 0xa0003798 0x400 + .stack 0xa0003798 0x400 stack + +.bss 0xa0002bb4 0x400 + .bss 0xa0002bb4 0x400 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + +.data 0xa0002fb4 0x554 + .data 0xa0002fb4 0x398 build/ChaletDuino_775F512H_/production/Source/Terminal.o + .data 0xa000334c 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa000334c _iob + .data 0xa00033ec 0x6c build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + .data 0xa0003458 0x58 build/ChaletDuino_775F512H_/production/Source/main.o + .data 0xa00034b0 0x58 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + +.bss 0xa0003508 0x74 + .bss 0xa0003508 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + 0xa0003508 _sibuf + 0xa0003528 _sobuf + .bss 0xa0003548 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + .bss 0xa0003564 0x10 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0xa0003564 __allocs + .bss 0xa0003574 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + .bss 0xa0003578 0x4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z1 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.data%z2 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.bss%z3 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.data%z4 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + +.bss%z5 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.data%z6 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + +.bss%z7 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.data%z8 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + +.bss%z9 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.data%z10 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.bss%z11 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.data%z12 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.bss%z13 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.data%z14 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.bss%z15 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.data%z16 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.bss%z17 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.data%z18 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.bss%z19 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.data%z20 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.bss%z21 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.data%z22 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.bss%z23 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z24 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.data%z25 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.bss%z26 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.data%z27 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.bss%z28 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.data%z29 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.bss%z30 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.data%z31 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.bss%z32 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.data%z33 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.bss%z34 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.data%z35 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.bss%z36 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.data%z37 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.bss%z38 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.data%z39 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.bss%z40 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z41 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.data%z42 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.bss%z43 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z44 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.data%z45 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.bss%z46 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.data%z47 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.bss%z48 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.data%z49 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.bss%z50 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.data%z51 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.bss%z52 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.data%z53 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.bss%z54 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.data%z55 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.bss%z56 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.data%z57 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.bss%z58 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z59 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.data%z60 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.bss%z61 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.data%z62 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.bss%z63 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.data%z64 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.bss%z65 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + +.data%z66 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + +.bss%z67 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.data%z68 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.bss%z69 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.data%z70 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.bss%z71 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.data%z72 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.bss%z73 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.data%z74 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.bss%z75 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.data%z76 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.bss%z77 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.data%z78 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.bss%z79 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.data%z80 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.bss%z81 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.data%z82 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.bss%z83 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.data%z84 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.bss%z85 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.data%z86 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.bss%z87 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.data%z88 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.bss%z89 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.data%z90 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.bss%z91 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.data%z92 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.bss%z93 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.data%z94 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.bss%z95 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.data%z96 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.bss%z97 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.data%z98 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.bss%z99 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.data%z100 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.bss%z101 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.data%z102 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.bss%z103 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.data%z104 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.bss%z105 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.data%z106 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.bss%z107 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.data%z108 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.bss%z109 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.data%z110 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.bss%z111 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.data%z112 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.bss%z113 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.data%z114 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.bss%z115 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.data%z116 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.bss%z117 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.data%z118 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.bss%z119 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.data%z120 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.bss%z121 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.data%z122 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.bss%z123 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.data%z124 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.bss%z125 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.data%z126 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.bss%z127 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.data%z128 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.bss%z129 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.data%z130 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.bss%z131 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.data%z132 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.bss%z133 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.data%z134 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.bss%z135 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.data%z136 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.bss%z137 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.data%z138 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.bss%z139 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.data%z140 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.bss%z141 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.data%z142 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.bss%z143 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.data%z144 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.bss%z145 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.data%z146 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.bss%z147 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.data%z148 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.bss%z149 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.data%z150 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.bss%z151 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.data%z152 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.bss%z153 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.data%z154 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.bss%z155 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.data%z156 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.bss%z157 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.data%z158 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.bss%z159 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.data%z160 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.bss%z161 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.data%z162 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.bss%z163 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.data%z164 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.bss%z165 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.data%z166 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.bss%z167 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.data%z168 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.bss%z169 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.data%z170 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.bss%z171 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.data%z172 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.bss%z173 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.data%z174 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.bss%z175 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.data%z176 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.bss%z177 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.data%z178 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.bss%z179 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.data%z180 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.bss%z181 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.data%z182 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.bss%z183 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.data%z184 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.bss%z185 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.data%z186 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.bss%z187 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.data%z188 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.bss%z189 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.data%z190 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.bss%z191 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.data%z192 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.bss%z193 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.data%z194 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.bss%z195 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.data%z196 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.bss%z197 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.data%z198 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + +.bss%z199 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.data%z200 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.bss%z201 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.data%z202 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.bss%z203 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.data%z204 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.bss%z205 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.data%z206 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + +.bss%z207 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.data%z208 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + +.bss%z209 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.data%z210 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + +.bss%z211 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.data%z212 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + +.bss%z213 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.data%z214 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.bss%z215 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.data%z216 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.bss%z217 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.data%z218 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.bss%z219 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.data%z220 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.bss%z221 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.data%z222 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.bss%z223 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.data%z224 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.bss%z225 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.data%z226 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.bss%z227 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.data%z228 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + +.bss%z229 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.data%z230 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.bss%z231 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + +.data%z232 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + +.bss%z233 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/I2C.o + +.data%z234 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/I2C.o + +.bss%z235 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ina219.o + +.data%z236 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ina219.o + +.bss%z237 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + +.bss%z238 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + +.data%z239 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + +.bss%z240 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + +.data%z241 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + +.bss%z242 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + +.data%z243 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + +.bss%z244 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/SPI.o + +.data%z245 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/SPI.o + +.bss%z246 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/timer.o + +.data%z247 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/timer.o + +.bss%z248 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/template.o + +.data%z249 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/template.o + +.bss%z250 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/system.o + +.data%z251 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/system.o + +.bss%z252 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/main.o + +.bss%z253 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/interrupts.o + +.data%z254 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/interrupts.o + +.bss%z255 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/exceptions.o + +.data%z256 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/exceptions.o + +.bss%z257 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/Util.o + +.data%z258 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/Util.o + +.bss%z259 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/Uart.o + +.data%z260 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/Uart.o + +.bss%z261 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/Terminal.o + +.bss%z262 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + +.data%z263 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + +.bss%z264 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + +.data%z265 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/InternalUart.o + +.bss%z266 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + +.data%z267 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + +.bss%z268 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + +.data%z269 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + +.bss%z270 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.data%z271 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + +.bss%z272 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + +.data%z273 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + +.bss%z274 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.data%z275 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.bss%z276 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.data%z277 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.bss%z278 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.data%z279 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.bss%z280 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.data%z281 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + +.bss%z282 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.data%z283 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + +.bss%z284 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.data%z285 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + +.bss%z286 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.data%z287 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + +.bss%z288 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.data%z289 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + +.bss%z290 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.data%z291 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + +.bss%z292 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.data%z293 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + +.bss%z294 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.data%z295 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + +.bss%z296 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.data%z297 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.bss%z298 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.data%z299 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.bss%z300 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.data%z301 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + +.bss%z302 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.data%z303 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + +.bss%z304 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.data%z305 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + +.bss%z306 0x00000000 0x0 + .bss 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + +.data%z307 0x00000000 0x0 + .data 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + +.bss%z308 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.data%z309 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.bss%z310 0x00000000 0x0 + .bss 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +.data%z311 0x00000000 0x0 + .data 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + +._debug_exception + 0xbfc00480 0x2c + ._debug_exception + 0xbfc00480 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + 0xbfc00480 __DbgExecReturn + +.text 0x9d003800 0x8e68 + .text 0x9d003800 0x2904 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_wifi.o + 0x9d003fb4 m2m_wifi_download_mode + 0x9d0042f4 m2m_wifi_ble_set_gain_table + 0x9d004368 m2m_wifi_init_hold + 0x9d0043ac m2m_wifi_init_start + 0x9d0044f8 m2m_wifi_init + 0x9d004554 m2m_wifi_deinit + 0x9d00459c m2m_wifi_reinit_hold + 0x9d0045d8 m2m_wifi_reinit_start + 0x9d004610 m2m_wifi_reinit + 0x9d004670 m2m_wifi_yield + 0x9d0046a0 m2m_wifi_handle_events + 0x9d0046d4 m2m_wifi_default_connect + 0x9d004720 m2m_wifi_connect + 0x9d004794 m2m_wifi_connect_sc + 0x9d004bd8 m2m_wifi_disconnect + 0x9d004c24 m2m_wifi_set_mac_address + 0x9d004c90 m2m_wifi_set_static_ip + 0x9d004d24 m2m_wifi_request_dhcp_client + 0x9d004d48 m2m_wifi_request_dhcp_server + 0x9d004d70 m2m_wifi_enable_dhcp + 0x9d004de8 m2m_wifi_set_lsn_int + 0x9d004e3c m2m_wifi_set_cust_InfoElement + 0x9d004e9c m2m_wifi_set_scan_options + 0x9d004f14 m2m_wifi_set_scan_region + 0x9d004f84 m2m_wifi_request_scan + 0x9d00502c m2m_wifi_request_scan_passive + 0x9d0050d4 m2m_wifi_wps + 0x9d005160 m2m_wifi_wps_disable + 0x9d0051b8 m2m_wifi_p2p + 0x9d005264 m2m_wifi_p2p_disconnect + 0x9d0052bc m2m_wifi_enable_ap + 0x9d005334 m2m_wifi_disable_ap + 0x9d00538c m2m_wifi_req_curr_rssi + 0x9d0053e4 m2m_wifi_req_restrict_ble + 0x9d00543c m2m_wifi_req_unrestrict_ble + 0x9d005494 m2m_wifi_send_ethernet_pkt + 0x9d005534 m2m_wifi_get_otp_mac_address + 0x9d0055b0 m2m_wifi_get_mac_address + 0x9d005624 m2m_wifi_req_scan_result + 0x9d005690 m2m_wifi_get_num_ap_found + 0x9d0056b8 m2m_wifi_get_sleep_mode + 0x9d0056e8 m2m_wifi_set_sleep_mode + 0x9d005774 m2m_wifi_request_sleep + 0x9d0057f8 m2m_wifi_set_device_name + 0x9d005894 m2m_wifi_get_chipId + 0x9d0058c4 m2m_wifi_get_firmware_version + 0x9d005928 m2m_wifi_check_ota_rb + 0x9d005994 m2m_ota_get_firmware_version + 0x9d0059f8 m2m_wifi_enable_monitoring_mode + 0x9d005aac m2m_wifi_disable_monitoring_mode + 0x9d005af8 m2m_wifi_send_wlan_pkt + 0x9d005b94 m2m_wifi_start_provision_mode + 0x9d005c8c m2m_wifi_stop_provision_mode + 0x9d005cd8 m2m_wifi_get_connection_info + 0x9d005d24 m2m_wifi_set_sytem_time + 0x9d005d78 m2m_wifi_get_sytem_time + 0x9d005dc4 m2m_wifi_enable_sntp + 0x9d005e3c m2m_wifi_set_power_profile + 0x9d005ea8 m2m_wifi_set_tx_power + 0x9d005f14 m2m_wifi_enable_firmware_logs + 0x9d005f80 m2m_wifi_set_battery_voltage + 0x9d005ff0 m2m_wifi_prng_get_random_bytes + 0x9d006090 m2m_wifi_ble_api_send + .text 0x9d006104 0x2140 build/ChaletDuino_775F512H_/production/Source/winc3400/socket/source/socket.o + 0x9d006104 Socket_ReadSocketData + 0x9d006a3c socketInit + 0x9d006ab0 socketDeinit + 0x9d006b10 registerSocketCallback + 0x9d006b48 socket + 0x9d006dd0 bind + 0x9d006f00 listen + 0x9d006fe8 accept + 0x9d00705c connect + 0x9d0071d4 send + 0x9d007378 sendto + 0x9d007510 recv + 0x9d0076f8 close + 0x9d007838 recvfrom + 0x9d007a28 nmi_inet_addr + 0x9d007b9c gethostbyname + 0x9d007fd4 setsockopt + 0x9d008160 getsockopt + 0x9d00819c m2m_ping_req + .text 0x9d008244 0x1a7c build/ChaletDuino_775F512H_/production/Source/Uart.o + 0x9d008244 InitUart + 0x9d0084f4 UartResetPort + 0x9d0087a8 UartOpenComPort + 0x9d008998 UartReceiveData + 0x9d008ae4 UartGetPendingDataSize + 0x9d008bdc UartTransmitData + 0x9d009320 DataSentNotification + 0x9d0095f4 UartTick + 0x9d009bcc UartBlockAndTick + 0x9d009c2c UartBlockUntillBufEmpty + .text 0x9d009cc0 0x1584 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmasic.o + 0x9d009cc0 chip_apply_conf + 0x9d009d74 nm_clkless_wake + 0x9d009fb4 chip_idle + 0x9d00a028 enable_rf_blocks + 0x9d00a0c8 enable_interrupts + 0x9d00a1d0 cpu_start + 0x9d00a34c nmi_get_chipid + 0x9d00a564 nmi_get_rfrevid + 0x9d00a5bc restore_pmu_settings_after_global_reset + 0x9d00a610 nmi_update_pll + 0x9d00a684 nmi_set_sys_clk_src_to_xo + 0x9d00a6e0 chip_wake + 0x9d00a734 chip_reset_and_cpu_halt + 0x9d00a8c8 chip_reset + 0x9d00a930 wait_for_bootrom + 0x9d00aabc wait_for_firmware_start + 0x9d00abdc chip_deinit + 0x9d00acf8 set_gpio_dir + 0x9d00adcc set_gpio_val + 0x9d00aea0 get_gpio_val + 0x9d00af2c pullup_ctrl + 0x9d00afe4 nmi_get_otp_mac_address + 0x9d00b144 nmi_get_mac_address + .text 0x9d00b244 0x1424 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_hif.o + 0x9d00b37c hif_chip_wake + 0x9d00b448 hif_set_sleep_mode + 0x9d00b478 hif_get_sleep_mode + 0x9d00b4a0 hif_chip_sleep + 0x9d00b5c4 hif_init + 0x9d00b630 hif_deinit + 0x9d00b690 hif_check_compatibility + 0x9d00b708 hif_enable_access + 0x9d00b828 hif_check_code + 0x9d00b918 hif_send + 0x9d00c230 hif_yield + 0x9d00c258 hif_handle_isr + 0x9d00c324 hif_receive + 0x9d00c580 hif_register_cb + +.text._vfprintf_cdfFnopsuxX + 0x9d00c668 0x13d4 + .text._vfprintf_cdfFnopsuxX + 0x9d00c668 0x13d4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + 0x9d00c668 _vfprintf_cdfFnopsuxX + 0x9d00c668 _vfprintf_cdfFnopuxX + 0x9d00c668 _vfprintf_cdnopsuxX + 0x9d00c668 _vfprintf_cdnopuxX + +.text 0x9d00da3c 0x8a08 + .text 0x9d00da3c 0x11f8 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + 0x9d00e3f4 InitWiFi + 0x9d00e6dc TurnOFFWiFi + 0x9d00e770 CloseSockets + 0x9d00e7ac GetWiFiSate + 0x9d00e7d0 TickWiFi + 0x9d00e8b4 OpenTerminalServer + 0x9d00e970 SendTerminalData + 0x9d00e9f8 SentTerminalByte + 0x9d00ea74 OpenNetworkServer + 0x9d00eb30 SendNetworkData + 0x9d00ebb8 SentNetworkByte + .text 0x9d00ec34 0x1170 build/ChaletDuino_775F512H_/production/Source/winc3400/spi_flash/source/spi_flash.o + 0x9d00f934 spi_flash_read + 0x9d00fa0c spi_flash_write + 0x9d00fbd8 spi_flash_erase + 0x9d00fd24 spi_flash_get_size + .text 0x9d00fda4 0x1108 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + 0x9d010840 nm_spi_write_reg + 0x9d010918 nm_spi_write_block + 0x9d010a20 nm_spi_read_reg_with_ret + 0x9d010b6c nm_spi_read_block + 0x9d010d28 nm_spi_init + 0x9d010e40 nm_spi_deinit + 0x9d010e68 nm_spi_read_reg + .text 0x9d010eac 0xfac build/ChaletDuino_775F512H_/production/Source/InternalUart.o + 0x9d010eac InternalUartInit + 0x9d011164 OpenInternalPort + 0x9d011384 SendInternalUartData + 0x9d0116a0 SendInternalUartDataBlocking + 0x9d011734 TickInternalUart + 0x9d0117dc InternalUart1AInterrupt + 0x9d011a18 InternalUart2Interrupt + 0x9d011c38 ResetUart1 + 0x9d011d40 ResetUart2 + 0x9d011e38 process + .text 0x9d011e58 0xd20 build/ChaletDuino_775F512H_/production/Source/Terminal.o + 0x9d011e58 InitTerminal + 0x9d011ed8 TickTerminal + 0x9d011f34 RxTerminalBuf + 0x9d011fc0 RxTerminalData + 0x9d012110 ParseNewBuffer + 0x9d012ac4 TerminalPrintString + 0x9d012b18 TerminalPrintChar + 0x9d012b58 TerminalStateMachine + .text 0x9d012b78 0xce8 build/ChaletDuino_775F512H_/production/Source/Util.o + 0x9d012b78 SwapEndianShort + 0x9d012bc4 SwapEndianInt + 0x9d012c20 ConvertIntToStrLeadingZero + 0x9d013044 ConvertIntToStr + 0x9d013398 ConvertCharToStrLeadingZero + 0x9d013500 ConvertStrToValue + 0x9d0136ec ConvertCharToStr + 0x9d0137a4 Crc8 + 0x9d01383c Delay + .text 0x9d013860 0xbf4 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ssl.o + 0x9d013b6c m2m_ssl_handshake_rsp + 0x9d013be4 m2m_ssl_send_certs_to_winc + 0x9d013f2c m2m_ssl_retrieve_cert + 0x9d014268 m2m_ssl_retrieve_hash + 0x9d014328 m2m_ssl_stop_processing_certs + 0x9d014368 m2m_ssl_ecc_process_done + 0x9d01438c m2m_ssl_set_active_ciphersuites + 0x9d0143f4 m2m_ssl_init + .text 0x9d014454 0xb98 build/ChaletDuino_775F512H_/production/Source/timer.o + 0x9d014454 TimerInit + 0x9d014524 IsMilliSecTimerExpired + 0x9d01468c IsSecTimerExpired + 0x9d0147f0 IsTimerExpired + 0x9d014ba4 TimerStart + 0x9d014ccc TimerStartSeconds + 0x9d014d70 TimerReset + 0x9d014df4 IsTimerRunning + 0x9d014e38 TimerStop + 0x9d014e7c Sleep + 0x9d014ed8 Timer1MilliSecInterrupt + .text 0x9d014fec 0xae4 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + 0x9d014fec InitSPIFlash + 0x9d015160 SPIFlashCheckAndConfigure + 0x9d015230 SPIFlashWriteEnable + 0x9d015294 SPIFlashReadStatusReg + 0x9d01533c SPIFlashCheckBusy + 0x9d015398 SPIFlashCheckChipID + 0x9d0154d4 SPIFlashReadBuffer + 0x9d01564c SPIFlashEraseSector + 0x9d01577c SPIFlashWriteSectorWorkingBuffer + 0x9d015928 SPIFlashWriteBuffer + .text 0x9d015ad0 0x974 build/ChaletDuino_775F512H_/production/Source/NetworkProtocol.o + 0x9d015ad0 ProtocolInit + 0x9d015b00 StateMachine + 0x9d01607c ProtocolAnalyzeNewData + 0x9d0160bc ResetStateMachine + 0x9d016104 ProtocolExecCmd + 0x9d016140 ProtocolAcknowledge + 0x9d0161a4 ProtocolCalcCrc + 0x9d016220 ProtocolIsReceiving + 0x9d016260 ProtocolGetFrame + 0x9d01641c ProtocolMsgDataPtr + +.dinit 0x9d016444 0x880 + .dinit 0x9d016444 0x880 data_init + +.text._vfscanf_s + 0x9d016cc4 0x868 + .text._vfscanf_s + 0x9d016cc4 0x868 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + 0x9d016cc4 _vfscanf_s + 0x9d016cc4 _vfscanf_0 + +.text 0x9d01752c 0x37f8 + .text 0x9d01752c 0x740 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmdrv.o + 0x9d01752c nm_get_hif_info + 0x9d0175cc nm_get_firmware_full_info + 0x9d017760 nm_get_ota_firmware_info + 0x9d0178f4 nm_drv_init_download_mode + 0x9d017970 nm_drv_init_hold + 0x9d017a1c nm_drv_init_start + 0x9d017b50 nm_drv_init + 0x9d017bb4 nm_drv_deinit + 0x9d017c34 nm_cpu_start + .text 0x9d017c6c 0x654 build/ChaletDuino_775F512H_/production/Source/ina219.o + 0x9d017e74 ina219SetCalibration_13V_10A + 0x9d017ed8 ina219SetCalibration_32V_2A + 0x9d017f3c ina219SetCalibration_32V_1A + 0x9d017fa0 ina219SetCalibration_16V_500mA + 0x9d018004 ina219SetCalibration_16V_200mA + 0x9d018068 ina219Init + 0x9d0180e8 ina219GetShuntVoltage + 0x9d01812c ina219GetBusVoltage + 0x9d018180 ina219GetPower + 0x9d0181c4 ina219GetPower_mW + 0x9d018220 ina219GetCurrent + 0x9d018264 ina219GetCurrent_mA + .text 0x9d0182c0 0x5dc build/ChaletDuino_775F512H_/production/Source/LoraNetworkInterface.o + 0x9d0182c0 ExecuteMasterCommand + 0x9d0187f4 SendLoraNetworkCommand + .text 0x9d01889c 0x574 build/ChaletDuino_775F512H_/production/Source/I2C.o + 0x9d01889c I2CInit + 0x9d018908 I2CWrite + 0x9d018acc I2CTransmitByte + 0x9d018af8 I2CRead + 0x9d018dec I2CWasLastTransactionOK + .text 0x9d018e10 0x4f0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ota.o + 0x9d018f48 m2m_ota_init + 0x9d018fbc m2m_ota_notif_set_url + 0x9d019030 m2m_ota_notif_check_for_update + 0x9d019088 m2m_ota_notif_sched + 0x9d0190e4 m2m_ota_start_update + 0x9d019158 m2m_ota_rollback + 0x9d019200 m2m_ota_abort + 0x9d019258 m2m_ota_switch_firmware + .text 0x9d019300 0x4ac build/ChaletDuino_775F512H_/production/Source/main.o + 0x9d019300 main + 0x9d019760 _mon_putc + .text 0x9d0197ac 0x470 build/ChaletDuino_775F512H_/production/Source/ChaletduinoBoard.o + 0x9d0197ac InitBoard + .text 0x9d019c1c 0x45c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_umoddi3.o) + 0x9d019c1c __umoddi3 + .text 0x9d01a078 0x454 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmbus.o + 0x9d01a078 nm_bus_iface_init + 0x9d01a0c4 nm_bus_iface_deinit + 0x9d01a100 nm_bus_iface_reconfigure + 0x9d01a12c nm_read_reg + 0x9d01a164 nm_read_reg_with_ret + 0x9d01a1a4 nm_write_reg + 0x9d01a234 nm_read_block + 0x9d01a3a8 nm_write_block + .text 0x9d01a4cc 0x44c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_udivdi3.o) + 0x9d01a4cc __udivdi3 + .text 0x9d01a918 0x40c build/ChaletDuino_775F512H_/production/Source/winc3400/common/source/nm_common.o + 0x9d01a918 m2m_memcpy + 0x9d01a99c m2m_checksum + 0x9d01aa0c m2m_memset + 0x9d01aa84 m2m_strlen + 0x9d01aae0 m2m_strncmp + 0x9d01abb4 m2m_strstr + 0x9d01ac8c m2m_memcmp + +.rodata 0x9d01ad24 0x7c4 + .rodata 0x9d01ad24 0x404 build/ChaletDuino_775F512H_/production/Source/Util.o + 0x9d01ad28 CRC8_TABLE + .rodata 0x9d01b128 0x3c0 build/ChaletDuino_775F512H_/production/Source/Terminal.o + +.text 0x9d01b4e8 0xd64 + .text 0x9d01b4e8 0x398 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + 0x9d01b4e8 InitBatteryMonitor + 0x9d01b558 BatteryMonitorTick + 0x9d01b6f8 GetBatteryVoltage + 0x9d01b760 GetSolarPanelCurrent + 0x9d01b784 GetBatterySOC + 0x9d01b7a8 SendNetworkBatteryData + 0x9d01b85c GetCurrentModuleOK + .text 0x9d01b880 0x390 build/ChaletDuino_775F512H_/production/Source/winc3400/bus_wrapper/source/nm_bus_wrapper.o + 0x9d01b880 nm_spi_rw + 0x9d01ba40 nm_bus_init + 0x9d01bb2c nm_bus_ioctl + 0x9d01bbc0 nm_bus_deinit + 0x9d01bbe8 nm_bus_reinit + .text 0x9d01bc10 0x374 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_periph.o + 0x9d01be14 m2m_periph_init + 0x9d01be3c m2m_periph_gpio_set_dir + 0x9d01be94 m2m_periph_gpio_set_val + 0x9d01beec m2m_periph_gpio_get_val + 0x9d01bf3c m2m_periph_pullup_ctrl + .text 0x9d01bf84 0x2c8 build/ChaletDuino_775F512H_/production/Source/winc3400/bsp/source/nm_bsp.o + 0x9d01bf84 chip_isr + 0x9d01c0b4 nm_bsp_init + 0x9d01c0dc nm_bsp_deinit + 0x9d01c100 nm_bsp_reset + 0x9d01c188 nm_bsp_sleep + 0x9d01c1c0 nm_bsp_register_isr + 0x9d01c1ec nm_bsp_interrupt_ctrl + +.text.scale 0x9d01c24c 0x2a0 + .text.scale 0x9d01c24c 0x2a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.fpsubadd 0x9d01c4ec 0x278 + .text.fpsubadd + 0x9d01c4ec 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + 0x9d01c4ec __subsf3 + 0x9d01c4ec fpsub + 0x9d01c4f4 __addsf3 + 0x9d01c4f4 fpadd + +.text.malloc 0x9d01c764 0x278 + .text.malloc 0x9d01c764 0x278 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d01c764 malloc + +.text.fp32div 0x9d01c9dc 0x230 + .text.fp32div 0x9d01c9dc 0x230 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + 0x9d01c9dc fpdiv + 0x9d01c9dc __divsf3 + +.text 0x9d01cc0c 0x224 + .text 0x9d01cc0c 0x224 build/ChaletDuino_775F512H_/production/Source/ChaletPowerRelay.o + 0x9d01cc0c InitChaletPowerRelay + 0x9d01cc68 ChaletPowerRelayTick + 0x9d01cd30 ChaletPowerRelayKickTimer + 0x9d01cd68 ChaletPowerRelayTurnOn + 0x9d01cdb8 ChaletPowerRelayTurnOff + 0x9d01ce08 GetChaletPowerRelayState + +.text.__floatdisf + 0x9d01ce30 0x220 + .text.__floatdisf + 0x9d01ce30 0x220 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + 0x9d01ce30 __floatdisf + +.text.fp32mul 0x9d01d050 0x1bc + .text.fp32mul 0x9d01d050 0x1bc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + 0x9d01d050 __mulsf3 + 0x9d01d050 fpmul + +.text 0x9d01d20c 0x1a0 + .text 0x9d01d20c 0x1a0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strcpy.o) + 0x9d01d20c strcpy + +.text.realloc 0x9d01d3ac 0x194 + .text.realloc 0x9d01d3ac 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d01d3ac realloc + +.text._sbrk_init + 0x9d01d540 0x194 + .text._sbrk_init + 0x9d01d540 0x194 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d01d540 _sbrk_init + +.text._filbuf 0x9d01d6d4 0x188 + .text._filbuf 0x9d01d6d4 0x188 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + 0x9d01d6d4 _filbuf + +.rodata 0x9d01d85c 0x184 + .rodata 0x9d01d85c 0x184 build/ChaletDuino_775F512H_/production/Source/WiFiCtrl.o + +.text.read 0x9d01d9e0 0x174 + .text.read 0x9d01d9e0 0x174 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + 0x9d01d9e0 read + +.text 0x9d01db54 0x2d0 + .text 0x9d01db54 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memcpy.o) + 0x9d01db54 memcpy + .text 0x9d01dcbc 0x168 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(strlen.o) + 0x9d01dcbc strlen + +.text.fputc 0x9d01de24 0x15c + .text.fputc 0x9d01de24 0x15c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + 0x9d01de24 fputc + +.text._flsbuf 0x9d01df80 0x12c + .text._flsbuf 0x9d01df80 0x12c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + 0x9d01df80 _flsbuf + +.text.fgetc 0x9d01e0ac 0x108 + .text.fgetc 0x9d01e0ac 0x108 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + 0x9d01e0ac fgetc + +.rodata 0x9d01e1b4 0x204 + .rodata 0x9d01e1b4 0x104 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + 0x9d01e1b4 _ctype + .rodata 0x9d01e2b8 0x100 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmspi.o + +.text.setvbuf 0x9d01e3b8 0xfc + .text.setvbuf 0x9d01e3b8 0xfc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d01e3b8 setvbuf + +.rodata 0x9d01e4b8 0xe0 + .rodata 0x9d01e4b8 0xe0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text.general_exception + 0x9d01e598 0xdc + .text.general_exception + 0x9d01e598 0xdc c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + 0x9d01e598 _general_exception_context + +.text 0x9d01e674 0xd4 + .text 0x9d01e674 0xd4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + 0x9d01e674 __floatundisf + +.rodata 0x9d01e748 0xc8 + .rodata 0x9d01e748 0xc8 build/ChaletDuino_775F512H_/production/Source/SPI_Flash.o + +.text._sbrk 0x9d01e810 0xc4 + .text._sbrk 0x9d01e810 0xc4 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d01e810 _sbrk + +.text 0x9d01e8d4 0xa8 + .text 0x9d01e8d4 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(memset.o) + 0x9d01e8d4 memset + +.text.atoi 0x9d01e97c 0xa8 + .text.atoi 0x9d01e97c 0xa8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + 0x9d01e97c atoi + +.text.range 0x9d01ea24 0xa0 + .text.range 0x9d01ea24 0xa0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text.fpcmp 0x9d01eac4 0x9c + .text.fpcmp 0x9d01eac4 0x9c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + 0x9d01eac4 __eqsf2 + 0x9d01eac4 __lesf2 + 0x9d01eac4 __gtsf2 + 0x9d01eac4 __nesf2 + 0x9d01eac4 fpcmp + 0x9d01eac4 __gesf2 + 0x9d01eac4 __ltsf2 + +.text.fflush 0x9d01eb60 0x94 + .text.fflush 0x9d01eb60 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + 0x9d01eb60 fflush + +.text.write 0x9d01ebf4 0x94 + .text.write 0x9d01ebf4 0x94 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + 0x9d01ebf4 write + +.text.libm 0x9d01ec88 0x88 + .text.libm 0x9d01ec88 0x88 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + 0x9d01ec88 frexpf + 0x9d01ec88 fpfrexp + +.text 0x9d01ed10 0x80 + .text 0x9d01ed10 0x80 build/ChaletDuino_775F512H_/production/Source/winc3400/winc_init.o + 0x9d01ed10 wifi_init + +.text.fptoli 0x9d01ed90 0x80 + .text.fptoli 0x9d01ed90 0x80 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + 0x9d01ed90 fptoli + 0x9d01ed90 fptosi + 0x9d01ed90 __fixsfsi + +.text.fptoul 0x9d01ee10 0x7c + .text.fptoul 0x9d01ee10 0x7c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + 0x9d01ee10 fptoul + 0x9d01ee10 fptoui + 0x9d01ee10 __fixunssfsi + +.text.SoftReset + 0x9d01ee8c 0x78 + .text.SoftReset + 0x9d01ee8c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + 0x9d01ee8c SoftReset + +.text.fputs 0x9d01ef04 0x78 + .text.fputs 0x9d01ef04 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d01ef04 fputs + +.text.strncmp 0x9d01ef7c 0x78 + .text.strncmp 0x9d01ef7c 0x78 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + 0x9d01ef7c strncmp + +.text.ungetc 0x9d01eff4 0x74 + .text.ungetc 0x9d01eff4 0x74 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + 0x9d01eff4 ungetc + +.text 0x9d01f068 0xd8 + .text 0x9d01f068 0x70 build/ChaletDuino_775F512H_/production/Source/SPI.o + 0x9d01f068 SPITransaction + .text 0x9d01f0d8 0x68 build/ChaletDuino_775F512H_/production/Source/HarakiriRelay.o + 0x9d01f0d8 InitHarakiriRelay + 0x9d01f108 HarakiriRelayTurnOff + +.text._sprintf_cdfFnopuxX + 0x9d01f140 0x68 + .text._sprintf_cdfFnopuxX + 0x9d01f140 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + 0x9d01f140 _sprintf_cdnopuxX + 0x9d01f140 _sprintf_cdfFnopuxX + +.rodata 0x9d01f1a8 0x68 + .rodata 0x9d01f1a8 0x68 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + 0x9d01f1a8 _powers_f + 0x9d01f1dc _npowers_f + +.text.sitofp 0x9d01f210 0x60 + .text.sitofp 0x9d01f210 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + 0x9d01f210 sitofp + 0x9d01f210 litofp + 0x9d01f210 __floatsisf + +.text.wspace 0x9d01f270 0x60 + .text.wspace 0x9d01f270 0x60 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text 0x9d01f2d0 0x58 + .text 0x9d01f2d0 0x58 build/ChaletDuino_775F512H_/production/Source/exceptions.o + 0x9d01f2d0 _general_exception_handler + +.text._sscanf_s + 0x9d01f328 0x54 + .text._sscanf_s + 0x9d01f328 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + 0x9d01f328 _sscanf_s + 0x9d01f328 _sscanf_0 + +.text._bufallo 0x9d01f37c 0x54 + .text._bufallo + 0x9d01f37c 0x54 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d01f37c _bufallo + +.text.sbrk 0x9d01f3d0 0x50 + .text.sbrk 0x9d01f3d0 0x50 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d01f3d0 sbrk + +.text.main_entry + 0x9d01f420 0x4c + .text.main_entry + 0x9d01f420 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o + 0x9d01f44c __crt0_exit + +.text 0x9d01f46c 0x4c + .text 0x9d01f46c 0x4c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(floatunsisf.o) + 0x9d01f46c __floatunsisf + +.text._bootstrap_exception_handler + 0x9d01f4b8 0x48 + .text._bootstrap_exception_handler + 0x9d01f4b8 0x48 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + 0x9d01f4b8 _bootstrap_exception_handler + +.text 0x9d01f500 0x44 + .text 0x9d01f500 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\pic32_software_reset.o + 0x9d01f500 __pic32_software_reset + +.text.puts 0x9d01f544 0x44 + .text.puts 0x9d01f544 0x44 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + 0x9d01f544 puts + +.text._printf_cdnopsuxX + 0x9d01f588 0x40 + .text._printf_cdnopsuxX + 0x9d01f588 0x40 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + 0x9d01f588 _printf_cdnopuxX + 0x9d01f588 _printf_cdnopsuxX + +.vector_default + 0x9d01f5c8 0x38 + .vector_default + 0x9d01f5c8 0x38 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + 0x9d01f5c8 _DefaultInterrupt + +.text.INTConfigureSystem + 0x9d01f600 0x30 + .text.INTConfigureSystem + 0x9d01f600 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + 0x9d01f600 INTConfigureSystem + +.text.free 0x9d01f630 0x30 + .text.free 0x9d01f630 0x30 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + 0x9d01f630 free + +.text._stub_sbd_memlayout + 0x9d01f660 0x2c + .text._stub_sbd_memlayout + 0x9d01f660 0x2c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d01f660 _sbd_memlayout + 0x9d01f660 _stub_sbd_memlayout + +.rodata 0x9d01f68c 0x24 + .rodata 0x9d01f68c 0x24 build/ChaletDuino_775F512H_/production/Source/main.o + +.text.tolower 0x9d01f6b0 0x24 + .text.tolower 0x9d01f6b0 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f6b0 tolower + +.text.toupper 0x9d01f6d4 0x24 + .text.toupper 0x9d01f6d4 0x24 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f6d4 toupper + +.text 0x9d01f6f8 0x20 + .text 0x9d01f6f8 0x20 build/ChaletDuino_775F512H_/production/Source/DigitalIO.o + 0x9d01f6f8 InitDigitalIO + +.rodata 0x9d01f718 0x1c + .rodata 0x9d01f718 0x1c build/ChaletDuino_775F512H_/production/Source/Uart.o + +.text.INTRestoreInterrupts + 0x9d01f734 0x1c + .text.INTRestoreInterrupts + 0x9d01f734 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + 0x9d01f734 INTRestoreInterrupts + +.text.setbuf 0x9d01f750 0x1c + .text.setbuf 0x9d01f750 0x1c c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + 0x9d01f750 setbuf + +.rodata 0x9d01f76c 0x18 + .rodata 0x9d01f76c 0x18 build/ChaletDuino_775F512H_/production/Source/BatteryMonitor.o + +.text.CheKseg0CacheOff + 0x9d01f784 0x18 + .text.CheKseg0CacheOff + 0x9d01f784 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d01f784 CheKseg0CacheOff + +.text.CheKseg0CacheOn + 0x9d01f79c 0x18 + .text.CheKseg0CacheOn + 0x9d01f79c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + 0x9d01f79c CheKseg0CacheOn + +.text 0x9d01f7b4 0x18 + .text 0x9d01f7b4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-nmi-handler.o) + 0x9d01f7b4 _nmi_handler + +.text.isalnum 0x9d01f7cc 0x18 + .text.isalnum 0x9d01f7cc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f7cc isalnum + +.text.isalpha 0x9d01f7e4 0x18 + .text.isalpha 0x9d01f7e4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f7e4 isalpha + +.text.iscntrl 0x9d01f7fc 0x18 + .text.iscntrl 0x9d01f7fc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f7fc iscntrl + +.text.isdigit 0x9d01f814 0x18 + .text.isdigit 0x9d01f814 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f814 isdigit + +.text.isgraph 0x9d01f82c 0x18 + .text.isgraph 0x9d01f82c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f82c isgraph + +.text.islower 0x9d01f844 0x18 + .text.islower 0x9d01f844 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f844 islower + +.text.isprint 0x9d01f85c 0x18 + .text.isprint 0x9d01f85c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f85c isprint + +.text.ispunct 0x9d01f874 0x18 + .text.ispunct 0x9d01f874 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f874 ispunct + +.text.isspace 0x9d01f88c 0x18 + .text.isspace 0x9d01f88c 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f88c isspace + +.text.isupper 0x9d01f8a4 0x18 + .text.isupper 0x9d01f8a4 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f8a4 isupper + +.text.isxdigit 0x9d01f8bc 0x18 + .text.isxdigit + 0x9d01f8bc 0x18 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f8bc isxdigit + +.text._buffree 0x9d01f8d4 0x14 + .text._buffree + 0x9d01f8d4 0x14 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + 0x9d01f8d4 _buffree + +.rodata 0x9d01f8e8 0xc + .rodata 0x9d01f8e8 0xc build/ChaletDuino_775F512H_/production/Source/InternalUart.o + +.text.INTEnableInterrupts + 0x9d01f8f4 0x8 + .text.INTEnableInterrupts + 0x9d01f8f4 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + 0x9d01f8f4 INTEnableInterrupts + +.text.INTDisableInterrupts + 0x9d01f8fc 0x8 + .text.INTDisableInterrupts + 0x9d01f8fc 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + 0x9d01f8fc INTDisableInterrupts + +.text._on_reset + 0x9d01f904 0x8 + .text._on_reset + 0x9d01f904 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + 0x9d01f904 _on_reset + +.text._on_bootstrap + 0x9d01f90c 0x8 + .text._on_bootstrap + 0x9d01f90c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + 0x9d01f90c _on_bootstrap + +.text.isascii 0x9d01f914 0x8 + .text.isascii 0x9d01f914 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f914 isascii + +.text.toascii 0x9d01f91c 0x8 + .text.toascii 0x9d01f91c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f91c toascii + +.text._tolower 0x9d01f924 0x8 + .text._tolower + 0x9d01f924 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f924 _tolower + +.text._toupper 0x9d01f92c 0x8 + .text._toupper + 0x9d01f92c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + 0x9d01f92c _toupper + +.text.getpagesize + 0x9d01f934 0x8 + .text.getpagesize + 0x9d01f934 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + 0x9d01f934 getpagesize + +.rodata 0x9d01f93c 0x8 + .rodata 0x9d01f93c 0x8 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2\libgcc.a(_floatundisf.o) + +.text%z312 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doprnt_cdfFnopsuxX.eo) + +.text%z313 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libe.a(_floatdisf.o) + +.text%z314 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoul.o) + +.text%z315 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpfrexp.o) + +.text%z316 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fpcmp.o) + +.text%z317 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(xc32_uart.o) + +.text%z318 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(write.o) + +.text%z319 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(read.o) + +.text%z320 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(sbrk.o) + +.text%z321 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(filbuf.o) + +.text%z322 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ungetc.o) + +.text%z323 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(powersf.o) + +.text%z324 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctypef.o) + +.text%z325 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(ctype.o) + +.text%z326 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(atoi.o) + +.text%z327 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fgetc.o) + +.text%z328 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_flsbuf_simple.o) + +.text%z329 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(doscan_s.eo) + +.text%z330 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(errno.o) + +.text%z331 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(buf.o) + +.text%z332 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_fputc_simple.o) + +.text%z333 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sscanf_s.eo) + +.text%z334 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(sprintf_cdfFnopuxX.eo) + +.text%z335 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(printf_cdnopsuxX.eo) + +.text%z336 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(strncmp.o) + +.text%z337 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(setbuf.o) + +.text%z338 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(puts.o) + +.text%z339 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(malloc.o) + +.text%z340 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(fflush.o) + +.text%z341 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libc.a(_iob.o) + +.text%z342 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(sitofp.o) + +.text%z343 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fptoli.o) + +.text%z344 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32subadd.o) + +.text%z345 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32mul.o) + +.text%z346 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libm.a(fp32div.o) + +.text%z347 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(defaultinterrupt.o) + +.text%z348 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector63.o) + +.text%z349 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector62.o) + +.text%z350 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector61.o) + +.text%z351 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector60.o) + +.text%z352 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector59.o) + +.text%z353 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector58.o) + +.text%z354 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector57.o) + +.text%z355 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector56.o) + +.text%z356 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector55.o) + +.text%z357 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector54.o) + +.text%z358 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector53.o) + +.text%z359 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector52.o) + +.text%z360 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector51.o) + +.text%z361 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector50.o) + +.text%z362 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector49.o) + +.text%z363 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector48.o) + +.text%z364 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector47.o) + +.text%z365 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector46.o) + +.text%z366 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector45.o) + +.text%z367 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector44.o) + +.text%z368 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector43.o) + +.text%z369 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector42.o) + +.text%z370 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector41.o) + +.text%z371 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector40.o) + +.text%z372 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector39.o) + +.text%z373 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector38.o) + +.text%z374 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector37.o) + +.text%z375 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector36.o) + +.text%z376 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector35.o) + +.text%z377 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector34.o) + +.text%z378 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector33.o) + +.text%z379 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector31.o) + +.text%z380 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector30.o) + +.text%z381 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector29.o) + +.text%z382 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector28.o) + +.text%z383 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector27.o) + +.text%z384 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector26.o) + +.text%z385 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector25.o) + +.text%z386 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector23.o) + +.text%z387 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector22.o) + +.text%z388 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector21.o) + +.text%z389 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector20.o) + +.text%z390 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector19.o) + +.text%z391 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector18.o) + +.text%z392 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector17.o) + +.text%z393 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector16.o) + +.text%z394 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector15.o) + +.text%z395 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector14.o) + +.text%z396 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector13.o) + +.text%z397 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector12.o) + +.text%z398 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector11.o) + +.text%z399 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector10.o) + +.text%z400 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector9.o) + +.text%z401 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector8.o) + +.text%z402 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector7.o) + +.text%z403 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector6.o) + +.text%z404 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector5.o) + +.text%z405 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector2.o) + +.text%z406 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector1.o) + +.text%z407 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(vector0.o) + +.text%z408 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(general-exception.o) + +.text%z409 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-bootstrap.o) + +.text%z410 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-on-reset.o) + +.text%z411 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libpic32.a(default-bootstrap-exception-handler.o) + +.text%z412 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_restore_interrupts_lib.o) + +.text%z413 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_disable_interrupts_lib.o) + +.text%z414 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_enable_interrupts_lib.o) + +.text%z415 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(int_configure_system_lib.o) + +.text%z416 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(pcache.o) + +.text%z417 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\libmchp_peripheral_32MX795F512H.a(soft_reset_lib.o) + +.text%z418 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\processor.o + +.text%z419 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H\default_isr_vectors.o + +.text%z420 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/template.o + +.text%z421 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/system.o + +.text%z422 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/interrupts.o + +.text%z423 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmuart.o + +.text%z424 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/nmi2c.o + +.text%z425 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_crypto.o + +.text%z426 0x00000000 0x0 + .text 0x00000000 0x0 build/ChaletDuino_775F512H_/production/Source/winc3400/driver/source/m2m_ate_mode.o + +.text%z427 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib\debug-exception-return.o + +.text%z428 0x00000000 0x0 + .text 0x00000000 0x0 c:/program files/microchip/xc32/v1.33/bin/bin/../../lib/gcc/pic32mx/4.5.2/../../../../pic32mx/lib/./proc/32MX795F512H/crt0_mips32r2.o diff --git a/ChaloupeLora.X/elf32pic32mx.x b/ChaloupeLora.X/elf32pic32mx.x new file mode 100644 index 0000000..4d37b6e --- /dev/null +++ b/ChaloupeLora.X/elf32pic32mx.x @@ -0,0 +1,668 @@ +/* Default linker script, for normal executables */ +OUTPUT_FORMAT("elf32-tradlittlemips") +OUTPUT_ARCH(pic32mx) +ENTRY(_reset) +/* + * Provide for a minimum stack and heap size + * - _min_stack_size - represents the minimum space that must be made + * available for the stack. Can be overridden from + * the command line using the linker's --defsym option. + * - _min_heap_size - represents the minimum space that must be made + * available for the heap. Can be overridden from + * the command line using the linker's --defsym option. + */ +EXTERN (_min_stack_size _min_heap_size) +PROVIDE(_min_stack_size = 0x400) ; +/* PROVIDE(_min_heap_size = 0) ; Defined on the command line */ +INCLUDE procdefs.ld +PROVIDE(_DBG_CODE_ADDR = 0xBFC02000) ; +PROVIDE(_DBG_CODE_SIZE = 0xFF0) ; +SECTIONS +{ + /* Boot Sections */ + .reset _RESET_ADDR : + { + KEEP(*(.reset)) + /* KEEP(*(.reset.startup))*/ + } > kseg1_boot_mem + .bev_excpt _BEV_EXCPT_ADDR : + { + KEEP(*(.bev_handler)) + } > kseg1_boot_mem + .dbg_excpt _DBG_EXCPT_ADDR (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? 0x8 : 0x0); + } > kseg1_boot_mem + .dbg_code _DBG_CODE_ADDR (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0); + } > debug_exec_mem + .app_excpt _GEN_EXCPT_ADDR : + { + KEEP(*(.gen_handler)) + } > exception_mem + .vector_0 _ebase_address + 0x200 : + { + KEEP(*(.vector_0)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large") + .vector_1 _ebase_address + 0x200 + (_vector_spacing << 5) * 1 : + { + KEEP(*(.vector_1)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large") + .vector_2 _ebase_address + 0x200 + (_vector_spacing << 5) * 2 : + { + KEEP(*(.vector_2)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large") + .vector_3 _ebase_address + 0x200 + (_vector_spacing << 5) * 3 : + { + KEEP(*(.vector_3)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large") + .vector_4 _ebase_address + 0x200 + (_vector_spacing << 5) * 4 : + { + KEEP(*(.vector_4)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large") + .vector_5 _ebase_address + 0x200 + (_vector_spacing << 5) * 5 : + { + KEEP(*(.vector_5)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_5) <= (_vector_spacing << 5), "function at exception vector 5 too large") + .vector_6 _ebase_address + 0x200 + (_vector_spacing << 5) * 6 : + { + KEEP(*(.vector_6)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_6) <= (_vector_spacing << 5), "function at exception vector 6 too large") + .vector_7 _ebase_address + 0x200 + (_vector_spacing << 5) * 7 : + { + KEEP(*(.vector_7)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_7) <= (_vector_spacing << 5), "function at exception vector 7 too large") + .vector_8 _ebase_address + 0x200 + (_vector_spacing << 5) * 8 : + { + KEEP(*(.vector_8)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_8) <= (_vector_spacing << 5), "function at exception vector 8 too large") + .vector_9 _ebase_address + 0x200 + (_vector_spacing << 5) * 9 : + { + KEEP(*(.vector_9)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_9) <= (_vector_spacing << 5), "function at exception vector 9 too large") + .vector_10 _ebase_address + 0x200 + (_vector_spacing << 5) * 10 : + { + KEEP(*(.vector_10)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_10) <= (_vector_spacing << 5), "function at exception vector 10 too large") + .vector_11 _ebase_address + 0x200 + (_vector_spacing << 5) * 11 : + { + KEEP(*(.vector_11)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_11) <= (_vector_spacing << 5), "function at exception vector 11 too large") + .vector_12 _ebase_address + 0x200 + (_vector_spacing << 5) * 12 : + { + KEEP(*(.vector_12)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_12) <= (_vector_spacing << 5), "function at exception vector 12 too large") + .vector_13 _ebase_address + 0x200 + (_vector_spacing << 5) * 13 : + { + KEEP(*(.vector_13)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_13) <= (_vector_spacing << 5), "function at exception vector 13 too large") + .vector_14 _ebase_address + 0x200 + (_vector_spacing << 5) * 14 : + { + KEEP(*(.vector_14)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_14) <= (_vector_spacing << 5), "function at exception vector 14 too large") + .vector_15 _ebase_address + 0x200 + (_vector_spacing << 5) * 15 : + { + KEEP(*(.vector_15)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_15) <= (_vector_spacing << 5), "function at exception vector 15 too large") + .vector_16 _ebase_address + 0x200 + (_vector_spacing << 5) * 16 : + { + KEEP(*(.vector_16)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_16) <= (_vector_spacing << 5), "function at exception vector 16 too large") + .vector_17 _ebase_address + 0x200 + (_vector_spacing << 5) * 17 : + { + KEEP(*(.vector_17)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_17) <= (_vector_spacing << 5), "function at exception vector 17 too large") + .vector_18 _ebase_address + 0x200 + (_vector_spacing << 5) * 18 : + { + KEEP(*(.vector_18)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_18) <= (_vector_spacing << 5), "function at exception vector 18 too large") + .vector_19 _ebase_address + 0x200 + (_vector_spacing << 5) * 19 : + { + KEEP(*(.vector_19)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_19) <= (_vector_spacing << 5), "function at exception vector 19 too large") + .vector_20 _ebase_address + 0x200 + (_vector_spacing << 5) * 20 : + { + KEEP(*(.vector_20)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_20) <= (_vector_spacing << 5), "function at exception vector 20 too large") + .vector_21 _ebase_address + 0x200 + (_vector_spacing << 5) * 21 : + { + KEEP(*(.vector_21)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_21) <= (_vector_spacing << 5), "function at exception vector 21 too large") + .vector_22 _ebase_address + 0x200 + (_vector_spacing << 5) * 22 : + { + KEEP(*(.vector_22)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_22) <= (_vector_spacing << 5), "function at exception vector 22 too large") + .vector_23 _ebase_address + 0x200 + (_vector_spacing << 5) * 23 : + { + KEEP(*(.vector_23)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_23) <= (_vector_spacing << 5), "function at exception vector 23 too large") + .vector_24 _ebase_address + 0x200 + (_vector_spacing << 5) * 24 : + { + KEEP(*(.vector_24)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_24) <= (_vector_spacing << 5), "function at exception vector 24 too large") + .vector_25 _ebase_address + 0x200 + (_vector_spacing << 5) * 25 : + { + KEEP(*(.vector_25)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_25) <= (_vector_spacing << 5), "function at exception vector 25 too large") + .vector_26 _ebase_address + 0x200 + (_vector_spacing << 5) * 26 : + { + KEEP(*(.vector_26)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_26) <= (_vector_spacing << 5), "function at exception vector 26 too large") + .vector_27 _ebase_address + 0x200 + (_vector_spacing << 5) * 27 : + { + KEEP(*(.vector_27)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_27) <= (_vector_spacing << 5), "function at exception vector 27 too large") + .vector_28 _ebase_address + 0x200 + (_vector_spacing << 5) * 28 : + { + KEEP(*(.vector_28)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_28) <= (_vector_spacing << 5), "function at exception vector 28 too large") + .vector_29 _ebase_address + 0x200 + (_vector_spacing << 5) * 29 : + { + KEEP(*(.vector_29)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_29) <= (_vector_spacing << 5), "function at exception vector 29 too large") + .vector_30 _ebase_address + 0x200 + (_vector_spacing << 5) * 30 : + { + KEEP(*(.vector_30)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_30) <= (_vector_spacing << 5), "function at exception vector 30 too large") + .vector_31 _ebase_address + 0x200 + (_vector_spacing << 5) * 31 : + { + KEEP(*(.vector_31)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_31) <= (_vector_spacing << 5), "function at exception vector 31 too large") + .vector_32 _ebase_address + 0x200 + (_vector_spacing << 5) * 32 : + { + KEEP(*(.vector_32)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_32) <= (_vector_spacing << 5), "function at exception vector 32 too large") + .vector_33 _ebase_address + 0x200 + (_vector_spacing << 5) * 33 : + { + KEEP(*(.vector_33)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_33) <= (_vector_spacing << 5), "function at exception vector 33 too large") + .vector_34 _ebase_address + 0x200 + (_vector_spacing << 5) * 34 : + { + KEEP(*(.vector_34)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_34) <= (_vector_spacing << 5), "function at exception vector 34 too large") + .vector_35 _ebase_address + 0x200 + (_vector_spacing << 5) * 35 : + { + KEEP(*(.vector_35)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_35) <= (_vector_spacing << 5), "function at exception vector 35 too large") + .vector_36 _ebase_address + 0x200 + (_vector_spacing << 5) * 36 : + { + KEEP(*(.vector_36)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_36) <= (_vector_spacing << 5), "function at exception vector 36 too large") + .vector_37 _ebase_address + 0x200 + (_vector_spacing << 5) * 37 : + { + KEEP(*(.vector_37)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_37) <= (_vector_spacing << 5), "function at exception vector 37 too large") + .vector_38 _ebase_address + 0x200 + (_vector_spacing << 5) * 38 : + { + KEEP(*(.vector_38)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_38) <= (_vector_spacing << 5), "function at exception vector 38 too large") + .vector_39 _ebase_address + 0x200 + (_vector_spacing << 5) * 39 : + { + KEEP(*(.vector_39)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_39) <= (_vector_spacing << 5), "function at exception vector 39 too large") + .vector_40 _ebase_address + 0x200 + (_vector_spacing << 5) * 40 : + { + KEEP(*(.vector_40)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_40) <= (_vector_spacing << 5), "function at exception vector 40 too large") + .vector_41 _ebase_address + 0x200 + (_vector_spacing << 5) * 41 : + { + KEEP(*(.vector_41)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_41) <= (_vector_spacing << 5), "function at exception vector 41 too large") + .vector_42 _ebase_address + 0x200 + (_vector_spacing << 5) * 42 : + { + KEEP(*(.vector_42)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_42) <= (_vector_spacing << 5), "function at exception vector 42 too large") + .vector_43 _ebase_address + 0x200 + (_vector_spacing << 5) * 43 : + { + KEEP(*(.vector_43)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_43) <= (_vector_spacing << 5), "function at exception vector 43 too large") + .vector_44 _ebase_address + 0x200 + (_vector_spacing << 5) * 44 : + { + KEEP(*(.vector_44)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_44) <= (_vector_spacing << 5), "function at exception vector 44 too large") + .vector_45 _ebase_address + 0x200 + (_vector_spacing << 5) * 45 : + { + KEEP(*(.vector_45)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_45) <= (_vector_spacing << 5), "function at exception vector 45 too large") + .vector_46 _ebase_address + 0x200 + (_vector_spacing << 5) * 46 : + { + KEEP(*(.vector_46)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_46) <= (_vector_spacing << 5), "function at exception vector 46 too large") + .vector_47 _ebase_address + 0x200 + (_vector_spacing << 5) * 47 : + { + KEEP(*(.vector_47)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_47) <= (_vector_spacing << 5), "function at exception vector 47 too large") + .vector_48 _ebase_address + 0x200 + (_vector_spacing << 5) * 48 : + { + KEEP(*(.vector_48)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_48) <= (_vector_spacing << 5), "function at exception vector 48 too large") + .vector_49 _ebase_address + 0x200 + (_vector_spacing << 5) * 49 : + { + KEEP(*(.vector_49)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_49) <= (_vector_spacing << 5), "function at exception vector 49 too large") + .vector_50 _ebase_address + 0x200 + (_vector_spacing << 5) * 50 : + { + KEEP(*(.vector_50)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_50) <= (_vector_spacing << 5), "function at exception vector 50 too large") + .vector_51 _ebase_address + 0x200 + (_vector_spacing << 5) * 51 : + { + KEEP(*(.vector_51)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_51) <= (_vector_spacing << 5), "function at exception vector 51 too large") + .vector_52 _ebase_address + 0x200 + (_vector_spacing << 5) * 52 : + { + KEEP(*(.vector_52)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_52) <= (_vector_spacing << 5), "function at exception vector 52 too large") + .vector_53 _ebase_address + 0x200 + (_vector_spacing << 5) * 53 : + { + KEEP(*(.vector_53)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_53) <= (_vector_spacing << 5), "function at exception vector 53 too large") + .vector_54 _ebase_address + 0x200 + (_vector_spacing << 5) * 54 : + { + KEEP(*(.vector_54)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_54) <= (_vector_spacing << 5), "function at exception vector 54 too large") + .vector_55 _ebase_address + 0x200 + (_vector_spacing << 5) * 55 : + { + KEEP(*(.vector_55)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_55) <= (_vector_spacing << 5), "function at exception vector 55 too large") + .vector_56 _ebase_address + 0x200 + (_vector_spacing << 5) * 56 : + { + KEEP(*(.vector_56)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_56) <= (_vector_spacing << 5), "function at exception vector 56 too large") + .vector_57 _ebase_address + 0x200 + (_vector_spacing << 5) * 57 : + { + KEEP(*(.vector_57)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_57) <= (_vector_spacing << 5), "function at exception vector 57 too large") + .vector_58 _ebase_address + 0x200 + (_vector_spacing << 5) * 58 : + { + KEEP(*(.vector_58)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_58) <= (_vector_spacing << 5), "function at exception vector 58 too large") + .vector_59 _ebase_address + 0x200 + (_vector_spacing << 5) * 59 : + { + KEEP(*(.vector_59)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_59) <= (_vector_spacing << 5), "function at exception vector 59 too large") + .vector_60 _ebase_address + 0x200 + (_vector_spacing << 5) * 60 : + { + KEEP(*(.vector_60)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_60) <= (_vector_spacing << 5), "function at exception vector 60 too large") + .vector_61 _ebase_address + 0x200 + (_vector_spacing << 5) * 61 : + { + KEEP(*(.vector_61)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_61) <= (_vector_spacing << 5), "function at exception vector 61 too large") + .vector_62 _ebase_address + 0x200 + (_vector_spacing << 5) * 62 : + { + KEEP(*(.vector_62)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_62) <= (_vector_spacing << 5), "function at exception vector 62 too large") + .vector_63 _ebase_address + 0x200 + (_vector_spacing << 5) * 63 : + { + KEEP(*(.vector_63)) + } > exception_mem + ASSERT (_vector_spacing == 0 || SIZEOF(.vector_63) <= (_vector_spacing << 5), "function at exception vector 63 too large") + /* Starting with C32 v2.00, the startup code is in the .reset.startup section. + * Keep this here for backwards compatibility. + */ + .startup ORIGIN(kseg0_boot_mem) : + { + KEEP(*(.startup)) + KEEP(*(.reset.startup)) + } > kseg0_boot_mem + /* Code Sections - Note that input sections *(.text) and *(.text.*) + ** are not mapped here. Starting in C32 v2.00, the best-fit allocator + ** locates them, so that .text may flow around absolute sections + ** as needed. + */ + .text : + { + *(.stub .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + *(.mips16.fn.*) + *(.mips16.call.*) + *(.gnu.warning) + . = ALIGN(4) ; + } >kseg0_program_mem + /* Global-namespace object initialization */ + .init : + { + KEEP (*crti.o(.init)) + KEEP (*crtbegin.o(.init)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o *crtn.o ).init)) + KEEP (*crtend.o(.init)) + KEEP (*crtn.o(.init)) + . = ALIGN(4) ; + } >kseg0_program_mem + .fini : + { + KEEP (*(.fini)) + . = ALIGN(4) ; + } >kseg0_program_mem + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4) ; + } >kseg0_program_mem + .ctors : + { + /* XC32 uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4) ; + } >kseg0_program_mem + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4) ; + } >kseg0_program_mem + /* Read-only sections */ + .rodata : + { + *( .gnu.linkonce.r.*) + *(.rodata1) + . = ALIGN(4) ; + } >kseg0_program_mem + /* + * Small initialized constant global and static data can be placed in the + * .sdata2 section. This is different from .sdata, which contains small + * initialized non-constant global and static data. + */ + .sdata2 ALIGN(4) : + { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + . = ALIGN(4) ; + } >kseg0_program_mem + /* + * Uninitialized constant global and static data (i.e., variables which will + * always be zero). Again, this is different from .sbss, which contains + * small non-initialized, non-constant global and static data. + */ + .sbss2 ALIGN(4) : + { + *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) + . = ALIGN(4) ; + } >kseg0_program_mem + .eh_frame_hdr : + { + *(.eh_frame_hdr) + } >kseg0_program_mem + . = ALIGN(4) ; + .eh_frame : ONLY_IF_RO + { + KEEP (*(.eh_frame)) + } >kseg0_program_mem + . = ALIGN(4) ; + .gcc_except_table : ONLY_IF_RO + { + *(.gcc_except_table .gcc_except_table.*) + } >kseg0_program_mem + . = ALIGN(4) ; + .dbg_data (NOLOAD) : + { + . += (DEFINED (_DEBUGGER) ? 0x200 : 0x0); + } >kseg1_data_mem + .jcr : + { + KEEP (*(.jcr)) + . = ALIGN(4) ; + } >kseg1_data_mem + .eh_frame : ONLY_IF_RW + { + KEEP (*(.eh_frame)) + } >kseg1_data_mem + . = ALIGN(4) ; + .gcc_except_table : ONLY_IF_RW + { + *(.gcc_except_table .gcc_except_table.*) + } >kseg1_data_mem + . = ALIGN(4) ; + /* Persistent data - Use the new C 'persistent' attribute instead. */ + .persist : + { + _persist_begin = .; + *(.persist .persist.*) + *(.pbss .pbss.*) + . = ALIGN(4) ; + _persist_end = .; + } >kseg1_data_mem + /* + * Note that input sections named .data* are no longer mapped here. + * Starting in C32 v2.00, the best-fit allocator locates them, so + * that they may flow around absolute sections as needed. + */ + .data : + { + *( .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + *(.data1) + . = ALIGN(4) ; + } >kseg1_data_mem + . = .; + _gp = ALIGN(16) + 0x7ff0; + .got ALIGN(4) : + { + *(.got.plt) *(.got) + . = ALIGN(4) ; + } >kseg1_data_mem /* AT>kseg0_program_mem */ + /* + * Note that "small" data sections are still mapped in the linker + * script. This ensures that they are grouped together for + * gp-relative addressing. Absolute sections are allocated after + * the "small" data sections so small data cannot flow around them. + */ + /* + * We want the small data sections together, so single-instruction offsets + * can access them all, and initialized data all before uninitialized, so + * we can shorten the on-disk segment size. + */ + .sdata ALIGN(4) : + { + _sdata_begin = . ; + *(.sdata .sdata.* .gnu.linkonce.s.*) + . = ALIGN(4) ; + _sdata_end = . ; + } >kseg1_data_mem + .lit8 : + { + *(.lit8) + } >kseg1_data_mem + .lit4 : + { + *(.lit4) + } >kseg1_data_mem + . = ALIGN (4) ; + _data_end = . ; + _bss_begin = . ; + .sbss ALIGN(4) : + { + _sbss_begin = . ; + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + _sbss_end = . ; + . = ALIGN(4) ; + } >kseg1_data_mem + /* + * Align here to ensure that the .bss section occupies space up to + * _end. Align after .bss to ensure correct alignment even if the + * .bss section disappears because there are no input sections. + * + * Note that input sections named .bss* are no longer mapped here. + * Starting in C32 v2.00, the best-fit allocator locates them, so + * that they may flow around absolute sections as needed. + * + */ + .bss : + { + *(.dynbss) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(. != 0 ? 4 : 1); + } >kseg1_data_mem + . = ALIGN(4) ; + _end = . ; + _bss_end = . ; + /* Starting with C32 v2.00, the heap and stack are dynamically + * allocated by the linker. + */ + /* + * RAM functions go at the end of our stack and heap allocation. + * Alignment of 2K required by the boundary register (BMXDKPBA). + * + * RAM functions are now allocated by the linker. The linker generates + * _ramfunc_begin and _bmxdkpba_address symbols depending on the + * location of RAM functions. + */ + _bmxdudba_address = LENGTH(kseg1_data_mem) ; + _bmxdupba_address = LENGTH(kseg1_data_mem) ; + /* The .pdr section belongs in the absolute section */ + /DISCARD/ : { *(.pdr) } + .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } + .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } + .mdebug.abi32 : { KEEP(*(.mdebug.abi32)) } + .mdebug.abiN32 : { KEEP(*(.mdebug.abiN32)) } + .mdebug.abi64 : { KEEP(*(.mdebug.abi64)) } + .mdebug.abiO64 : { KEEP(*(.mdebug.abiO64)) } + .mdebug.eabi32 : { KEEP(*(.mdebug.eabi32)) } + .mdebug.eabi64 : { KEEP(*(.mdebug.eabi64)) } + .gcc_compiled_long32 : { KEEP(*(.gcc_compiled_long32)) } + .gcc_compiled_long64 : { KEEP(*(.gcc_compiled_long64)) } + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /DISCARD/ : { *(.rel.dyn) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) *(.discard) } +} diff --git a/ChaloupeLora.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk b/ChaloupeLora.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk new file mode 100644 index 0000000..7ce32a2 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Makefile-ChaletDuinoV2_795F512H_.mk @@ -0,0 +1,782 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Include project Makefile +ifeq "${IGNORE_LOCAL}" "TRUE" +# do not include local makefile. User is passing all local related variables already +else +include Makefile +# Include makefile containing local settings +ifeq "$(wildcard nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk)" "nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk" +include nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk +endif +endif + +# Environment +MKDIR=gnumkdir -p +RM=rm -f +MV=mv +CP=cp + +# Macros +CND_CONF=ChaletDuinoV2_795F512H_ +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +IMAGE_TYPE=debug +OUTPUT_SUFFIX=elf +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +else +IMAGE_TYPE=production +OUTPUT_SUFFIX=hex +DEBUGGABLE_SUFFIX=elf +FINAL_IMAGE=dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +endif + +ifeq ($(COMPARE_BUILD), true) +COMPARISON_BUILD= +else +COMPARISON_BUILD= +endif + +ifdef SUB_IMAGE_ADDRESS + +else +SUB_IMAGE_ADDRESS_COMMAND= +endif + +# Object Directory +OBJECTDIR=build/${CND_CONF}/${IMAGE_TYPE} + +# Distribution Directory +DISTDIR=dist/${CND_CONF}/${IMAGE_TYPE} + +# Source Files Quoted if spaced +SOURCEFILES_QUOTED_IF_SPACED=Source/ChaletduinoV2Board.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/InternalUart.c Source/NetworkProtocol.c Source/Terminal.c Source/Uart.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/LoraNetworkInterface.c Source/ChaletPowerRelay.c Source/HarakiriRelay.c Source/BatteryMonitor.c Source/ina219.c Source/I2C.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/TemperatureSensor.c Source/TC77.c Source/BootloaderProtocol.c Source/crc32.c Source/LoraWatchdog.c + +# Object Files Quoted if spaced +OBJECTFILES_QUOTED_IF_SPACED=${OBJECTDIR}/Source/ChaletduinoV2Board.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/InternalUart.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Uart.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/LoraNetworkInterface.o ${OBJECTDIR}/Source/ChaletPowerRelay.o ${OBJECTDIR}/Source/HarakiriRelay.o ${OBJECTDIR}/Source/BatteryMonitor.o ${OBJECTDIR}/Source/ina219.o ${OBJECTDIR}/Source/I2C.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/TemperatureSensor.o ${OBJECTDIR}/Source/TC77.o ${OBJECTDIR}/Source/BootloaderProtocol.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/LoraWatchdog.o +POSSIBLE_DEPFILES=${OBJECTDIR}/Source/ChaletduinoV2Board.o.d ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d ${OBJECTDIR}/Source/DigitalIO.o.d ${OBJECTDIR}/Source/InternalUart.o.d ${OBJECTDIR}/Source/NetworkProtocol.o.d ${OBJECTDIR}/Source/Terminal.o.d ${OBJECTDIR}/Source/Uart.o.d ${OBJECTDIR}/Source/Util.o.d ${OBJECTDIR}/Source/exceptions.o.d ${OBJECTDIR}/Source/interrupts.o.d ${OBJECTDIR}/Source/main.o.d ${OBJECTDIR}/Source/system.o.d ${OBJECTDIR}/Source/template.o.d ${OBJECTDIR}/Source/timer.o.d ${OBJECTDIR}/Source/WiFiCtrl.o.d ${OBJECTDIR}/Source/SPI.o.d ${OBJECTDIR}/Source/LoraNetworkInterface.o.d ${OBJECTDIR}/Source/ChaletPowerRelay.o.d ${OBJECTDIR}/Source/HarakiriRelay.o.d ${OBJECTDIR}/Source/BatteryMonitor.o.d ${OBJECTDIR}/Source/ina219.o.d ${OBJECTDIR}/Source/I2C.o.d ${OBJECTDIR}/Source/SPI_Flash.o.d ${OBJECTDIR}/Source/Syslog.o.d ${OBJECTDIR}/Source/Watchdog.o.d ${OBJECTDIR}/Source/BootloaderInterface.o.d ${OBJECTDIR}/Source/TemperatureSensor.o.d ${OBJECTDIR}/Source/TC77.o.d ${OBJECTDIR}/Source/BootloaderProtocol.o.d ${OBJECTDIR}/Source/crc32.o.d ${OBJECTDIR}/Source/LoraWatchdog.o.d + +# Object Files +OBJECTFILES=${OBJECTDIR}/Source/ChaletduinoV2Board.o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o ${OBJECTDIR}/Source/DigitalIO.o ${OBJECTDIR}/Source/InternalUart.o ${OBJECTDIR}/Source/NetworkProtocol.o ${OBJECTDIR}/Source/Terminal.o ${OBJECTDIR}/Source/Uart.o ${OBJECTDIR}/Source/Util.o ${OBJECTDIR}/Source/exceptions.o ${OBJECTDIR}/Source/interrupts.o ${OBJECTDIR}/Source/main.o ${OBJECTDIR}/Source/system.o ${OBJECTDIR}/Source/template.o ${OBJECTDIR}/Source/timer.o ${OBJECTDIR}/Source/WiFiCtrl.o ${OBJECTDIR}/Source/SPI.o ${OBJECTDIR}/Source/LoraNetworkInterface.o ${OBJECTDIR}/Source/ChaletPowerRelay.o ${OBJECTDIR}/Source/HarakiriRelay.o ${OBJECTDIR}/Source/BatteryMonitor.o ${OBJECTDIR}/Source/ina219.o ${OBJECTDIR}/Source/I2C.o ${OBJECTDIR}/Source/SPI_Flash.o ${OBJECTDIR}/Source/Syslog.o ${OBJECTDIR}/Source/Watchdog.o ${OBJECTDIR}/Source/BootloaderInterface.o ${OBJECTDIR}/Source/TemperatureSensor.o ${OBJECTDIR}/Source/TC77.o ${OBJECTDIR}/Source/BootloaderProtocol.o ${OBJECTDIR}/Source/crc32.o ${OBJECTDIR}/Source/LoraWatchdog.o + +# Source Files +SOURCEFILES=Source/ChaletduinoV2Board.c Source/winc3400_142/common/source/nm_common.c Source/winc3400_142/driver/source/m2m_flash.c Source/winc3400_142/driver/source/m2m_hif.c Source/winc3400_142/driver/source/m2m_ota.c Source/winc3400_142/driver/source/m2m_periph.c Source/winc3400_142/driver/source/m2m_ssl.c Source/winc3400_142/driver/source/m2m_wifi.c Source/winc3400_142/driver/source/nmasic.c Source/winc3400_142/driver/source/nmbus.c Source/winc3400_142/driver/source/nmdrv.c Source/winc3400_142/driver/source/nmspi.c Source/winc3400_142/socket/source/inet_addr.c Source/winc3400_142/socket/source/inet_ntop.c Source/winc3400_142/socket/source/socket.c Source/winc3400_142/spi_flash/source/spi_flash.c Source/DigitalIO.c Source/InternalUart.c Source/NetworkProtocol.c Source/Terminal.c Source/Uart.c Source/Util.c Source/exceptions.c Source/interrupts.c Source/main.c Source/system.c Source/template.c Source/timer.c Source/WiFiCtrl.c Source/SPI.c Source/LoraNetworkInterface.c Source/ChaletPowerRelay.c Source/HarakiriRelay.c Source/BatteryMonitor.c Source/ina219.c Source/I2C.c Source/SPI_Flash.c Source/Syslog.c Source/Watchdog.c Source/BootloaderInterface.c Source/TemperatureSensor.c Source/TC77.c Source/BootloaderProtocol.c Source/crc32.c Source/LoraWatchdog.c + + + +CFLAGS= +ASFLAGS= +LDLIBSOPTIONS= + +############# Tool locations ########################################## +# If you copy a project from one host to another, the path where the # +# compiler is installed may be different. # +# If you open this project with MPLAB X in the new host, this # +# makefile will be regenerated and the paths will be corrected. # +####################################################################### +# fixDeps replaces a bunch of sed/cat/printf statements that slow down the build +FIXDEPS=fixDeps + +.build-conf: ${BUILD_SUBPROJECTS} +ifneq ($(INFORMATION_MESSAGE), ) + @echo $(INFORMATION_MESSAGE) +endif + ${MAKE} -f nbproject/Makefile-ChaletDuinoV2_795F512H_.mk dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} + +MP_PROCESSOR_OPTION=32MX795F512H +MP_LINKER_FILE_OPTION=,--script="elf32pic32mx.x" +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assemble +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: assembleWithPreprocess +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compile +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +${OBJECTDIR}/Source/ChaletduinoV2Board.o: Source/ChaletduinoV2Board.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" -o ${OBJECTDIR}/Source/ChaletduinoV2Board.o Source/ChaletduinoV2Board.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/DigitalIO.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/InternalUart.o: Source/InternalUart.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/InternalUart.o.d + @${RM} ${OBJECTDIR}/Source/InternalUart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/InternalUart.o.d" -o ${OBJECTDIR}/Source/InternalUart.o Source/InternalUart.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/InternalUart.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/NetworkProtocol.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Terminal.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Uart.o: Source/Uart.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Uart.o.d + @${RM} ${OBJECTDIR}/Source/Uart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Uart.o.d" -o ${OBJECTDIR}/Source/Uart.o Source/Uart.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Uart.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Util.o: Source/Util.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Util.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/exceptions.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/interrupts.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/main.o: Source/main.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/system.o: Source/system.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/system.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/template.o: Source/template.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/template.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/timer.o: Source/timer.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/timer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/WiFiCtrl.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/SPI.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/LoraNetworkInterface.o: Source/LoraNetworkInterface.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o.d + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" -o ${OBJECTDIR}/Source/LoraNetworkInterface.o Source/LoraNetworkInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/ChaletPowerRelay.o: Source/ChaletPowerRelay.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o.d + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" -o ${OBJECTDIR}/Source/ChaletPowerRelay.o Source/ChaletPowerRelay.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/HarakiriRelay.o: Source/HarakiriRelay.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o.d + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/HarakiriRelay.o.d" -o ${OBJECTDIR}/Source/HarakiriRelay.o Source/HarakiriRelay.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/HarakiriRelay.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BatteryMonitor.o: Source/BatteryMonitor.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o.d + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BatteryMonitor.o.d" -o ${OBJECTDIR}/Source/BatteryMonitor.o Source/BatteryMonitor.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BatteryMonitor.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/ina219.o: Source/ina219.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ina219.o.d + @${RM} ${OBJECTDIR}/Source/ina219.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ina219.o.d" -o ${OBJECTDIR}/Source/ina219.o Source/ina219.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ina219.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/I2C.o: Source/I2C.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/I2C.o.d + @${RM} ${OBJECTDIR}/Source/I2C.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/I2C.o.d" -o ${OBJECTDIR}/Source/I2C.o Source/I2C.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/I2C.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/SPI_Flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Syslog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Watchdog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BootloaderInterface.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/TemperatureSensor.o: Source/TemperatureSensor.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o.d + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/TemperatureSensor.o.d" -o ${OBJECTDIR}/Source/TemperatureSensor.o Source/TemperatureSensor.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/TemperatureSensor.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/TC77.o: Source/TC77.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TC77.o.d + @${RM} ${OBJECTDIR}/Source/TC77.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/TC77.o.d" -o ${OBJECTDIR}/Source/TC77.o Source/TC77.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/TC77.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BootloaderProtocol.o: Source/BootloaderProtocol.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BootloaderProtocol.o.d" -o ${OBJECTDIR}/Source/BootloaderProtocol.o Source/BootloaderProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BootloaderProtocol.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/crc32.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/LoraWatchdog.o: Source/LoraWatchdog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o.d + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -D__DEBUG -D__MPLAB_DEBUGGER_ICD3=1 -fframe-base-loclist -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/LoraWatchdog.o.d" -o ${OBJECTDIR}/Source/LoraWatchdog.o Source/LoraWatchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/LoraWatchdog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +else +${OBJECTDIR}/Source/ChaletduinoV2Board.o: Source/ChaletduinoV2Board.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o.d + @${RM} ${OBJECTDIR}/Source/ChaletduinoV2Board.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" -o ${OBJECTDIR}/Source/ChaletduinoV2Board.o Source/ChaletduinoV2Board.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ChaletduinoV2Board.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o: Source/winc3400_142/common/source/nm_common.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/common/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" -o ${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o Source/winc3400_142/common/source/nm_common.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/common/source/nm_common.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o: Source/winc3400_142/driver/source/m2m_flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o Source/winc3400_142/driver/source/m2m_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o: Source/winc3400_142/driver/source/m2m_hif.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o Source/winc3400_142/driver/source/m2m_hif.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_hif.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o: Source/winc3400_142/driver/source/m2m_ota.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o Source/winc3400_142/driver/source/m2m_ota.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ota.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o: Source/winc3400_142/driver/source/m2m_periph.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o Source/winc3400_142/driver/source/m2m_periph.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_periph.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o: Source/winc3400_142/driver/source/m2m_ssl.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o Source/winc3400_142/driver/source/m2m_ssl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_ssl.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o: Source/winc3400_142/driver/source/m2m_wifi.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o Source/winc3400_142/driver/source/m2m_wifi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/m2m_wifi.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o: Source/winc3400_142/driver/source/nmasic.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o Source/winc3400_142/driver/source/nmasic.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmasic.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o: Source/winc3400_142/driver/source/nmbus.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o Source/winc3400_142/driver/source/nmbus.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmbus.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o: Source/winc3400_142/driver/source/nmdrv.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o Source/winc3400_142/driver/source/nmdrv.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmdrv.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o: Source/winc3400_142/driver/source/nmspi.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/driver/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" -o ${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o Source/winc3400_142/driver/source/nmspi.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/driver/source/nmspi.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o: Source/winc3400_142/socket/source/inet_addr.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o Source/winc3400_142/socket/source/inet_addr.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_addr.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o: Source/winc3400_142/socket/source/inet_ntop.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o Source/winc3400_142/socket/source/inet_ntop.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/inet_ntop.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o: Source/winc3400_142/socket/source/socket.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/socket/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" -o ${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o Source/winc3400_142/socket/source/socket.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/socket/source/socket.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o: Source/winc3400_142/spi_flash/source/spi_flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source" + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d + @${RM} ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" -o ${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o Source/winc3400_142/spi_flash/source/spi_flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/winc3400_142/spi_flash/source/spi_flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/DigitalIO.o: Source/DigitalIO.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/DigitalIO.o.d + @${RM} ${OBJECTDIR}/Source/DigitalIO.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/DigitalIO.o.d" -o ${OBJECTDIR}/Source/DigitalIO.o Source/DigitalIO.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/DigitalIO.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/InternalUart.o: Source/InternalUart.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/InternalUart.o.d + @${RM} ${OBJECTDIR}/Source/InternalUart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/InternalUart.o.d" -o ${OBJECTDIR}/Source/InternalUart.o Source/InternalUart.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/InternalUart.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/NetworkProtocol.o: Source/NetworkProtocol.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o.d + @${RM} ${OBJECTDIR}/Source/NetworkProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/NetworkProtocol.o.d" -o ${OBJECTDIR}/Source/NetworkProtocol.o Source/NetworkProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/NetworkProtocol.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Terminal.o: Source/Terminal.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Terminal.o.d + @${RM} ${OBJECTDIR}/Source/Terminal.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Terminal.o.d" -o ${OBJECTDIR}/Source/Terminal.o Source/Terminal.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Terminal.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Uart.o: Source/Uart.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Uart.o.d + @${RM} ${OBJECTDIR}/Source/Uart.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Uart.o.d" -o ${OBJECTDIR}/Source/Uart.o Source/Uart.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Uart.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Util.o: Source/Util.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Util.o.d + @${RM} ${OBJECTDIR}/Source/Util.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Util.o.d" -o ${OBJECTDIR}/Source/Util.o Source/Util.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Util.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/exceptions.o: Source/exceptions.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/exceptions.o.d + @${RM} ${OBJECTDIR}/Source/exceptions.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/exceptions.o.d" -o ${OBJECTDIR}/Source/exceptions.o Source/exceptions.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/exceptions.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/interrupts.o: Source/interrupts.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/interrupts.o.d + @${RM} ${OBJECTDIR}/Source/interrupts.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/interrupts.o.d" -o ${OBJECTDIR}/Source/interrupts.o Source/interrupts.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/interrupts.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/main.o: Source/main.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/main.o.d + @${RM} ${OBJECTDIR}/Source/main.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/main.o.d" -o ${OBJECTDIR}/Source/main.o Source/main.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/main.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/system.o: Source/system.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/system.o.d + @${RM} ${OBJECTDIR}/Source/system.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/system.o.d" -o ${OBJECTDIR}/Source/system.o Source/system.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/system.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/template.o: Source/template.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/template.o.d + @${RM} ${OBJECTDIR}/Source/template.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/template.o.d" -o ${OBJECTDIR}/Source/template.o Source/template.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/template.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/timer.o: Source/timer.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/timer.o.d + @${RM} ${OBJECTDIR}/Source/timer.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/timer.o.d" -o ${OBJECTDIR}/Source/timer.o Source/timer.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/timer.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/WiFiCtrl.o: Source/WiFiCtrl.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o.d + @${RM} ${OBJECTDIR}/Source/WiFiCtrl.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/WiFiCtrl.o.d" -o ${OBJECTDIR}/Source/WiFiCtrl.o Source/WiFiCtrl.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/WiFiCtrl.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/SPI.o: Source/SPI.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI.o.d + @${RM} ${OBJECTDIR}/Source/SPI.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/SPI.o.d" -o ${OBJECTDIR}/Source/SPI.o Source/SPI.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/SPI.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/LoraNetworkInterface.o: Source/LoraNetworkInterface.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o.d + @${RM} ${OBJECTDIR}/Source/LoraNetworkInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" -o ${OBJECTDIR}/Source/LoraNetworkInterface.o Source/LoraNetworkInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/LoraNetworkInterface.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/ChaletPowerRelay.o: Source/ChaletPowerRelay.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o.d + @${RM} ${OBJECTDIR}/Source/ChaletPowerRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" -o ${OBJECTDIR}/Source/ChaletPowerRelay.o Source/ChaletPowerRelay.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ChaletPowerRelay.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/HarakiriRelay.o: Source/HarakiriRelay.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o.d + @${RM} ${OBJECTDIR}/Source/HarakiriRelay.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/HarakiriRelay.o.d" -o ${OBJECTDIR}/Source/HarakiriRelay.o Source/HarakiriRelay.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/HarakiriRelay.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BatteryMonitor.o: Source/BatteryMonitor.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o.d + @${RM} ${OBJECTDIR}/Source/BatteryMonitor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BatteryMonitor.o.d" -o ${OBJECTDIR}/Source/BatteryMonitor.o Source/BatteryMonitor.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BatteryMonitor.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/ina219.o: Source/ina219.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/ina219.o.d + @${RM} ${OBJECTDIR}/Source/ina219.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/ina219.o.d" -o ${OBJECTDIR}/Source/ina219.o Source/ina219.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/ina219.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/I2C.o: Source/I2C.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/I2C.o.d + @${RM} ${OBJECTDIR}/Source/I2C.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/I2C.o.d" -o ${OBJECTDIR}/Source/I2C.o Source/I2C.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/I2C.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/SPI_Flash.o: Source/SPI_Flash.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o.d + @${RM} ${OBJECTDIR}/Source/SPI_Flash.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/SPI_Flash.o.d" -o ${OBJECTDIR}/Source/SPI_Flash.o Source/SPI_Flash.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/SPI_Flash.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Syslog.o: Source/Syslog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Syslog.o.d + @${RM} ${OBJECTDIR}/Source/Syslog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Syslog.o.d" -o ${OBJECTDIR}/Source/Syslog.o Source/Syslog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Syslog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/Watchdog.o: Source/Watchdog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/Watchdog.o.d + @${RM} ${OBJECTDIR}/Source/Watchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/Watchdog.o.d" -o ${OBJECTDIR}/Source/Watchdog.o Source/Watchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/Watchdog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BootloaderInterface.o: Source/BootloaderInterface.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderInterface.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BootloaderInterface.o.d" -o ${OBJECTDIR}/Source/BootloaderInterface.o Source/BootloaderInterface.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BootloaderInterface.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/TemperatureSensor.o: Source/TemperatureSensor.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o.d + @${RM} ${OBJECTDIR}/Source/TemperatureSensor.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/TemperatureSensor.o.d" -o ${OBJECTDIR}/Source/TemperatureSensor.o Source/TemperatureSensor.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/TemperatureSensor.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/TC77.o: Source/TC77.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/TC77.o.d + @${RM} ${OBJECTDIR}/Source/TC77.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/TC77.o.d" -o ${OBJECTDIR}/Source/TC77.o Source/TC77.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/TC77.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/BootloaderProtocol.o: Source/BootloaderProtocol.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o.d + @${RM} ${OBJECTDIR}/Source/BootloaderProtocol.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/BootloaderProtocol.o.d" -o ${OBJECTDIR}/Source/BootloaderProtocol.o Source/BootloaderProtocol.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/BootloaderProtocol.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/crc32.o: Source/crc32.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/crc32.o.d + @${RM} ${OBJECTDIR}/Source/crc32.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/crc32.o.d" -o ${OBJECTDIR}/Source/crc32.o Source/crc32.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/crc32.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +${OBJECTDIR}/Source/LoraWatchdog.o: Source/LoraWatchdog.c nbproject/Makefile-${CND_CONF}.mk + @${MKDIR} "${OBJECTDIR}/Source" + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o.d + @${RM} ${OBJECTDIR}/Source/LoraWatchdog.o + ${MP_CC} $(MP_EXTRA_CC_PRE) -g -x c -c -mprocessor=$(MP_PROCESSOR_OPTION) -I"Source" -I"Source/winc3400_142" -I"Source/winc3400_142/bsp/include" -I"Source/winc3400_142/common/include" -I"Source/winc3400_142/driver/include" -I"Source/winc3400_142/socket/include" -I"Source/winc3400_142/spi_flash/include" -DCHALETDUINO_V2_BRD -D_SUPPRESS_PLIB_WARNING -MMD -MF "${OBJECTDIR}/Source/LoraWatchdog.o.d" -o ${OBJECTDIR}/Source/LoraWatchdog.o Source/LoraWatchdog.c -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) + @${FIXDEPS} "${OBJECTDIR}/Source/LoraWatchdog.o.d" $(SILENT) -rsi ${MP_CC_DIR}../ + +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: compileCPP +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +else +endif + +# ------------------------------------------------------------------------------------ +# Rules for buildStep: link +ifeq ($(TYPE_IMAGE), DEBUG_RUN) +dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk elf32pic32mx.x + @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} + ${MP_CC} $(MP_EXTRA_LD_PRE) -g -mdebugger -D__MPLAB_DEBUGGER_ICD3=1 -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) -mreserve=data@0x0:0x1FC -mreserve=boot@0x1FC02000:0x1FC02FEF -mreserve=boot@0x1FC02000:0x1FC024FF -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=__MPLAB_DEBUG=1,--defsym=__DEBUG=1,--defsym=__MPLAB_DEBUGGER_ICD3=1,--defsym=_min_heap_size=512,-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map" + +else +dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX}: ${OBJECTFILES} nbproject/Makefile-${CND_CONF}.mk elf32pic32mx.x + @${MKDIR} dist/${CND_CONF}/${IMAGE_TYPE} + ${MP_CC} $(MP_EXTRA_LD_PRE) -mprocessor=$(MP_PROCESSOR_OPTION) -o dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} ${OBJECTFILES_QUOTED_IF_SPACED} -DXPRJ_ChaletDuinoV2_795F512H_=$(CND_CONF) $(COMPARISON_BUILD) -Wl,--defsym=__MPLAB_BUILD=1$(MP_EXTRA_LD_POST)$(MP_LINKER_FILE_OPTION),--defsym=_min_heap_size=512,-Map="${DISTDIR}/${PROJECTNAME}.${IMAGE_TYPE}.map" + ${MP_CC_DIR}\\xc32-bin2hex dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${DEBUGGABLE_SUFFIX} +endif + + +# Subprojects +.build-subprojects: + + +# Subprojects +.clean-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r build/ChaletDuinoV2_795F512H_ + ${RM} -r dist/ChaletDuinoV2_795F512H_ + +# Enable dependency checking +.dep.inc: .depcheck-impl + +DEPFILES=$(shell mplabwildcard ${POSSIBLE_DEPFILES}) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/ChaloupeLora.X/nbproject/Makefile-genesis.properties b/ChaloupeLora.X/nbproject/Makefile-genesis.properties new file mode 100644 index 0000000..7b514a5 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Makefile-genesis.properties @@ -0,0 +1,18 @@ +# +#Wed Apr 27 15:55:30 EDT 2022 +default.languagetoolchain.version=2.41 +ChaletDuino_775F512H_.languagetoolchain.version=1.33 +default.Pack.dfplocation=C\:\\Users\\JF\\.mchp_packs\\Microchip\\PIC32MX_DFP\\1.2.228 +conf.ids=default,ChaletDuino_775F512H_,ChaletDuinoV2_795F512H_ +default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v2.41\\bin +ChaletDuino_775F512H_.Pack.dfplocation=C\:\\Program Files (x86)\\Microchip\\MPLABX\\v5.40\\packs\\Microchip\\PIC32MX_DFP\\1.3.231 +ChaletDuinoV2_795F512H_.Pack.dfplocation=C\:\\Program Files (x86)\\Microchip\\MPLABX\\v5.40\\packs\\Microchip\\PIC32MX_DFP\\1.3.231 +configurations-xml=67e24310c88cfde343949f020768cbaa +default.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=a5745c99cb5a5032f17cfaf0ff720282 +com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=9db8f8a224aa17d0023ea7f468f871dc +ChaletDuino_775F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin +ChaletDuinoV2_795F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin +ChaletDuinoV2_795F512H_.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=a5745c99cb5a5032f17cfaf0ff720282 +ChaletDuino_775F512H_.com-microchip-mplab-nbide-toolchainXC32-XC32LanguageToolchain.md5=a5745c99cb5a5032f17cfaf0ff720282 +ChaletDuinoV2_795F512H_.languagetoolchain.version=1.33 +host.platform=windows diff --git a/ChaloupeLora.X/nbproject/Makefile-impl.mk b/ChaloupeLora.X/nbproject/Makefile-impl.mk new file mode 100644 index 0000000..71991b9 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Makefile-impl.mk @@ -0,0 +1,73 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=ChaloupeLora.X + +# Active Configuration +DEFAULTCONF=ChaletDuinoV2_795F512H_ +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=default ChaletDuino_775F512H_ ChaletDuinoV2_795F512H_ + + +# build +.build-impl: .build-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre + ${MAKE} -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .clean-conf + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default clean + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuino_775F512H_ clean + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuinoV2_795F512H_ clean + + + +# all +.all-impl: .all-pre .depcheck-impl + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=default build + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuino_775F512H_ build + ${MAKE} SUBPROJECTS=${SUBPROJECTS} CONF=ChaletDuinoV2_795F512H_ build + + + +# dependency checking support +.depcheck-impl: +# @echo "# This code depends on make tool being used" >.dep.inc +# @if [ -n "${MAKE_VERSION}" ]; then \ +# echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \ +# echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ +# echo "include \$${DEPFILES}" >>.dep.inc; \ +# echo "endif" >>.dep.inc; \ +# else \ +# echo ".KEEP_STATE:" >>.dep.inc; \ +# echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ +# fi diff --git a/ChaloupeLora.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk b/ChaloupeLora.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk new file mode 100644 index 0000000..519ff99 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Makefile-local-ChaletDuinoV2_795F512H_.mk @@ -0,0 +1,38 @@ +# +# Generated Makefile - do not edit! +# +# +# This file contains information about the location of compilers and other tools. +# If you commmit this file into your revision control server, you will be able to +# to checkout the project and build it from the command line with make. However, +# if more than one person works on the same project, then this file might show +# conflicts since different users are bound to have compilers in different places. +# In that case you might choose to not commit this file and let MPLAB X recreate this file +# for each user. The disadvantage of not commiting this file is that you must run MPLAB X at +# least once so the file gets created and the project can be built. Finally, you can also +# avoid using this file at all if you are only building from the command line with make. +# You can invoke make with the values of the macros: +# $ makeMP_CC="/opt/microchip/mplabc30/v3.30c/bin/pic30-gcc" ... +# +SHELL=cmd.exe +PATH_TO_IDE_BIN=C:/Program Files (x86)/Microchip/MPLABX/v5.40/mplab_platform/platform/../mplab_ide/modules/../../bin/ +# Adding MPLAB X bin directory to path. +PATH:=C:/Program Files (x86)/Microchip/MPLABX/v5.40/mplab_platform/platform/../mplab_ide/modules/../../bin/:$(PATH) +# Path to java used to run MPLAB X when this makefile was created +MP_JAVA_PATH="C:\Program Files (x86)\Microchip\MPLABX\v5.40\sys\java\zulu8.36.0.1-ca-fx-jdk8.0.202-win_x64\jre/bin/" +OS_CURRENT="$(shell uname -s)" +MP_CC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-gcc.exe" +MP_CPPC="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-g++.exe" +# MP_BC is not defined +MP_AS="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-as.exe" +MP_LD="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ld.exe" +MP_AR="C:\Program Files\Microchip\xc32\v1.33\bin\xc32-ar.exe" +DEP_GEN=${MP_JAVA_PATH}java -jar "C:/Program Files (x86)/Microchip/MPLABX/v5.40/mplab_platform/platform/../mplab_ide/modules/../../bin/extractobjectdependencies.jar" +MP_CC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_CPPC_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +# MP_BC_DIR is not defined +MP_AS_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_LD_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +MP_AR_DIR="C:\Program Files\Microchip\xc32\v1.33\bin" +# MP_BC_DIR is not defined +DFP_DIR=C:/Program Files (x86)/Microchip/MPLABX/v5.40/packs/Microchip/PIC32MX_DFP/1.3.231 diff --git a/ChaloupeLora.X/nbproject/Makefile-variables.mk b/ChaloupeLora.X/nbproject/Makefile-variables.mk new file mode 100644 index 0000000..74cdc07 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Makefile-variables.mk @@ -0,0 +1,27 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +# default configuration +CND_ARTIFACT_DIR_default=dist/default/production +CND_ARTIFACT_NAME_default=ChaloupeLora.X.production.hex +CND_ARTIFACT_PATH_default=dist/default/production/ChaloupeLora.X.production.hex +CND_PACKAGE_DIR_default=${CND_DISTDIR}/default/package +CND_PACKAGE_NAME_default=chaloupelora.x.tar +CND_PACKAGE_PATH_default=${CND_DISTDIR}/default/package/chaloupelora.x.tar +# ChaletDuino_775F512H_ configuration +CND_ARTIFACT_DIR_ChaletDuino_775F512H_=dist/ChaletDuino_775F512H_/production +CND_ARTIFACT_NAME_ChaletDuino_775F512H_=ChaloupeLora.X.production.hex +CND_ARTIFACT_PATH_ChaletDuino_775F512H_=dist/ChaletDuino_775F512H_/production/ChaloupeLora.X.production.hex +CND_PACKAGE_DIR_ChaletDuino_775F512H_=${CND_DISTDIR}/ChaletDuino_775F512H_/package +CND_PACKAGE_NAME_ChaletDuino_775F512H_=chaloupelora.x.tar +CND_PACKAGE_PATH_ChaletDuino_775F512H_=${CND_DISTDIR}/ChaletDuino_775F512H_/package/chaloupelora.x.tar +# ChaletDuinoV2_795F512H_ configuration +CND_ARTIFACT_DIR_ChaletDuinoV2_795F512H_=dist/ChaletDuinoV2_795F512H_/production +CND_ARTIFACT_NAME_ChaletDuinoV2_795F512H_=ChaloupeLora.X.production.hex +CND_ARTIFACT_PATH_ChaletDuinoV2_795F512H_=dist/ChaletDuinoV2_795F512H_/production/ChaloupeLora.X.production.hex +CND_PACKAGE_DIR_ChaletDuinoV2_795F512H_=${CND_DISTDIR}/ChaletDuinoV2_795F512H_/package +CND_PACKAGE_NAME_ChaletDuinoV2_795F512H_=chaloupelora.x.tar +CND_PACKAGE_PATH_ChaletDuinoV2_795F512H_=${CND_DISTDIR}/ChaletDuinoV2_795F512H_/package/chaloupelora.x.tar diff --git a/ChaloupeLora.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash b/ChaloupeLora.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash new file mode 100644 index 0000000..4b57a11 --- /dev/null +++ b/ChaloupeLora.X/nbproject/Package-ChaletDuinoV2_795F512H_.bash @@ -0,0 +1,73 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_CONF=ChaletDuinoV2_795F512H_ +CND_DISTDIR=dist +TMPDIR=build/${CND_CONF}/${IMAGE_TYPE}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=dist/${CND_CONF}/${IMAGE_TYPE}/ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +OUTPUT_BASENAME=ChaloupeLora.X.${IMAGE_TYPE}.${OUTPUT_SUFFIX} +PACKAGE_TOP_DIR=chaloupelora.x/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/package +rm -rf ${TMPDIR} +mkdir -p ${TMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory ${TMPDIR}/chaloupelora.x/bin +copyFileToTmpDir "${OUTPUT_PATH}" "${TMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/package/chaloupelora.x.tar +cd ${TMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/package/chaloupelora.x.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${TMPDIR} diff --git a/ChaloupeLora.X/nbproject/configurations.xml b/ChaloupeLora.X/nbproject/configurations.xml new file mode 100644 index 0000000..725d55d --- /dev/null +++ b/ChaloupeLora.X/nbproject/configurations.xml @@ -0,0 +1,1387 @@ + + + + + + Source/BoardCfg.h + Source/BoardCfg_Chaletduino.h + Source/BoardCfg_Fubarino.h + Source/BoardCfg_Pinguino.h + Source/BoardCfg_ChaletduinoV2.h + + + + + Source/winc3400_142/bsp/include/nm_bsp.h + + + + + Source/winc3400_142/common/include/nm_common.h + Source/winc3400_142/common/include/nm_debug.h + + + + + + + Source/winc3400_142/driver/include/ecc_types.h + Source/winc3400_142/driver/include/m2m_flash.h + Source/winc3400_142/driver/include/m2m_hif.h + Source/winc3400_142/driver/include/m2m_ota.h + Source/winc3400_142/driver/include/m2m_periph.h + Source/winc3400_142/driver/include/m2m_ssl.h + Source/winc3400_142/driver/include/m2m_types.h + Source/winc3400_142/driver/include/m2m_wifi.h + Source/winc3400_142/driver/include/nmasic.h + Source/winc3400_142/driver/include/nmbus.h + Source/winc3400_142/driver/include/nmdrv.h + Source/winc3400_142/driver/include/nmspi.h + + + + + + + Source/winc3400_142/socket/include/m2m_socket_host_if.h + Source/winc3400_142/socket/include/netinet_in.h + Source/winc3400_142/socket/include/socket.h + + + + + + + Source/winc3400_142/spi_flash/include/spi_flash.h + Source/winc3400_142/spi_flash/include/spi_flash_map.h + + + + + + Source/define.h + Source/DigitalIO.h + Source/InternalUart.h + Source/main.h + Source/ProtocolDefs.h + Source/PWMCtrl.h + Source/SPI.h + Source/system.h + Source/Terminal.h + Source/timer.h + Source/Uart.h + Source/Util.h + Source/versionbuild.h + Source/winc1500_config.h + Source/WiFiCtrl.h + Source/LoraNetworkInterface.h + Source/ChaletPowerRelay.h + Source/HarakiriRelay.h + Source/BatteryMonitor.h + Source/I2C.h + Source/winc3400_config.h + Source/SPI_Flash.h + Source/Syslog.h + Source/Watchdog.h + Source/BootloaderInterface.h + Source/TemperatureSensor.h + Source/TC77.h + Source/BootloaderProtocol.h + Source/FlashMapping.h + Source/checksum.h + Source/LoraWatchdog.h + Source/hd44780.h + + + procdefs.ld + elf32pic32mx.x + + + + Source/FubarinoBoard.c + Source/PinguinoBoard.c + Source/ChaletduinoBoard.c + Source/ChaletduinoV2Board.c + + + + + + + + + + + Source/winc3400_142/common/source/nm_common.c + + + + + + + Source/winc3400_142/driver/source/m2m_flash.c + Source/winc3400_142/driver/source/m2m_hif.c + Source/winc3400_142/driver/source/m2m_ota.c + Source/winc3400_142/driver/source/m2m_periph.c + Source/winc3400_142/driver/source/m2m_ssl.c + Source/winc3400_142/driver/source/m2m_wifi.c + Source/winc3400_142/driver/source/nmasic.c + Source/winc3400_142/driver/source/nmbus.c + Source/winc3400_142/driver/source/nmdrv.c + Source/winc3400_142/driver/source/nmspi.c + + + + + + + Source/winc3400_142/socket/source/inet_addr.c + Source/winc3400_142/socket/source/inet_ntop.c + Source/winc3400_142/socket/source/socket.c + + + + + + + Source/winc3400_142/spi_flash/source/spi_flash.c + + + + Source/DigitalIO.c + Source/InternalUart.c + Source/MasterCtrlInterface.c + Source/NetworkProtocol.c + Source/Terminal.c + Source/Uart.c + Source/Util.c + Source/exceptions.c + Source/interrupts.c + Source/main.c + Source/system.c + Source/template.c + Source/timer.c + Source/WiFiCtrl.c + Source/SPI.c + Source/LoraNetworkInterface.c + Source/ChaletPowerRelay.c + Source/HarakiriRelay.c + Source/BatteryMonitor.c + Source/ina219.c + Source/I2C.c + Source/SPI_Flash.c + Source/Syslog.c + Source/Watchdog.c + Source/BootloaderInterface.c + Source/TemperatureSensor.c + Source/TC77.c + Source/BootloaderProtocol.c + Source/crc32.c + Source/LoraWatchdog.c + Source/hd44780.c + + + Makefile + dist/ChaletDuinoV2_795F512H_/production/ChaletLora.X.production.map + + + + . + ../../Bootloader_PIC32/Bootloader_PIC32.X/Source + + Makefile + + + + localhost + PIC32MX775F512H + + + ICD3PlatformTool + XC32 + 2.41 + 3 + + + + + + + + + + + + + + + false + false + + + + + + + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + PIC32MX795F512H + + + ICD3PlatformTool + XC32 + 1.33 + 3 + + + + + + + + + + + + + + + false + true + + + + + + + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + PIC32MX795F512H + + + ICD3PlatformTool + XC32 + 1.33 + 3 + + + + + + + + + + + + + + + false + true + + + + + + + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ChaloupeLora.X/nbproject/private/configurations.xml b/ChaloupeLora.X/nbproject/private/configurations.xml new file mode 100644 index 0000000..4cec9da --- /dev/null +++ b/ChaloupeLora.X/nbproject/private/configurations.xml @@ -0,0 +1,61 @@ + + + Makefile + 2 + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v2.41\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v1.33\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + :=MPLABComm-USB-Microchip:=<vid>04D8:=<pid>9009:=<rev>0100:=<man>Microchip Technology, Inc. (www.microchip.com):=<prod>MPLAB ICD3 tm (www.microchip.com):=<sn>JIT100737989:=<drv>x:=<xpt>b:=end + C:\Program Files\Microchip\xc32\v1.33\bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff --git a/ChaloupeLora.X/nbproject/private/private.xml b/ChaloupeLora.X/nbproject/private/private.xml new file mode 100644 index 0000000..371fb63 --- /dev/null +++ b/ChaloupeLora.X/nbproject/private/private.xml @@ -0,0 +1,21 @@ + + + + + Source/BootloaderInterface.c + + + 387 + + + + + 437 + + + + + + + + diff --git a/ChaloupeLora.X/nbproject/project.xml b/ChaloupeLora.X/nbproject/project.xml new file mode 100644 index 0000000..62ba262 --- /dev/null +++ b/ChaloupeLora.X/nbproject/project.xml @@ -0,0 +1,42 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + ChaloupeLora + ChaletLora + ChaletDuinoV2Base + LoraMonitor + AnalogTest + 81932de6-c3d1-4745-813f-25f2b7b2f867 + 0 + c + + h + + ISO-8859-1 + + + . + ../../Bootloader_PIC32/Bootloader_PIC32.X/Source + + + + default + 2 + + + ChaletDuino_775F512H_ + 2 + + + ChaletDuinoV2_795F512H_ + 2 + + + + false + + + + diff --git a/ChaloupeLora.X/procdefs.ld b/ChaloupeLora.X/procdefs.ld new file mode 100644 index 0000000..05ff51f --- /dev/null +++ b/ChaloupeLora.X/procdefs.ld @@ -0,0 +1,89 @@ +/************************************************************************* + * Processor-specific object file. Contains SFR definitions. + *************************************************************************/ +INPUT("processor.o") + +/************************************************************************* + * Processor-specific peripheral libraries are optional + *************************************************************************/ +OPTIONAL("libmchp_peripheral.a") +OPTIONAL("libmchp_peripheral_32MX795F512H.a") + +/************************************************************************* + * For interrupt vector handling + *************************************************************************/ +PROVIDE(_vector_spacing = 0x00000001); +_ebase_address = 0x9D004000; /*0x9FC01000;*/ + +/************************************************************************* + * Memory Address Equates + * _RESET_ADDR -- Reset Vector + * _BEV_EXCPT_ADDR -- Boot exception Vector + * _DBG_EXCPT_ADDR -- In-circuit Debugging Exception Vector + * _DBG_CODE_ADDR -- In-circuit Debug Executive address + * _DBG_CODE_SIZE -- In-circuit Debug Executive size + * _GEN_EXCPT_ADDR -- General Exception Vector + *************************************************************************/ +_RESET_ADDR = 0xBFC00000; +_BEV_EXCPT_ADDR = 0xBFC00380; +_DBG_EXCPT_ADDR = 0xBFC00480; +_DBG_CODE_ADDR = 0xBFC02000; +_DBG_CODE_SIZE = 0xFF0; +_GEN_EXCPT_ADDR = _ebase_address + 0x180; + +/************************************************************************* + * Memory Regions + * + * Memory regions without attributes cannot be used for orphaned sections. + * Only sections specifically assigned to these regions can be allocated + * into these regions. + * + * The Debug exception vector is located at 0x9FC00480. + * + * The config_
sections are used to locate the config words at + * their absolute addresses. + *************************************************************************/ +MEMORY +{ + /*kseg0_program_mem (rx) : ORIGIN = 0x9D000100, LENGTH = 0x80000*/ + /*kseg0_boot_mem : ORIGIN = 0x9FC00490, LENGTH = 0x970*/ + /*kexception_mem : ORIGIN = 0x9FC01000, LENGTH = 0x1000*/ + + /* kseg0_program_mem (rx) : ORIGIN = 0x9D003800, LENGTH = 0x7C7FF*/ /*App code. MAX address = 9D07FFFF */ + /* kseg0_boot_mem : ORIGIN = 0x9D003000, LENGTH = 0x7F0*/ /* startup code */ + /* exception_mem : ORIGIN = 0x9D002000, LENGTH = 0x1000*/ + + kseg0_program_mem (rx) : ORIGIN = 0x9D005800, LENGTH = 0x7A7FF /*App code. MAX address = 9D07FFFF */ + kseg0_boot_mem : ORIGIN = 0x9D005000, LENGTH = 0x7F0 /* startup code */ + exception_mem : ORIGIN = 0x9D004000, LENGTH = 0x1000 + + kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x490 + debug_exec_mem : ORIGIN = 0xBFC02000, LENGTH = 0xFF0 + config3 : ORIGIN = 0xBFC02FF0, LENGTH = 0x4 + config2 : ORIGIN = 0xBFC02FF4, LENGTH = 0x4 + config1 : ORIGIN = 0xBFC02FF8, LENGTH = 0x4 + config0 : ORIGIN = 0xBFC02FFC, LENGTH = 0x4 + kseg1_data_mem (w!x) : ORIGIN = 0xA0000000, LENGTH = 0x10000 + sfrs : ORIGIN = 0xBF800000, LENGTH = 0x100000 + configsfrs : ORIGIN = 0xBFC02FF0, LENGTH = 0x10 +} + +/************************************************************************* + * Configuration-word sections. Map the config-pragma input sections to + * absolute-address output sections. + *************************************************************************/ +SECTIONS +{ + .config_BFC02FF0 : { + KEEP(*(.config_BFC02FF0)) + } > config3 + .config_BFC02FF4 : { + KEEP(*(.config_BFC02FF4)) + } > config2 + .config_BFC02FF8 : { + KEEP(*(.config_BFC02FF8)) + } > config1 + .config_BFC02FFC : { + KEEP(*(.config_BFC02FFC)) + } > config0 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29