diff --git a/Header/PCA9685_driver.h b/Header/PCA9685_driver.h index 80793b1..72a4925 100644 --- a/Header/PCA9685_driver.h +++ b/Header/PCA9685_driver.h @@ -9,8 +9,12 @@ #if PCA9685_USE_SOFT_IIC == 1 -#define PCA9685_SOFT_IIC_SCL_PIN P1_5 -#define PCA9685_SOFT_IIC_SDA_PIN P1_4 +#define PCA9685_SOFT_IIC_SCL_PIN P15 +#define PCA9685_SOFT_IIC_SDA_PIN P14 + +#define PCA9685_SDA_LEVEL(x) (PCA9685_SOFT_IIC_SDA_PIN = x) +#define PCA9685_SCL_LEVEL(x) (PCA9685_SOFT_IIC_SCL_PIN = x) +#define PCA9685_SDA_READ() (PCA9685_SOFT_IIC_SDA_PIN) #else diff --git a/Header/iic.h b/Header/iic.h index 648a397..1b1b0f6 100644 --- a/Header/iic.h +++ b/Header/iic.h @@ -25,8 +25,10 @@ typedef enum #define IIC_SEND_OK 0 #define IIC_SEND_FAIL 1 +void iic_scan(void); void iic_init(IICN_enum iic_n, uint8 wait_time); uint8 iic_write_reg(uint8 dev_add, uint8 reg, uint8 dat); +uint8 iic_write_reg_bytes(uint8 dev_add, uint8 reg, uint8 *dat, uint8 num); uint8 iic_read_reg(uint8 dev_add, uint8 reg, uint8 *dat); uint8 iic_read_reg_bytes(uint8 dev_add, uint8 reg, uint8 *dat, uint8 num); void iic_change_pin(IICN_enum iic_n); diff --git a/Header/iic_soft.h b/Header/iic_soft.h index 20ad471..36a7a0e 100644 --- a/Header/iic_soft.h +++ b/Header/iic_soft.h @@ -2,19 +2,25 @@ #define __IIC_SOFT_H__ #include "common.h" -#include "gpio.h" +// #include "gpio.h" typedef struct { - PIN_enum scl_pin; // SCL引脚 - PIN_enum sda_pin; // SDA引脚 + // PIN_enum scl_pin; // SCL引脚 + // PIN_enum sda_pin; // SDA引脚 + void (*SCL_SET)(void); + void (*SCL_CLR)(void); + void (*SDA_SET)(void); + void (*SDA_CLR)(void); + uint8 (*SDA_READ)(void); uint16 wait_time; // 等待时间,用于I2C总线速度控制 } IIC_Soft_Config; +void soft_iic_scan(IIC_Soft_Config *config); void soft_iic_init(IIC_Soft_Config *config); - -uint8 soft_iic_read_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg_addr, uint8 *dat); - void soft_iic_write_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg_addr, uint8 dat); +void soft_iic_write_reg_bytes(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 *dat, uint8 len); +uint8 soft_iic_read_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg_addr, uint8 *dat); +uint8 soft_iic_read_reg_bytes(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 *buf, uint8 len); #endif diff --git a/Header/ina226.h b/Header/ina226.h new file mode 100644 index 0000000..5f6ba77 --- /dev/null +++ b/Header/ina226.h @@ -0,0 +1,83 @@ +#ifndef __INA226_H__ +#define __INA226_H__ + +#include "common.h" + + +#define INA226_USE_SOFT_IIC 0 + +#define INA226_NUM 1 + +#define INA226_READ_TIME_MS 1 + +#if (1==INA226_USE_SOFT_IIC) + +#define INA226_SDA_PIN P24 +#define INA226_SCL_PIN P25 +#define INA226_SOFT_WAIT_TIME 5 + +#define INA226_SDA_LEVEL(x) (INA226_SDA_PIN = x) +#define INA226_SCL_LEVEL(x) (INA226_SCL_PIN = x) +#define INA226_SDA_READ() (INA226_SDA_PIN) + +#else + +#define INA226_IIC IIC_1 +#define INA226_HARD_WAIT_TIME 10 + +#endif + +#define INA226_CONFIG_REG 0x00 +#define INA226_SHUNTVOT_REG 0x01 +#define INA226_BUSVOT_REG 0x02 +#define INA226_POWER_REG 0x03 +#define INA226_CURRENT_REG 0x04 +#define INA226_CALIBRATION_REG 0x05 + +#define INA226_DEF_ADDR 0x40 +#define INA226_DEF_MODE {0x44, 0x4F} +#define INA226_DEF_CAL {0x0D, 0x1B} + + +typedef struct +{ + uint8 addr; + float max_current_A; + float rshunt_mOhm; + float vot_fix_k; + float amp_fix_k; + uint8 mode[2]; +} INA226_Config; + +typedef struct +{ + float c_lsb_mA; + uint8 cal[2]; +} INA226_Calibration; + +typedef struct +{ + float voltage_V; + float current_A; + float power_W; + float shunt_voltage_mV; + float energy_J; + float quantity_C; + uint8 org_reg[4][2]; + float past_voltage_V[10]; + float past_current_A[10]; +} INA226_Result; + +typedef struct +{ + INA226_Config config; + INA226_Calibration calibration; + INA226_Result result; +} INA226_t; + +extern INA226_t ina226[INA226_NUM]; + +void INA226_Init(INA226_t *ina226, uint8 addr, uint8 mode[2], float max_current_A, float rshunt_mOhm, float amp_fix_k, float vot_fix_k); +void INA226_Read(INA226_t *ina226); + +#endif diff --git a/Header/oled_font.h b/Header/oled_font.h new file mode 100644 index 0000000..d86f525 --- /dev/null +++ b/Header/oled_font.h @@ -0,0 +1,9 @@ +#ifndef __OLED_FONT_H__ +#define __OLED_FONT_H__ + +#include "common.h" + +extern const uint8 code oled_6x8[][6]; +extern const uint8 code ascii_font_8x16[][16]; + +#endif diff --git a/Header/oled_iic_SSD1306.h b/Header/oled_iic_SSD1306.h new file mode 100644 index 0000000..afdd7c0 --- /dev/null +++ b/Header/oled_iic_SSD1306.h @@ -0,0 +1,64 @@ +#ifndef __OLED_IIC_SSD1306_H__ +#define __OLED_IIC_SSD1306_H__ + +#include "common.h" + +#define OLED_USE_SOFT_IIC 1 + +#define OLED_ADDR 0x3C + +#if (1==OLED_USE_SOFT_IIC) + +#define OLED_SDA_PIN P24 +#define OLED_SCL_PIN P25 +#define OLED_SOFT_WAIT_TIME 0 + +#define OLED_SDA_LEVEL(x) (OLED_SDA_PIN = x) +#define OLED_SCL_LEVEL(x) (OLED_SCL_PIN = x) +#define OLED_SDA_READ() (OLED_SDA_PIN) + +#else + +#define OLED_IIC IIC_2 +#define OLED_HARD_WAIT_TIME 0 + +#endif + +//定义显示方向 +//0 横屏模式 +//1 横屏模式 旋转180 +#define OLED_DISPLAY_DIR 0 + +#if (0==OLED_DISPLAY_DIR || 1==OLED_DISPLAY_DIR) +#define X_WIDTH 128 +#define Y_WIDTH 64 + +#else +#error "OLED_DISPLAY_DIR 定义错误" + +#endif + +#define Brightness 0x7f //设置OLED亮度 越大越亮 范围0-0XFF +#define XLevelL 0x00 +#define XLevelH 0x10 +#define XLevel ((XLevelH&0x0F)*16+XLevelL) +#define Max_Column 128 +#define Max_Row 64 + + +void oled_init(void); +void oled_fill(uint8 dat); +void oled_set_pos(uint8 x, uint8 y); +void oled_putpixel(uint8 x,uint8 y,uint8 data1); +void oled_clrpixel(uint8 x,uint8 y); +void oled_p6x8str(uint8 x,uint8 y,const int8 ch[]); + +void oled_uint16(uint8 x, uint8 y, uint16 num); +void oled_int16(uint8 x, uint8 y, int16 num); +void oled_printf_int32(uint16 x,uint16 y,int32 dat,uint8 num); +void oled_printf_float(uint16 x,uint16 y,double dat,uint8 num,uint8 pointnum); +void oled_dis_bmp(uint16 high, uint16 width, uint8 *p,uint8 value); +void oled_print_chinese(uint8 x, uint8 y, uint8 size, const uint8 *p, uint8 len); + + +#endif diff --git a/Header/printfs.h b/Header/printfs.h new file mode 100644 index 0000000..936f013 --- /dev/null +++ b/Header/printfs.h @@ -0,0 +1,8 @@ +#ifndef __PRINTFS_H__ +#define __PRINTFS_H__ + +#include "common.h" + +uint32 zf_sprintf (int8 *buff, const int8 *format, ...); + +#endif diff --git a/Objects/stc32g_all b/Objects/stc32g_all index 2483aa1..156f2f6 100644 Binary files a/Objects/stc32g_all and b/Objects/stc32g_all differ diff --git a/Objects/stc32g_all.hex b/Objects/stc32g_all.hex index f004841..2c86e8f 100644 --- a/Objects/stc32g_all.hex +++ b/Objects/stc32g_all.hex @@ -1,27 +1,26 @@ :0200000400FFFB -:10000000023D6802000A53EFEF323202001A53EF4A -:10001000DF323202001253EFBF323202002253EFBE -:10002000FE3232023469801200000000000000003D -:10003000000000000000000000007D231B344D2262 -:1000400078E6220244B9E47AB3010B74117E704859 -:100050000248B702000653EFFD322202000E53EFB2 -:10006000FB322202001E74047E34FE817E24007E58 -:100070007A1BB0123BDA7E34FE877E24007E7E1B24 -:02008000B022AC -:06008300020016D2AF22BC -:06008B000244D3C2AF22C3 -:060093000244ED024927C2 -:06009B0002005602492795 -:1000A30002005E7F217F707F10800A7E2B307A1BD7 +:1000000002599002001AA294E4332202005AA2A4D8 +:10001000E4332202002253EFEF3232025C9753EFB7 +:10002000DF3232024F17CA797CF77CEB7D327E08D3 +:1000300002BF125DCF7CBE7C7F7E0802C0124035BD +:10004000DA79220261EC7C6B7E080277743C6C7773 +:100050000256E102001653EFBF323202001E53EF88 +:10006000FE322202005E801200000000000000004C +:10007000000000000000000000007D231B344D2222 +:1000800078E62202005653EFFD322202620653EF59 +:02009000FB3241 +:06009300026220D2AF2240 +:06009B00020086C2AF2244 +:1000A30002008E7F217F707F10800A7E2B307A1BA7 :1000B300300B540B34691FFFFD7D011B04790FFFC7 -:1000C300FD4D1178E67F17220230E77EB30101BEB2 -:1000D300B00D50507EA003A49000DF73020106020E -:1000E300010902012702010C02012702010F02018B -:1000F3001202011502011802011B02011E02012155 -:100103000201240223A40229F4022C6802399E026C -:100113002A930200960237C602294F023DE50243A5 -:070123001F02009E024927A4 -:10012B000241C90204266E00807CB1337CB0336877 +:1000C300FD4D1178E67F1722024A32CA3B7F30E4A6 +:1000D3007AB303287F031260F77E1467C97E040096 +:1000E300FF125F407F037EB303283EB0124BAC7F09 +:1000F3000312533960177E7303280A377A3701D204 +:100103007E1467A97E0400FF125F4080057F0312FF +:100113005E8C7EB30328047AB303287E730328BE60 +:07012300707F28B0DA3B22D7 +:10012B00025E5F0204266E00807CB1337CB03368C4 :10013B000D0468EF7CB5337CB43378037F10220455 :10014B0068E17D5092F77D457D51BF2140067C8053 :10015B007F017F121203E97EA1D05CB004780320EB @@ -63,7 +62,7 @@ :10039B00248140039F11227C457C567C676C77241B :1003AB00E0500E7E1CFFFF221E341E2450034E60B5 :1003BB00800478F430D50A6E34FFFF6E24FFFF0BF8 -:1003CB001C227F707F517E6F00947E9403DC0204AD +:1003CB001C227F707F517E6F03177E9403DC020427 :1003DB00674005E47A7BB0227A7BB00B7C222D0040 :1003EB0092D50E104E10807D422D445002B2D54E48 :1003FB0050806C447CB8222C4450120B1C7E400065 @@ -83,7 +82,7 @@ :1004DB007416937C3B7423937C2B89147CB0801310 :1004EB00742012045120F205BEC00250F31B6D297B :1004FB00B6000112045102045C1B6E691600020B5C -:10050B006A00BE08000078087E0400FF7E14495282 +:10050B006A00BE08000078087E0400FF7E1466D0E7 :10051B0020F21E4CCC681A7F10E47E1B804C88683E :10052B00070B1C04BCBD78F2C2F6CA0B12063BDAF1 :10053B000B7E0BB060C0CA0B120451DA0B0B0C4CC8 @@ -170,1025 +169,1501 @@ :100A4B00D57CB030E708B2D59F229F207F027CB4C3 :100A5B0030E713B2D59F229F217F121209F99F22F3 :100A6B009F207F0280031209F930D5069F229F2118 -:100A7B007F12227D127D234D116803020B8F7D3275 -:100A8B005E3400F0781A7CB5540F7E0400016005CB -:100A9B003E041478FB7CA16EA0FF7CBA5293529457 -:100AAB00BE340010781A7CB5540F7E04000160052B -:100ABB003E041478FB7CA16EA0FF7CBA529152923B -:100ACB00BE340020781A7CB5540F7E0400016005FB -:100ADB003E041478FB7CA16EA0FF7CBA5295529613 -:100AEB00BE340030781A7CB5540F7E0400016005CB -:100AFB003E041478FB7CA16EA0FF7CBA52B152B2BB -:100B0B00BE340040781A7CB5540F7E04000160059A -:100B1B003E041478FB7CA16EA0FF7CBA52B352B496 -:100B2B00BE340050781A7CB5540F7E04000160056A -:100B3B003E041478FB7CA16EA0FF7CBA52C952CA4A -:100B4B00BE340060781A7CB5540F7E04000160053A -:100B5B003E041478FB7CA16EA0FF7CBA52CB52CC26 -:100B6B00BE3400706803020E747CB5540F7E3400E3 -:100B7B000160053E341478FB7CA76EA0FF7CBA5253 -:100B8B00E152E222BE1400016803020C967D325E34 -:100B9B003400F078197CB5540F7E04000160053EDB -:100BAB00041478FB7CB164FF52937CB14294BE3445 -:100BBB00001078197CB5540F7E04000160053E04CB -:100BCB001478FB7CB164FF52917CB14292BE34002D -:100BDB002078197CB5540F7E04000160053E041487 -:100BEB0078FB7CB164FF52957CB14296BE340030E9 -:100BFB0078197CB5540F7E04000160053E0414780F -:100C0B00FB7CB164FF52B17CB142B2BE3400407880 -:100C1B00197CB5540F7E04000160053E041478FB6B -:100C2B007CB164FF52B37CB142B4BE34005078192E -:100C3B007CB5540F7E04000160053E041478FB7CE8 -:100C4B00B164FF52C97CB142CABE34006078197CD2 -:100C5B00B5540F7E04000160053E041478FB7CB193 -:100C6B0064FF52CB7CB142CCBE3400706803020EE1 -:100C7B00747CB5540F7E34000160053E341478FB50 -:100C8B007CA77CBA64FF52E1020E70BE14000268AE -:100C9B0003020D8D7D325E3400F078177CB5540F56 -:100CAB007E04000160053E041478FB7CB142936422 -:100CBB00FF5294BE34001078177CB5540F7E04009D -:100CCB000160053E041478FB7CB1429164FF5292A3 -:100CDB00BE34002078177CB5540F7E0400016005EC -:100CEB003E041478FB7CB1429564FF5296BE3400EF -:100CFB003078177CB5540F7E04000160053E041458 -:100D0B0078FB7CB142B164FF52B2BE34004078171D -:100D1B007CB5540F7E04000160053E041478FB7C07 -:100D2B00B142B364FF52B4BE34005078177CB55453 -:100D3B000F7E04000160053E041478FB7CB142C9B0 -:100D4B0064FF52CABE34006078177CB5540F7E0422 -:100D5B00000160053E041478FB7CB142CB64FF526A -:100D6B00CCBE3400706803020E747CB5540F7E3415 -:100D7B00000160053E341478FB7CB742E164FF52FE -:100D8B00E222BE1400036803020E747D325E34004F -:100D9B00F078157CB5540F7E14000160053E1414D9 -:100DAB0078FB7CB342934294BE34001078157CB52B -:100DBB00540F7E14000160053E141478FB7CB34283 -:100DCB00914292BE34002078157CB5540F7E1400EE -:100DDB000160053E141478FB7CB342954296BE34F9 -:100DEB00003078157CB5540F7E14000160053E145D -:100DFB001478FB7CB342B142B2BE34004078157C10 -:100E0B00B5540F7E14000160053E141478FB7CB3BF -:100E1B0042B342B4BE34005078157CB5540F7E14E7 -:100E2B00000160053E141478FB7CB342C942CABE74 -:100E3B0034006078157CB5540F7E14000160053EBC -:100E4B00141478FB7CB342CB42CCBE3400707819BF -:100E5B007CB5540F7E34000160053E341478FB7C66 -:100E6B00A77CBA42E17CBA42E222CA797A0F01220C -:100E7B007D7343BA801214357E1F001C7E0F012236 -:100E8B001209F97D126D007DD20B141209F77F71D7 -:100E9B001B7C7E1F0126BE182710681FE41203530C -:100EAB007E1440007E04461C12028C7F017F17E4E7 -:100EBB001203531201EC12039080047F170B1C7A60 -:100ECB001F012ABE7400405803020F9B7D570E541E -:100EDB000E540E540E541B563E547CAB7E14000124 -:100EEB0060053E141478FB7E34FEB57E24007E7EB6 -:100EFB001BB04CB37A1BB07D375E3400037CBA60F9 -:100F0B00053E341478FB7C677E14FEB67E04007EAF -:100F1B007E0B704C767A0B707D570E540E540E541C -:100F2B000E545E5400013E543E547E340001600565 -:100F3B003E341478FB7C677D170E140E140E140EC2 -:100F4B00140E141A021A007F202F202F222E440079 -:100F5B00FF2E28497E691200020B2A007E0B704C73 -:100F6B00767A0B707D1D0A127E34FEF07E24007E95 -:100F7B007A1B307D3D7C377E34FEF17A1B307480DA -:100F8B007E34FEFD7A1BB074017E34FEE0021071DC -:100F9B007D570E540E540E540E543E547CAB7CBFF6 -:100FAB0054017E3400017D2360053E241478FB7CC4 -:100FBB00BA60053E241478FB7E14FEB17E04007EDD -:100FCB007E0BB04CB57A0BB07D275E2400070E2448 -:100FDB007CBA60053E241478FB7C457E14FEB27E01 -:100FEB0004007E7E0B504C547A0B507D270E240E42 -:100FFB00240E240E245E2400013E243E247D575EE5 -:10100B005400013E542D5260053E341478FB7C672E -:10101B007D170E140E140E140E140E141A021A0051 -:10102B007F202F202F222E4400FF2E28497E69126D -:10103B0000020B2A007E0B704C767A0B707D1D0A1A -:10104B00127E34FED07E24007E7A1B307D3D7C37B1 -:10105B007E34FED17A1B3074807E34FEDD7A1BB079 -:10106B0074017E34FEC07E24007E7A1BB07D1F7D12 -:10107B00370E340E340E340E340E340E341A261A48 -:10108B00247F212F212F222E4400FF2E2849766901 -:10109B003200020B2A207A1B207D3F7D370E340E47 -:1010AB00340E340E340E340E341A261A247F212FAC -:1010BB00212F222E4400FF2E284976693200020B85 -:1010CB002A200B1C7A1B307E1F012A7C367D370EA3 -:1010DB00340E340E340E341A261A247F212F212F6E -:1010EB00222E4400FF2E284956693200020B2A207B -:1010FB007A1B307E2F012A7D370E340E340E340EC0 -:10110B00341A261A247F012F012F007F702EE40042 -:10111B00FF2E784956693700020B7A200B1C7A1B7D -:10112B00B02E0400FF2E08498E693000020B0A20F6 -:10113B007E1BB044607A1BB07D370E340E340E34F8 -:10114B000E341A261A247F012F012F002E0400FFC4 -:10115B002E08498E693000020B0A207E1BB0440812 -:10116B007A1BB0DA7922CA3B7A1F00EC7F306D33E1 -:10117B007A3700F69F007A0F00F87A0F00FC7E1F7B -:10118B0000EC4D23780B7E3400037A3700F6021403 -:10119B00117E3B700A375E34000768127E1F00F029 -:1011AB00791100021B1A007E3400060214237F0300 -:1011BB0012483D7F217A1F00FC7E0F00F069300042 -:1011CB00020B0A20BF1228267E1F00FC793000027A -:1011DB001B0A207E3400077A3700F67E1F00FC4D79 -:1011EB0023780B7E3BB054F77A3BB002142E7E3B38 -:1011FB00B044087A3BB06913000D6903000B6933E7 -:10120B00000969230007BF1038127E2F00F0691206 -:10121B0000020B2A00BF1050030212A46913000135 -:10122B001B1468201B14683D0B1568030214097E00 -:10123B002F00F0691200020B2A007D51CA599F1032 -:10124B007D1380447E1F00F0691100020B1A007F92 -:10125B00102F10CA3969330009692300079F107DCD -:10126B00133E1480237E1F00F0691100020B1A003D -:10127B007F102F102F11CA3969330009692300071A -:10128B009F107D133E143E14693300056923000340 -:10129B002D317E0F00EC0214046913000969030061 -:1012AB00077E2F00F0693200020B2A209F107A1F55 -:1012BB0000F8693300011B34686B1B34780302138D -:1012CB00960B3568030214097E0F00F87D31CA397D -:1012DB0069330015692300139F107D1369330005D3 -:1012EB00692300032D317E0F00EC1200A61BFD7E3F -:1012FB001F00F0695100020B1A407E0F00F87F129D -:10130B009F10CA3969330009692300079F127D5367 -:10131B0069330005692300032D357D517E0F00ECE9 -:10132B002D150214047E0F00F87D313E34CA396945 -:10133B00330015692300139F107D133E146933008E -:10134B0005692300032D317E0F00EC1200A61BFD57 -:10135B007E1F00F0695100020B1A407E0F00F87FD0 -:10136B00129F102F11CA3969330009692300079F97 -:10137B00127D533E5469330005692300032D357DDF -:10138B00513E547E0F00EC2D15806E7E0F00F87DC4 -:10139B00313E343E34CA3969330015692300139F3B -:1013AB00107D133E143E1469330005692300032D91 -:1013BB00317E0F00EC1200A61BFD7E1F00F0695161 -:1013CB0000020B1A407E0F00F87F129F102F112F77 -:1013DB0011CA3969330009692300079F127D533EF7 -:1013EB00543E5469330005692300032D357D513E6E -:1013FB00543E547E0F00EC2D151200A61BFD7E3BB8 -:10140B00B054F77A3BB07E3700F44D3378157E3B02 -:10141B00B0B40B0A7E3400027A3700F680057F03E6 -:10142B001233997E3700F6DA3B227D53BE5400749B -:10143B0040030216D57E340003AD532E54144C8951 -:10144B00540215A80215AF0215B60215BD0215C43C -:10145B000215CB0216D50216D50216D50216D502E9 -:10146B0016D50216D50216D50216D50216D50216BA -:10147B00D50215D20215D90215E00215E70215EEB9 -:10148B000215F50216D50216D50216D50216D5028F -:10149B0016D50216D50216D50216D50216D502168A -:1014AB00D50215FC02160202160802160E021614BD -:1014BB0002161A0216D50216D50216D50216D50239 -:1014CB0016D50216D50216D50216D50216D502165A -:1014DB00D502162002162602162C021632021638D8 -:1014EB0002163E02164402164A0216D50216D50201 -:1014FB0016D50216D50216D50216D50216D502162A -:10150B00D502165002165602165C0216600216D54C -:10151B000216D50216D50216D50216D50216D5021D -:10152B0016D50216D50216D50216D50216D50216F9 -:10153B00D502166602166C02167202167A0216D5C0 -:10154B000216D50216D50216D50216D50216D502ED -:10155B0016D50216D50216D50216D50216D50216C9 -:10156B00D502168402168E0216980216A20216D502 -:10157B000216D50216D50216D50216D50216D502BD -:10158B0016D50216D50216D50216D50216D5021699 -:10159B00D50216AC0216B60216C00216CA7E34006D -:1015AB001002167E7E34001102167E7E340020025D -:1015BB00167E7E34002102167E7E34006002167E7B -:1015CB007E34006102167E7E34001202167E7E345B -:1015DB00001302167E7E34002202167E7E34002318 -:1015EB0002167E7E34006202167E7E340063021683 -:1015FB007E7E340014807C7E34001580767E340031 -:10160B002480707E340025806A7E34006480647E82 -:10161B00340065805E7E34001680587E340017805F -:10162B00527E340026804C7E34002780467E340068 -:10163B006680407E340067803A7E34003480347E8E -:10164B00340033802E7E34002080287E34001780B7 -:10165B00226D33801E7E34007480187E340021800E -:10166B00127E340054800C7E2400017D3280587E23 -:10167B003400757E240001804E7E3400227E2400CF -:10168B000180447E3400337E240001803A7E340096 -:10169B00027E24000180307E3400767E240001809F -:1016AB00267E3400237E240001801C7E3400347E91 -:1016BB0024000180127E3400037E24000180087E0A -:1016CB003400777E240001020A7E22CA3B7A1F0077 -:1016DB00087F306D337A3700129F007A0F00147A2F -:1016EB000F00187E1F00084D23780B7E3400037A01 -:1016FB003700120218E87E3B700A375E340003682D -:10170B00127E1F000C791100021B1A007E3400069A -:10171B000218FA7F0312483D7F217A1F00187E0FB3 -:10172B00000C693000020B0A20BF1228237E1F0019 -:10173B0018793000021B0A207E3400077A3700121A -:10174B007E1F00184D2378087E3BB054F702193BDF -:10175B007E3BB044087A3BB06933000D6923000B24 -:10176B0069530015694300139F217A2F00147E7F64 -:10177B00000C691700020B7A00BF0238586953003E -:10178B00011B5468111B5468230B5568030218E0A6 -:10179B00CA197D13802E7E0F000C693000023E3477 -:1017AB00CA396933000D7D133E1480187E0F000C6F -:1017BB00693000023E343E34CA396933000D7D1363 -:1017CB003E143E1469330005692300032D317E0F4F -:1017DB0000080218DB693300011B3468511B347895 -:1017EB00030218870B3568030218E07E1F0014CA2A -:1017FB00396933000D7D1369330005692300032D0F -:10180B00317E0F00081200A61BFD7E1F000C691114 -:10181B0000020B1A007E1F00149F01CA197E0F00D5 -:10182B00082D1369330005692300030218DB7E1FA3 -:10183B0000142F11CA396933000D6923000B7D1376 -:10184B003E1469330005692300032D317E0F000818 -:10185B001200A61BFD7E1F000C691100020B1A0063 -:10186B007E1F00149F012F00CA193E347E0F000803 -:10187B002D13693300056923000380547E1F001468 -:10188B002F112F11CA396933000D6923000B7D13FA -:10189B003E143E1469330005692300032D317E0F7E -:1018AB0000081200A61BFD7E1F000C691100020B25 -:1018BB001A007E1F00149F012F002F00CA193E34FF -:1018CB003E347E0F00082D13693300056923000396 -:1018DB001200A61BFD7E3BB054F77A3BB07E37005F -:1018EB00104D33784E7E3BB0B40B0A7E3400027A37 -:1018FB00370012803E44027A3BB07F037E2F000CF0 -:10190B00693200020B2A20123B947E1F000C695196 -:10191B0000020B1A407F032E14000F693000020BDC -:10192B000A202F12793000021B0A207E3BB054FD97 -:10193B007A3BB07E370012DA3B22CA3B7A1F011486 -:10194B007F306D337A37011C9F117A1F011E7E1F6A -:10195B0001144D2378067E340003800F7E3BB00AC2 -:10196B003B5E340005680B7E3400047A37011C02A1 -:10197B001B9144047A3BB0693300116923000F7E3D -:10198B002F0118BF212803021B816933000969232A -:10199B00000769130015690300139F017A0F011EDD -:1019AB00BF203803021AD9691300011B1468551B99 -:1019BB00147803021A630B156803021B657E0F0173 -:1019CB001ECA1969130005690300032D137E1F013D -:1019DB00141200A61BFD7F037E1F011E123B4E7EC1 -:1019EB001F011E7E0F01189F01CA19691300096997 -:1019FB000300077D5169130005690300032D157D55 -:101A0B0053021ABF7E1F011E3E34CA3969330009C7 -:101A1B003E3469130005690300032D137E1F011467 -:101A2B001200A61BFD7F037E1F011E123B4E7E1F65 -:101A3B00011E7E0F01189F013E14CA19691300097C -:101A4B00690300077D513E546913000569030003C8 -:101A5B002D157D533E54805C7E1F011E3E343E345B -:101A6B00CA39693300093E343E34691300056903F2 -:101A7B0000032D137E1F01141200A61BFD7F037E96 -:101A8B001F011E123B4E7E1F011E7E0F01189F0170 -:101A9B003E143E14CA1969130009690300077D51EE -:101AAB003E543E5469130005690300032D157D5305 -:101ABB003E543E547E1F01142D351200A61BFD7F94 -:101ACB00037E2F011E7E1F01189F12021B626933BA -:101ADB0000011B34682D1B3468520B35787C7E1F3C -:101AEB000118CA396933000969130005690300033A -:101AFB002D137E1F01141200A61BFD7F037E1F01F9 -:101B0B001880547E1F01183E34CA39693300093ED0 -:101B1B003469130005690300032D137E1F01141292 -:101B2B0000A61BFD7F037E1F0118802B7E1F011853 -:101B3B003E343E34CA39693300093E343E346913AE -:101B4B000005690300032D137E1F01141200A61B51 -:101B5B00FD7F037E1F0118123B4E7E2F01187F0362 -:101B6B002E14000F693000020B0A209F12793000EF -:101B7B00021B0A2080087E3400057A37011C7E3B4D -:101B8B00B054FB7A3BB07E37011CDA3B227DD07D13 -:101B9B00F17DE27DC37E1F001C7E0F01601209F9EF -:101BAB0074027F011E141E0450034E20801478F41F -:101BBB006D337E2400019F101BC47803021C621B33 -:101BCB00C47803021CA31BC47803021CFA2EC400A6 -:101BDB00036803021D56BED40001781B439850E5E1 -:101BEB0089F5897CB7F58B0A56F58D438E40D28EDD -:101BFB00E47AB301798014BED40002780E43985076 -:101C0B007CB7F5D70A56F5D6438E1553A23F4DEE4A -:101C1B00780CBEF400017806E5A2F5A28031BEE493 -:101C2B000002780BBEF40003780543A2408020BE6F -:101C3B00E40004780BBEF40005780543A280800F06 -:101C4B00BEE400067809BEF40007780343A2C0E4A3 -:101C5B007AB30179D2AC22BED40002780E439A50EB -:101C6B007CB7F5D70A56F5D6438E1453BAFEBEE4AD -:101C7B000008780CBEF400097806E5BAF5BA800FB7 -:101C8B00BEE4000A7809BEF4000B780343BA0143A3 -:101C9B00AF01E47AB3017A22BED40002781043ACD0 -:101CAB00107CB7F5D70A56F5D6438E148014BED4E4 -:101CBB000003780E43AC507CB7F5D50A56F5D443E8 -:101CCB00DD0A53BAFDBEE4000C780CBEF4000D78AF -:101CDB0006E5BAF5BA800FBEE4000E7809BEF40033 -:101CEB000F780343BA0243AF08E47AB3017B22BEF9 -:101CFB00D40002781043FD107CB7F5D70A56F5D601 -:101D0B00438E148014BED40004780E43FD507CB770 -:101D1B00F5D30A56F5D243DDA053BAFBBEE400104F -:101D2B00780CBEF400117806E5BAF5BA8015BEE45E -:101D3B000012780FBEF40013780975CA0075C90438 -:101D4B0043BA0443AF10E47AB3017C227C3B7D237E -:101D5B005E3400F0782E4C3368147CB5540F7E241F -:101D6B00000160053E241478FB7CB54280227CB5D3 -:101D7B00540F7E24000160053E241478FB7CB5646F -:101D8B00FF528022BE340010782E4C3368147CB581 -:101D9B00540F7E24000160053E241478FB7CB54271 -:101DAB0090227CB5540F7E24000160053E241478EC -:101DBB00FB7CB564FF529022BE340020782E4C334E -:101DCB0068147CB5540F7E24000160053E24147802 -:101DDB00FB7CB542A0227CB5540F7E24000160052C -:101DEB003E241478FB7CB564FF52A022BE34003035 -:101DFB00782E4C3368147CB5540F7E24000160059B -:101E0B003E241478FB7CB542B0227CB5540F7E2463 -:101E1B00000160053E241478FB7CB564FF52B022B0 -:101E2B00BE340040782E4C3368147CB5540F7E249E -:101E3B00000160053E241478FB7CB542C0227CB5C2 -:101E4B00540F7E24000160053E241478FB7CB5649E -:101E5B00FF52C022BE340050782E4C3368147CB530 -:101E6B00540F7E24000160053E241478FB7CB542A0 -:101E7B00C8227CB5540F7E24000160053E241478E3 -:101E8B00FB7CB564FF52C822BE340060782E4C3305 -:101E9B0068147CB5540F7E24000160053E24147831 -:101EAB00FB7CB542E8227CB5540F7E240001600513 -:101EBB003E241478FB7CB564FF52E822BE340070DC -:101ECB00782D4C3368147CB5540F7E3400016005BB -:101EDB003E341478FB7CB742F8227CB5540F7E3429 -:101EEB00000160053E341478FB7CB764FF52F82286 -:101EFB007D235E3400F078237CB5540F7E440001C3 -:101F0B0060053E441478FBE5800A2B5D246807745A -:101F1B00017CAB02203B6CAA02203BBE3400107844 -:101F2B00237CB5540F7E44000160053E441478FBBE -:101F3B00E5900A2B5D24680774017CAB02203B6C97 -:101F4B00AA02203BBE34002078237CB5540F7E447C -:101F5B00000160053E441478FBE5A00A2B5D246864 -:101F6B000774017CAB02203B6CAA02203BBE340001 -:101F7B003078237CB5540F7E44000160053E441439 -:101F8B0078FBE5B00A2B5D24680774017CAB02205B -:101F9B003B6CAA02203BBE34004078217CB5540F29 -:101FAB007E44000160053E441478FBE5C00A2B5DBE -:101FBB0024680674017CAB80776CAA8073BE3400F6 -:101FCB005078217CB5540F7E44000160053E4414CB -:101FDB0078FBE5C80A2B5D24680674017CAB805046 -:101FEB006CAA804CBE34006078217CB5540F7E44C3 -:101FFB00000160053E441478FBE5E80A2B5D24687C -:10200B000674017CAB80296CAA8025BE34007078E5 -:10201B001F7CB5540F7E24000160053E241478FB11 -:10202B00E5F80A3B5D32680674017CAB80026CAA52 -:10203B007CBA227DF37E1F001C1209F97D126D0004 -:10204B007DE20B141209F77F611B6C7E1F018BBEA7 -:10205B001827106821E41203537E1440007E0446B7 -:10206B001C12028C7F017F16E41203531201EC1237 -:10207B0003907F5180047F560B5CBEF400404819DF -:10208B007D1E0A127E34FEF07E24007E7A1B307D8C -:10209B003E7C377E34FEF180177D1E0A127E34FEA5 -:1020AB00D07E24007E7A1B307D3E7C377E34FED181 -:1020BB007E24007E7A1B307D1D7D3F0E340E340E48 -:1020CB00340E340E340E341A261A247F212F212F6E -:1020DB00222E4400FF2E284976693200020B2A205B -:1020EB007A1B207D3D7D3F0E340E340E340E340EA4 -:1020FB00340E341A261A247F212F212F222E44002E -:10210B00FF2E284976693200020B2A200B1C7A1B02 -:10211B00307D1B7D3F0E340E340E340E341A261ACE -:10212B00247F212F212F222E4400FF2E2849566970 -:10213B003200020B2A207A1B207D3B7D3F0E340E92 -:10214B00340E340E341A261A247F212F212F222EDF -:10215B004400FF2E284956693200020B2A200B1C23 -:10216B007A1B302243BA807E3480007E2401517E5C -:10217B007F001CBF71781474047E34FE017E240032 -:10218B007E7A1BB07E14FDEB0222767E3436007E07 -:10219B0024016EBF71781474047E34FE017E24001A -:1021AB007E7A1BB07E14FDEC0222767E34FCC07E60 -:1021BB0024019BBF71781474047E34FE017E2400CD -:1021CB007E7A1BB07E14FDED0222767E34C3807EB8 -:1021DB002401C9BF71781374047E14FE017E0400C0 -:1021EB007E7A0BB07E54FDEE801D7E1440007E0483 -:1021FB0001FABF70782874047E14FE017E04007E01 -:10220B007A0BB07E54FDEF7E44007E7E2BB0F59FA3 -:10221B007E54FDF77E2BB0F5A6759D0280327E14A1 -:10222B000EC07E040216BF70782C74047E14FE015F -:10223B007E04007E7A0BB07E54FDF07E44007E7EE1 -:10224B002BB0F59F7E54FDF87E2BB0F5A6759D0344 -:10225B00E47A0BB0802E7A1F001C74047E34FE01CE -:10226B007E24007E7A1BB07E14FDEE7E04007E7E03 -:10227B000BB0F59F7E14FDF77E0BB0F5A6759D0296 -:10228B00E47A1BB07E1F001C22CA3B7A1F013A7FE7 -:10229B00306D337A3701407E1F013A4D23780B7E28 -:1022AB003400037A3701400223597E3B700A375EB4 -:1022BB0034000368077E34000602236B7F03124849 -:1022CB003DBE18000150077E34000702236B7E3B96 -:1022DB00B044087A3BB0693300011B3468241B34CB -:1022EB00683E0B3578606933000D7D13693300054B -:1022FB00692300032D317E1B307E1F013A7A1B3080 -:10230B0080446933000D7D133E1469330005692346 -:10231B0000032D310B1A107E1F013A1B1A10802659 -:10232B006933000D7D133E143E1469330005692398 -:10233B0000032D31691100020B1A007E1F013A793F -:10234B001100021B1A007E3BB054F77A3BB07E376C -:10235B00013E4D33783C7E3BB0B40B0A7E34000219 -:10236B007A370140802C44027A3BB07F037E180001 -:10237B0001123B947F032E14000F693000020B0AED -:10238B00200B1C793000021B0A207E3BB054FD7AD7 -:10239B003BB07E370140DA3B22CAF87EF301007C6A -:1023AB00BF5480B480167EB3010370307EB301023C -:1023BB00702A7E370106BE340002680302249C7C1F -:1023CB00BF540F14681B14683B0BB1680302249CA9 -:1023DB007EB3010570067EB30104601E02249C804F -:1023EB00197EB3010AB4040F7EB301056003022406 -:1023FB009C7EB30104600302249C7E34305A7E24FD -:10240B0000FF807D7EB3010AB404067EB301056034 -:10241B0002807E7E7301047CA75EA00F1B70683662 -:10242B002E707F68040B7078687E2400017CBA6084 -:10243B00053E241478FB7E7301126C665C754D337C -:10244B00680A7E34305C7E2400FF80357E34305A3F -:10245B007E2400FF802B7E2400017CBA60053E2485 -:10246B001478FB7E7301136C665C754D33680A7EC2 -:10247B0034305C7E2400FF80087E34305A7E24008A -:10248B00FF7A1F010E7E3400027A37010C80078021 -:10249B000012492780031248CADAF822CA3B7CDBB8 -:1024AB007D739F117A1F0193BED00A28037ED00A39 -:1024BB007E340034E4121D577E3400337401121D38 -:1024CB00577E340033121EFBBEB00168F46CCC7E19 -:1024DB003400347401121D577E1F01932F117A1F84 -:1024EB0001937E340033121EFBB4010B7E1F01934C -:1024FB004E70017A1F01937E340034E4121D570B8A -:10250B00C0BEC01878C96CCC80157E340034740101 -:10251B00121D5700007E340034E4121D570BC00A05 -:10252B003CBD3748E56CCC7404ACBC493500CA499A -:10253B002500C8593500C6592500C40BC0BEC009BB -:10254B0078E57E1F01937A1F00E89F117A1F019394 -:10255B006CCC80217404ACBC493500C6492500C441 -:10256B000A1D6D001209F97F017E1F01932F107A4E -:10257B001F01930BC0BCDC38DB7E1F0193DA3B22BF -:10258B00CA79740E7E70011248B774141248677CB6 -:10259B00FB30E60874147E70801248B77CBF20E0D5 -:1025AB000302265A7E1400407E0400017421123E61 -:1025BB00DA7AB301087E1F012E4D23780302264AD7 -:1025CB006CFF80737EB301091A3B7E0F012E2D31F8 -:1025DB007D207E1BA00A4F2E4400407A91827A8187 -:1025EB00837EEBE0BCEA7839047AB301097E730190 -:1025FB00091A372D317D207E1BB0703974146C771E -:10260B001248B775F40075DC00E47E34FE077E24B7 -:10261B00007E7A1BB07E34000A1247CC75C76080EF -:10262B00FE7E1F012E7E1B70BCE7780474018001B7 -:10263B00E47AB301090BF07E730108BC7F3885D2B5 -:10264B00001248A4500974146C771248B7C200DA10 -:10265B0079227F607DF30E340E340E340E340E343B -:10266B000E341A261A247F012F012F002E0400FF8F -:10267B002E084976693000020B0A200B1C7E1B705A -:10268B000AE7693000020B0A207E1B700A977D391E -:10269B007C676C777D934D9E6D88BE682710682391 -:1026AB007F16E41203537E1440007E04461C120274 -:1026BB008C7F017F14E41203531201EC1203907F01 -:1026CB005180047F540B5C7D1B7D3F0E340E340E0A -:1026DB00340E341A261A247F212F212F222E440048 -:1026EB00FF2E284956693200020B2A207A1B207DC7 -:1026FB003B7D3F0E340E340E340E341A261A247FD3 -:10270B00212F212F222E4400FF2E284956693200FB -:10271B00020B2A200B1C7A1B3022CA3B7F617F30B5 -:10272B006D337A3701B17E3BB00A3B5E34000568EE -:10273B000B7E3400047A3701B10227E644047A3B5E -:10274B00B0693300116923000FBE180001407C698A -:10275B003300011B3468211B3468340B35784B7DF7 -:10276B003D7C37693300097D03693300056923001C -:10277B00032D307A1B308032693300097D033E0410 -:10278B0069330005692300032D301B1AD0801B69A8 -:10279B003300097D133E143E146933000569230091 -:1027AB00032D3179D100021B1AC07F037E18000163 -:1027BB00123B4E7F032E14000F693000020B0A20D0 -:1027CB001B1C793000021B0A2080087E3400057A1E -:1027DB003701B17E3BB054FB7A3BB07E3701B1DAA7 -:1027EB003B22A9D7BA75EA0075E90043FF1075BA09 -:1027FB00807E3440007E2401FA7A1F001C123F8831 -:10280B0075E90043BA80E47E34FE017E24007E7AB3 -:10281B001BB07594007593007592007591007596B9 -:10282B000075950075B20075B10075B40075B300F5 -:10283B0075CA0075C90075CC0075CB0075E20075C3 -:10284B00E10075DE00758E00759800759A0075AC09 -:10285B000075FD0075A20075AF0075890043BA8045 -:10286B0053B2FC43B10374807E34FE077A1BB07EF7 -:10287B0034FE077E24007E7E1BB030E0F275DC0058 -:10288B0075F49012371443AF80D2AF7EB3010AB404 -:10289B0004F9020086CAD8CA797D739F117A1F0189 -:1028AB00977E340034E4121D577E340033740112CA -:1028BB001D577E340033121EFBB40104E402294A77 -:1028CB006CDD7E3400347401121D577E1F01972F6F -:1028DB00117A1F01977E340033121EFBB4010B7E5D -:1028EB001F01974E70017A1F01977E340034E4125A -:1028FB001D570BD0BED01878C96CDD80157E340007 -:10290B00347401121D5700007E340034E4121D573D -:10291B000BD00A3DBD3748E56CDD7404ACBD4935C1 -:10292B0000CA492500C8593500C6592500C40BD02B -:10293B00BED00978E57E1F01977A1F00E87401DA93 -:10294B0079DAD8227EB3010ABEB00268207EB301C9 -:10295B0000701A7EB3010370147EB30105700E7EF6 -:10296B00B3010470087E3701064D33680302492713 -:10297B007EB30102B4015F74047AB3010AE47AB343 -:10298B0001127AB30113740E7E70011248B77412E0 -:10299B007E70201248B774107E70081248B7740E00 -:1029AB007E70021248B774127E70201248B77410F2 -:1029BB007E70081248B7740E7E70011248B77412FD -:1029CB006C771248B774137E70081248B7740E6C8C -:1029DB00771248B7801074037AB3010A74FF7AB385 -:1029EB0001127AB301130200467EB3010AB4042428 -:1029FB007EB30100B4021D7EB301056003022A8D74 -:102A0B007EB30103707C7EB3010270767E370106C4 -:102A1B004D336802806C7E6301047C765E700F1B05 -:102A2B0060682F2E607F68040B6078567E2400014F -:102A3B007CB760053E241478FB7C656E60FF5E639B -:102A4B0001127A630112740E1248B774117E704032 -:102A5B0080247E2400017CB760053E241478FB7C27 -:102A6B00656E60FF5E6301137A630113740E124887 -:102A7B00B774147E70801248B7740E6C771248B717 -:102A8B0080030249270200467EB301005480BEB08A -:102A9B00806803022B1E7EB301031BB168191468F7 -:102AAB00280BB1786E7E3430057E2400FF7A1F012F -:102ABB000E7E34001280547E3430177E2400FF7A51 -:102ACB001F010E7E34004380427EB301021468194D -:102ADB001468280BB1783C7E3430017E2400FF7AD9 -:102AEB001F010E7E34000480227E34305E7E240073 -:102AFB00FF7A1F010E7E34000880107E342FE37E98 -:102B0B002400FF7A1F010E7E34001E7A37010C80E1 -:102B1B000580000249277E370106BE37010C5004A1 -:102B2B007A37010C0248CACA3B7A6301A57F307A17 -:102B3B007301A47AB301A31248DB60057401022B65 -:102B4B00CB7EB301A33EB01247FB600474018070CF -:102B5B001248EB6004740180677EB301A41247FB3B -:102B6B0060047401805A1248EB6004740180517E3A -:102B7B00B301A33EB044011247FB600474018040D3 -:102B8B001248EB60177401803780111200667A3B94 -:102B9B00B012479C6004740180260B747EB301A5B0 -:102BAB00147AB301A578E41200667A3BB012479C05 -:102BBB0060047401800A1248FB600474018001E414 -:102BCB00DA3B226D227EA001C203022C547EB3009D -:102BDB00210A4B09740022BE70206813BE703B683B -:102BEB000EBE700D6809BE700A6804A5BF000520F3 -:102BFB000366804CA5BF2D057EA0FF8043BE7030C1 -:102C0B004019BE70393814D2030AF77E14000AAD8E -:102C1B00127D212D2F9E2400308025A5BF2E1D80D7 -:102C2B00007EB30021047AB300210A3B09B30022D2 -:102C3B00BEB030400BBEB03928E780046D2280183F -:102C4B007EB30021047AB300217EB300210A3B0935 -:102C5B00B300226003022BD81A3AAD32227EB301A5 -:102C6B000AB404247EB30100B4021D7EB3010560D7 -:102C7B0003022CFB7EB3010370767EB301027070EE -:102C8B007E3701064D33680280667E6301047C76D5 -:102C9B005E700F1B60682C2E607F68040B60785091 -:102CAB007E2400017CB760053E241478FB7C654EC6 -:102CBB006301127A630112740E1248B774117E709D -:102CCB001080217E2400017CB760053E241478FB24 -:102CDB007C654E6301137A630113740E1248B7744B -:102CEB00147E70201248B7740E6C771248B78003AD -:102CFB00024927020046CA3B7A3701827F306D3387 -:102D0B007A370185807A74387AB301847E370182F1 -:102D1B00BE34003850047A7301841246897E7301E5 -:102D2B00840A572E540003900004F074CF900005D2 -:102D3B00F07E1701857E3400067E2400011B1A10DD -:102D4B007E7301840A37CA397F137E1400087E0410 -:102D5B0000011200A61BFD7EB30184240812419AC8 -:102D6B007E7301840A372D737E7301840A272E37F5 -:102D7B0001857A3701857E3701829D327A37018250 -:102D8B007E3701824D336803022D11DA3B22CA3B99 -:102D9B007A37017D7F306D337A370180807A7438D2 -:102DAB007AB3017F7E37017DBE34003850047A73CD -:102DBB00017F1246ED7E73017F0A572E540003905C -:102DCB000004F074AF900005F07E1701807E340094 -:102DDB00067E2400011B1A107E73017F0A37CA3945 -:102DEB007F137E1400087E0400011200A61BFD7EDB -:102DFB00B3017F240812419A7E73017F0A372D732A -:102E0B007E73017F0A272E3701807A3701807E3748 -:102E1B00017D9D327A37017D7E37017D4D3368030D -:102E2B00022DA9DA3B227DF37E3403E88D327E142A -:102E3B00000CAD136D007E1F001C120A4A7DE36E61 -:102E4B00E4FFFF0BE44DFF7813E589F5897D3E7CAC -:102E5B00B7F58A0A56F58CD28CD2A922BEF40001A2 -:102E6B007813E589F5897D3E7CB7F58B0A56F58D90 -:102E7B00D28ED2AB22BEF4000278117D3E7CB7F528 -:102E8B00D70A56F5D6438E1043AF0422BEF4000387 -:102E9B0078117D3E7CB7F5D50A56F5D443DD084352 -:102EAB00AF2022BEF4000478107D3E7CB7F5D30A28 -:102EBB0056F5D243DD8043AF4022CAF87D23E4129E -:102ECB0003587F017E34BC207E2445BE12028C7FCA -:102EDB00716D117E04404012030D50057EF003808E -:102EEB00336D117E04437F7F1712030D28057EF08F -:102EFB00FF80217F171203907CF77C47E412035D60 -:102F0B007F017F171201316D117E043F0012030DFB -:102F1B0040020BF07E08015374406C777E601012F8 -:102F2B003A797E08015374407E70FE7C6F123A79B9 -:102F3B007E08015374406C776C66123A797E0801F7 -:102F4B005374406C777E6080123A79DAF822CAF8B3 -:102F5B00740E6C771248B774111248677CFB30E221 -:102F6B000F74117C7F5E70FB1248B7E47AB3010BD0 -:102F7B007CBF30E40A74117C7F4E70801248B77EA0 -:102F8B00B3010B24FD68461468480BB278477CBF2D -:102F9B0030E0427E0801007420123EDA7E370106D3 -:102FAB0012409B7A3701067EB30100546024E0681F -:102FBB000D24E0680E2440780F1200CE80171244C7 -:102FCB009E801212494F800D12492780081234023D -:102FDB008003123907DAF8221E0353005400430012 -:102FEB002000550053004200200053006500720082 -:102FFB00690061006C000403090412010002020065 -:10300B000040BF3402FF000101020001090243002E -:10301B0002010080320904000001020201000524B4 -:10302B0000100105240100010424020205240600FE -:10303B0001070582034000FF09040100020A00009A -:10304B000007058102400000070501024000000057 -:10305B000001000803530054004300CA3B7AB3013C -:10306B00AF7F3069330002E4121D57E47AB301B02D -:10307B006933000412490B7E7301B00A477E54007A -:10308B00079D547E24000160053E241478FB7E735B -:10309B0001AF6C665C754D336808693300027401CF -:1030AB00800569330002E4121D570B3A307401128C -:1030BB001D576933000412490B0B3A30E4121D57AC -:1030CB007EB301B0047AB301B07E7301B0BE700859 -:1030DB00409E6933000412490BDA3B22CA7BCA6B50 -:1030EB00CA5BCA4BCA3BCA2BCA1BCA0BC0D0C08314 -:1030FB00C0827EF1FC74061248677CEB74021248A6 -:10310B00677CCB74041248677CDB7CBE30E1031216 -:10311B0000627CBE30E203123A317CBC30E0031219 -:10312B002F597CBC30E1031241F67CBC30E2031218 -:10313B0042507CBD30E10312258B7CBE30E0031284 -:10314B00005A7AF1FCD082D083D0D0DA0BDA1BDABA -:10315B002BDA3BDA4BDA5BDA6BDA7B32CA797A0F32 -:10316B00018F7CE77CFB1248DB60047401805F7C81 -:10317B00BF3EB01247FB6004740180521248EB60F3 -:10318B0004740180497CBE1247FB60047401803ECD -:10319B001248EB6004740180357CBF3EB0440112D1 -:1031AB0047FB6004740180261248EB6004740180B5 -:1031BB001D1200667E1F018F7A1BB012479C6004A4 -:1031CB007401800A1248FB600474018001E4DA790F -:1031DB0022CA3B7F30E47AB301AD6933000274013C -:1031EB00121D57E47AB301AE0B3A307401121D571E -:1031FB006933000412490B69330002121EFB601F76 -:10320B007E7301AE0A477E5400079D547E34000145 -:10321B0060053E341478FB4E7301AD7A7301AD0B30 -:10322B003A30E4121D576933000412490B7EB30187 -:10323B00AE047AB301AE7E7301AEBE700840A97EB8 -:10324B00B301ADDA3B22CA3B7A3700637F30A9C7A3 -:10325B00AF740E7E70011248B76D337A3700667EFD -:10326B00270063BE24004008057E704080027C75F9 -:10327B007A730065741112486720E0F87F032E17EC -:10328B0000667EB300657E70011248527E73006546 -:10329B000A277D322E3700667A3700667E37006349 -:1032AB009D327A3700637E730065BE704050B0A9C3 -:1032BB00D7AFDA3B227D127D23BE140001782E7C22 -:1032CB00B5540F7E34000160053E341478FB7C67E7 -:1032DB007D120E140E140E140E141A021A002E0464 -:1032EB00007E2E08FE107E0B704C7680324D1178CE -:1032FB00317CB5540F7E34000160053E341478FBED -:10330B007CB764FF7D120E140E140E140E141A02E9 -:10331B001A002E04007E2E08FE107E0B705C7B7A4A -:10332B000B7022CA69CAF87D627A3701AB7CFB7ECF -:10333B0008015374407C7F3E703E702E70067E27D2 -:10334B0001AB7C65123A797E08015374407C7F3E59 -:10335B00703E702E70077E2701AB0A247C65123AF3 -:10336B00797E08015374407C7F3E703E702E70084E -:10337B007C6D123A797E08015374407C7F3E703E1F -:10338B00702E70097C6C123A79DAF8DA6922CA3B32 -:10339B007F307E3BB044017A3BB09F1179330009FB -:1033AB00792300077933000D7923000B693300155E -:1033BB0069230013793300117923000F693300015E -:1033CB001B34680E1B3468120B35782269330015D9 -:1033DB008010693300153E348008693300153E3484 -:1033EB003E346913000569030003E412460BE47ACB -:1033FB003BB06D33DA3B22CAF8740E6C771248B7C8 -:10340B00741112486720E1537E37010CBE34004023 -:10341B0028057EF04080027CF77E0F010E7C7F74C6 -:10342B00201242F60A2F7E37010C9D327A37010C9F -:10343B000A157E1F010E2D317A1F010E7E37010CEE -:10344B004D33780F74117E700A1248B7E47AB301CA -:10345B000B800874117E70021248B7DAF822CA7B0F -:10346B00CA6BCA5BCA4BCA2BCA1BCA0BC0D0C08360 -:10347B00C082E59830E1085398FDE47AB30179E511 -:10348B009830E02A5398FE7EA199BEA07F78157ED6 -:10349B007301B57CB7047AB301B5BE7014280A75F5 -:1034AB00C7608005E47AB301B57CBA123FFAD082CB -:1034BB00D083D0D0DA0BDA1BDA2BDA4BDA5BDA6B90 -:1034CB00DA7B32CA3B7A73016D7AB3016C7F3012AF -:1034DB0043BA7F037EB3016C3EB01230667F03129A -:1034EB0041047F037EB3016D1230667F03124104EA -:1034FB007F031243BA7F037EB3016C3EB0440112CB -:10350B0030667F031241047F031231DC7E1F016E94 -:10351B007A1BB07F031240D07F031240317E1F0114 -:10352B006E7E1BB0DA3B227E340006121EFB701A35 -:10353B007E1F01740B1C7A1F0174BE182710401DCF -:10354B007E1827107A1F017480137E340007121E19 -:10355B00FB700A9F117A1F01747A3701727E1F016B -:10356B0074BE1807D040097E1400037A170172222B -:10357B00BE18006440127E370172BE340002680828 -:10358B007E3400017A370172227E3400377E2400AC -:10359B0001120A7E7E3400367E240001120A7E7EE2 -:1035AB003400357E240001120A7E7E340037E4128B -:1035BB001D577E340036E4121D577E340035E4125D -:1035CB001D577E3400067E2400011232C07E34006B -:1035DB00077E2400011232C07E3400066D22120ACF -:1035EB007E7E3400076D22020A7E7A1F014A7E34EA -:1035FB00014D7E2400007E1B307E34014E7E240064 -:10360B00007A1B307E34014C7E2400007E1B307E02 -:10361B0034014F7E2400007A1B307E34014B7E2414 -:10362B0000007E1B307E3401507E2400007A1B305C -:10363B007E34014A7E2400007E1B307E3401517E95 -:10364B002400007A1B307E1F014E22CAD8CA797C17 -:10365B00F67CE77CDB1248DB6004740180487CBDA0 -:10366B003EB01247FB60047401803B1248EB6004D0 -:10367B00740180327CBE1247FB60047401802712F8 -:10368B0048EB60047401801E7CBF1247FB6004741E -:10369B000180131248EB60047401800A1248FB602E -:1036AB000474018001E4DA79DAD8227CAB53BACF07 -:1036BB0043BA801B3468141B3468151B3468162EF0 -:1036CB003400037813E5BAF5BA800D43BA108008BD -:1036DB0043BA20800343BA307E14FE807E04007E02 -:1036EB007E0BB044407A0BB07E0BB044807A0BB0AB -:1036FB007CBA543F7E0B704C7B7A0B70E47E34FEAD -:10370B00827E24007E7A1BB022E46C771248B77459 -:10371B00017E70081248B774077E703F1248B77469 -:10372B00097E703F1248B7740B7E70071248B7744E -:10373B00016C771248B774027AB3010AE47AB301C9 -:10374B000B7AB301127AB301137E3401007E24008D -:10375B00C27A1F01597AB3015D7AB3015E74087A9C -:10376B00B3015FA9D7AF227CAB1B34681E1B346837 -:10377B002A1B3468362E340003783F7EB3017970F0 -:10378B00FA74017AB301797AA199227EB3017A7026 -:10379B00FA74017AB3017A7AA19B227EB3017B7012 -:1037AB00FA74017AB3017B7AA1AD227EB3017C70EE -:1037BB00FA74017AB3017C7AA1FE227EB30100B4C4 -:1037CB0080227EB30103701C7EB3010270167EB3A0 -:1037DB00010570107EB30104700A7E370106BE34FA -:1037EB00000168030249277EB3010AB4040A7E3440 -:1037FB00305C7E2400FF80087E34305A7E2400FF2C -:10380B007A1F010E7E3400017A37010C0248CA1B65 -:10381B0034681B1B3468221B34682B1B3468340B35 -:10382B0036783CC28C758C00758A00D28C22C28E85 -:10383B00758D00758B00D28E22538EEF75D6007569 -:10384B00D700438E102253DDF775D40075D5004396 -:10385B00DD082253DD7F75D20075D30043DD802256 -:10386B00CA3B7F707CF57CE67CD77CCBCA7B0A3667 -:10387B006D222F110A1F6D001209E6DA0B122D991A -:10388B001246ED7405900004F074A8900005F090BA -:10389B0000067AEBC09000077AEBD09000087AEB29 -:1038AB00E09000097AEBF0740A12419ADA3B227D20 -:1038BB00236D331B24681A1B2468201B2468261BCA -:1038CB0024682C0B267834E58C7C6B6C77E58A802E -:1038DB0026E58D7C6B6C77E58B801CE5D67C6B6C61 -:1038EB0077E5D78012E5D47C6B6C77E5D58008E55E -:1038FB00D27C6B6C77E5D30A2B4D3222740E6C772E -:10390B001248B7741112486730E03D7E0F010E74F8 -:10391B0020123EDA0A1B7E27010C9D217A27010C0F -:10392B007E1F010E2D317A1F010E7E37010C4D3398 -:10393B00780E74117E70481248B7E47AB3010B22EB -:10394B0074117E70400248B7221B34681C1B34680C -:10395B00241B34682A1B3468300B367835758A0083 -:10396B00758C00438904D28C22758B00758D0043B6 -:10397B008940D28E2275D70075D600438E182275DA -:10398B00D50075D40043DD0C2275D30075D20043EE -:10399B00DDC022CAF87EB3010070237EB30105702F -:1039AB001D7EB3010470177EB3010370117EF3010A -:1039BB0002BEF08050087E3701064D336805124970 -:1039CB00278017E47C7F1248B74CFF680474038090 -:1039DB000274027AB3010A120046DAF822CA797A23 -:1039EB000F00C01247837453900004F0E49000055D -:1039FB00F0900006F0900007F07E3400C07E2400AB -:103A0B00007A1F00947E1400087E0400017E1F00C4 -:103A1B00C01203CD7D732E7400087D570B541241D9 -:103A2B009A7D37DA7922E46C771248B774027AB34D -:103A3B00010AE47AB3010B740E7E70011248B7745D -:103A4B00117E70481248B7740E7E70021248B7741C -:103A5B00117E70481248B7740E7E70011248B7740D -:103A6B00147E70901248B7740E6C770248B7CA3B3D -:103A7B007A6301A87A7301A77AB301A67F30124348 -:103A8B00BA7F037EB301A63EB01230667F031241AC -:103A9B00047F037EB301A71230667F031241047FBC -:103AAB00037EB301A81230667F031241047F031219 -:103ABB004031DA3B22CAF87CFBBEF03B28037EF098 -:103ACB003B744C900000F07445900001F0744490EE -:103ADB000002F07428900003F09000047AEBF00AD7 -:103AEB003FCA397F107E1400057E0400011200A628 -:103AFB001BFD7CBF240512419ADAF822CAF87CFB25 -:103B0B00BEF03B28037EF03B744C900000F07445F4 -:103B1B00900001F07444900002F07440900003F0A8 -:103B2B009000047AEBF00A3FCA397F107E1400052F -:103B3B007E0400011200A61BFD7CBF240512419AD6 -:103B4B00DAF8227F617F702E140007693000020BB8 -:103B5B000A202F16801769570015694700137F0736 -:103B6B002E140007693000020B0A209F12793000D7 -:103B7B00021B0A206917000969070007693700153E -:103B8B0069270013BF1028CE227F617F702E14008F -:103B9B000B693000020B0A202F168017695700158E -:103BAB00694700137F072E14000B693000020B0AC4 -:103BBB00209F12793000021B0A206917000D69073C -:103BCB00000B6937001569270013BF1028CE22CAD6 -:103BDB0069CAF86D666CFF80167E340001124828A6 -:103BEB007D360B64BE34001E40057EF001800E7ED8 -:103BFB0034FE827E24007E7E1BB030E6DC7E34FEFB -:103C0B00827E24007E7E1BB054BF7A1BB07CBFDA51 -:103C1B00F8DA69227D437F707E1F014279370005F8 -:103C2B0079270003E47A7BB0794700019F1179373C -:103C3B000009792700077937000D7927000B7E1FC4 -:103C4B000146793700117927000F7E1F014679371E -:103C5B000015792700136D33227F717F607CAB6C6D -:103C6B007780310A170A2A2D217F062D127E0BB081 -:103C7B007E7B60BCB6680E7E0F019B7E0B609C67E3 -:103C8B007A0B60E4220BF47E0F019B7E0BB0047A5F -:103C9B000BB00B707E7BB070CA7401227EB30062D6 -:103CAB00603AE47EA300210A3A19B300227AB300EA -:103CBB00217E1800217A1F019B7E0800227E344A48 -:103CCB00327E2400FF123C647E144A297E0400FFDE -:103CDB00124223E47AB300217AB30062227EB3014D -:103CEB005270397E3400157A3701537E3400147AC2 -:103CFB003701557E34000A7A3701577E080153127B -:103D0B0042CD7E08015374406C776C66123A797E13 -:103D1B00340032122EC574017AB3015222CA3B7C95 -:103D2B00F57CE67CD77CCB7C7EAC7F122D011246DA -:103D3B00897405900004F074C8900005F09000069B -:103D4B007AEBC09000077AEBD09000087AEBE0900A -:103D5B0000097AEBF0740A12419ADA3B227584015E -:103D6B007E44041FE47A49B01B4478F97EF801B510 -:103D7B007E0400FF7E1449AE0B0A405D44681A694D -:103D8B002000020B0E0B44800A7E0BB07A29B00B7D -:103D9B00240B0C1B4478F280DF02427B7D127D23C7 -:103DAB004D23780CBE140000A9A1D1B39288D2A8E0 -:103DBB00BE24000178082E14FFFF928AD2AABE24DB -:103DCB0000027803438F10BE2400037803438F2037 -:103DDB00BE2400047803438F40227EB3010AB4044F -:103DEB001D7EB30100B481167EB3010370107EB348 -:103DFB000105700A7E370106BE34000168030249D3 -:103E0B00277E34305A7E2400FF7A1F010E7E340049 -:103E1B00017A37010C0248CACA797D737E340037A8 -:103E2B00BE740037780474018001E4121D577E3490 -:103E3B000036BE740036780474018001E4121D57FD -:103E4B007E340035BE740035780474018001E412B1 -:103E5B001D57DA7922CAF87CFB7A1F019F12478320 -:103E6B00744C900004F07401900005F09000067AF9 -:103E7B00EBF0E4900007F07E0F019F7E3400087E8C -:103E8B00240001791100021B1A00740C12419ADAFA -:103E9B00F822CA3B7F307A7301B47AB301B312496B -:103EAB00350B347F03122D991246ED7403900004E9 -:103EBB00F074A7900005F07EB301B3900006F07E7E -:103ECB00B301B4900007F0740812419ADA3B22CA8E -:103EDB003B7F30CAB80BFD74161248677AFBB039BA -:103EEB00BFFFFF800C29BFFFFE1248677A3BB00B68 -:103EFB00747EFBA07CBA147AFBB04CAA78E729BF7E -:103F0B00FFFF9EF80003DA3B22CA3B7D727CCB128B -:103F1B0046897406900004F074C6900005F0740195 -:103F2B00900006F09000077AEBC09000087AEB70D7 -:103F3B007E3400097E2400011B1A70740B12419A07 -:103F4B00DA3B22CA3B7D727CCB1246897406900009 -:103F5B0004F074C6900005F07402900006F0900017 -:103F6B00077AEBC09000087AEB707E3400097E2450 -:103F7B0000011B1A70740B12419ADA3B227E081750 -:103F8B00707E7F001C7F17120A4A7A3701877E14D6 -:103F9B00CFC07E04006A7F17120A4A7A3701897EE6 -:103FAB00341B007E2400B7BF71180A7E3701890BC2 -:103FBB00347A37018922CA3B7D727CCB12468974D5 -:103FCB0006900004F074C6900005F0E4900006F033 -:103FDB009000077AEBC09000087AEB707E340009F2 -:103FEB007E2400011B1A70740B12419ADA3B227C5F -:103FFB00AB7EB30062702E7E7300217CB7047AB364 -:10400B0000210A3719A300227EA300210A3A09B323 -:10401B000021B43B0674017AB30062BEA040400598 -:10402B00E47AB3002122CA3B7F3069330002E412E9 -:10403B001D576933000412490B0B3A307401121DE2 -:10404B00576933000412490B693300027401121DC6 -:10405B00576933000412490BDA3B22CA3B124783E0 -:10406B007443900004F0E4900005F0900006F0908B -:10407B000007F07E340008CA397F107E1400087EDA -:10408B000400011200A61BFD741012419ADA3B22A8 -:10409B007A3700637E3400647E2400007E1B307E02 -:1040AB003400657E2400007A1B307E3400637E244E -:1040BB0000007E1B307E3400667E2400007A1B30AD -:1040CB007E37006522CA3B7F3069330002740112D0 -:1040DB001D576933000412490B0B3A307401121D42 -:1040EB00576933000412490B0B3A30E4121D576920 -:1040FB0033000412490BDA3B22CA3B7F3069330091 -:10410B0002E4121D576933000412490B0B3A307449 -:10411B0001121D576933000412490B0B3A30E4129C -:10412B001D576933000412490BE4DA3B22CA3B7F6B -:10413B00311247837444900004F07401900005F031 -:10414B00E4900006F0900007F07E3400087E240017 -:10415B0001797100021B1A60740C12419ADA3B222E -:10416B0043BA8053BACF1B3468141B3468151B3405 -:10417B0068162E3400037813E5BAF5BA800D43BAEE -:10418B0010800843BA20800343BA3053BA7F22CA47 -:10419B00F87CFBA9C7AF740E7E70011248B774117F -:1041AB0012486720E0F87E1400007E0400017CBFFB -:1041BB007E7001124852D202A9D7AFDAF822CAB8E0 -:1041CB00CA1B7E34FD107E24007E7E1BB030E408BB -:1041DB007E1BB054EF7A1BB07E1BB030E5087E1B04 -:1041EB00B054DF7A1BB0DA1BDAB832CAF8740E7E21 -:1041FB0070011248B774111248677CFB30E50874E4 -:10420B00117E70401248B77CBF30E20774116C7797 -:10421B001248B7C202DAF822CA797A0F00907E34BC -:10422B0000907E2400007A1F00947E1400007E0410 -:10423B0000017E1F00901203CD7D737CB712419A53 -:10424B007D37DA7922CAF8740E7E70021248B77481 -:10425B00111248677CFB30E50874117E70401248E0 -:10426B00B77CBF30E20774116C771248B7DAF822CB -:10427B001227ED7E3403E81247E47E144A127E04C3 -:10428B0000FF1242237E3403E81247E47E1449FEFA -:10429B007E0400FF12422380ECCA3B7F307A370149 -:1042AB0066800C7E3701667E3BB00B741237727ED4 -:1042BB001F01687F011B0C7A0F01684D2378E4DA2C -:1042CB003B22CA3B7F300B3A306D22120A7E693398 -:1042DB0000026D22120A7E0B3A307401121D5769CF -:1042EB003300027401121D57DA3B22CA3BCA787F96 -:1042FB0030CAB8800B7EFBB07E3B700B741248B794 -:10430B0029AFFFFF7CBA1439BFFFFF4CAA78E61B1D -:10431B00FDDA3B227EB3010AB4041B7EB30100B469 -:10432B0001147EB30103700E7EB3010570087E3756 -:10433B0001064D336803024927020046CAF87CFB8D -:10434B001246ED7403900004F074A3900005F07412 -:10435B0002900006F09000077AEBF0740812419A75 -:10436B00DAF8227EB3010AB404097EB30100BEB0B1 -:10437B00A168030249277E1801597A1F010E7E3767 -:10438B0001067A37010C0248CA7EB3010AB404094C -:10439B007EB30100BEB02168030249277E18015984 -:1043AB007A1F010E7E3701067A37010C024919CAB2 -:1043BB003B7F3069330002E4121D5769330004124E -:1043CB00490B0B3A30E4121D576933000412490BA9 -:1043DB00DA3B227E3400336D22120A7E7E340034A7 -:1043EB006D22120A7E7E340034E4121D577E340097 -:1043FB00337401021D57CAF87CFB12468974029074 -:10440B000004F074C5900005F09000067AEBF07490 -:10441B000712419ADAF822CAF87CFB124689740219 -:10442B00900004F074C4900005F09000067AEBF055 -:10443B00740712419ADAF822CAF87CFB1246ED7423 -:10444B0002900004F074A5900005F09000067AEB42 -:10445B00F0740712419ADAF822CA3B7F307A37019F -:10446B00A9800C7E3701A97E3BB00B741237727E8C -:10447B003BB070EFDA3B227E370172BE340001781D -:10448B000D7E3400027A3701727E340001227E37B2 -:10449B000172227EB3010124DF680A14680A0BB192 -:1044AB00780902439402436E024812024927CAB8A4 -:1044BB00E59A30E108539AFDE47AB3017AE59A3034 -:1044CB00E003539AFEDAB832CAB8E5AC30E10853D0 -:1044DB00ACFDE47AB3017BE5AC30E00353ACFEDA20 -:1044EB00B832CAB8E5FD30E10853FDFDE47AB301FB -:1044FB007CE5FD30E00353FDFEDAB83212468974D9 -:10450B0002900004F074C7900005F074019000064F -:10451B00F0740702419A1246897402900004F074F9 -:10452B00C0900005F07401900006F0740702419AE8 -:10453B001246ED7402900004F074A3900005F07421 -:10454B0001900006F0740702419A1246ED74029036 -:10455B000004F074A4900005F07401900006F07450 -:10456B000702419A1246897402900004F074C290BB -:10457B000005F07401900006F0740702419A124690 -:10458B00ED7402900004F074A2900005F074029098 -:10459B000006F0740702419A1246897402900004D7 -:1045AB00F074C1900005F07401900006F0740702DE -:1045BB00419A1246ED7402900004F074A09000052D -:1045CB00F07401900006F0740702419A1246ED74E4 -:1045DB0002900004F074A2900005F07401900006A4 -:1045EB00F0740702419A1246ED7402900004F074C5 -:1045FB00A1900005F07401900006F0740702419A37 -:10460B00CAF87DF37CFB7F207F1080071BF47A2B8D -:10461B00F00B544DFF78F5DAF8227F017E370189D4 -:10462B007D231B247D3278F87F201B2C7F024D4588 -:10463B0078EA2274017E34FE827E24007E7A1BB0DF -:10464B0074057E34FE817A1BB0023BDACAF80A5B32 -:10465B002E540020123EDA7CFB74146C771248B790 -:10466B007CBFDAF8221246897402900004F074C001 -:10467B00900005F0E4900006F0740702419A744F25 -:10468B00900000F0744C900001F07445900002F023 -:10469B007480900003F0221246ED7402900004F037 -:1046AB0074A4900005F0E4900006F0740702419AA0 -:1046BB001246897402900004F074C7900005F0E470 -:1046CB00900006F0740702419A1246ED74029000B6 -:1046DB0004F074A0900005F0E4900006F07407025B -:1046EB00419A744C900000F07443900001F07444B4 -:1046FB00900002F07480900003F0221246ED7402D9 -:10470B00900004F074A3900005F0E4900006F074A0 -:10471B000702419A1246897402900004F074C29009 -:10472B000005F0E4900006F0740702419A124689E6 -:10473B007402900004F074C1900005F0E490000640 -:10474B00F0740702419A1246ED7402900004F07463 -:10475B00A1900005F0E4900006F0740702419A1254 -:10476B0046ED7402900004F074A2900005F0E49002 -:10477B000006F0740702419A7437900000F07453EE -:10478B00900001F07445900002F07447900003F024 -:10479B0022E47E34FE827E24007E7A1BB074057E7A -:1047AB0034FE817A1BB0023BDAA9C7AF740E7E7060 -:1047BB00011248B774146C771248B7C200A9D7AF6F -:1047CB0022CA797D7380077E3403E81200267D3779 -:1047DB001B744D3378F1DA79227D237E3701877D87 -:1047EB00131B147D3178F87D121B147D2178EC227C -:1047FB007E34FE867E24007E7A1BB074027E34FEED -:10480B00817A1BB0023BDA7EB3010AB404097EB392 -:10481B000100BEB0216803024927020046800A7ED0 -:10482B00A0097CBA147CAB78F97D231B344D22781C -:10483B00EE227F70691700116907000F69370015A9 -:10484B00692700139F10227CA77C7B0A5A2E5400E9 -:10485B00201242F674117E70010248B77CABE5FC66 -:10486B0020E7FB7CBA4480F5FCE5FC20E7FBE5EC9C -:10487B00221246ED7401900004F074A6900005F02E -:10488B00740602419A1246897401900004F074C3B5 -:10489B00900005F0740602419A7E1400407E0400DD -:1048AB00017E7301080A37123251D3227CA77C7B1D -:1048BB00E5FC20E7FB7CB7547FF5FC7AA1EC227476 -:1048CB00037AB3010B74117E70401248B7023402A5 -:1048DB0074017E34FE817E24007E7A1BB0023BDAAB -:1048EB0074037E34FE817E24007E7A1BB0023BDA99 -:1048FB0074067E34FE817E24007E7A1BB0023BDA86 -:10490B007D236D338003000B34BD2338F9227404EF -:10491B007AB3010B74117E70400248B774057AB3F9 -:10492B00010B74117E70600248B76D3380020B343B -:10493B007E0BB00B1470F7227EB301526005E47A44 -:10494B00B301522202492728302900007EFED500F0 -:10495B007EFED7007EFED9007EFEDB007EFEF500DC -:10496B007EFEF7007EFEF9007EFEFB007EFED2008F -:10497B007EFEF2007EFECC007EFECD007EFEEC00C5 -:10498B007EFEED007EFEC8007EFEC9007EFECA00E4 -:10499B007EFECB007EFEE8007EFEE9007EFEEA0096 -:1049AB007EFEEB0004001C01FA40000002018700B0 -:1049BB0000000201890000000101520000010021EA -:1049CB00000001006200000201720000000401748B -:1049DB00000000000004012E00FF4A3600040132E3 -:1049EB000000000000040136000000000001010976 -:1049FB0000000053797374656D2052756E6E696E8D -:104A0B00672E2E2E0D0A0053797374656D20496E37 -:104A1B0069742E2E2E0D0A004F4B210D0A00457284 -:104A2B00726F72210D0A00504F5700405354434987 -:044A3B0053502300B1 +:100A7B007F122200000000000000000000000000B8 +:100A8B00000000000000F800000000000000333000 +:100A9B0000000000100C06100C0600000000000007 +:100AAB0000000040C07840C0784000043F04043F81 +:100ABB00040400007088FC08300000001820FF219F +:100ACB001E0000F008F000E018000000211C031EBF +:100ADB00211E0000F00888700000001E212324193D +:100AEB0027211010160E000000000000000000006F +:100AFB00000000000000E0180402000000000718CE +:100B0B0020400000020418E00000000040201807FD +:100B1B00000000404080F0804040000202010F01C5 +:100B2B00020200000000F0000000000101011F01A3 +:100B3B00010100000000000000000080B070000008 +:100B4B000000000000000000000000000101010196 +:100B5B000101010000000000000000003030000027 +:100B6B0000000000000000806018040060180601FF +:100B7B0000000000E010080810E000000F1020201B +:100B8B00100F00001010F8000000000020203F2084 +:100B9B00200000007008080888700000302824220C +:100BAB0021300000300888884830000018202020B1 +:100BBB00110E000000C02010F800000007042424D0 +:100BCB003F240000F808888808080000192120201D +:100BDB00110E0000E0108888180000000F11202073 +:100BEB00110E0000380808C83808000000003F004C +:100BFB000000000070880808887000001C2221216A +:100C0B00221C0000E010080810E000000031222236 +:100C1B00110F00000000C0C00000000000003030C9 +:100C2B000000000000008000000000000080600059 +:100C3B0000000000008040201008000001020408A2 +:100C4B001020004040404040404000040404040495 +:100C5B00040400000810204080000000201008044D +:100C6B00020100007048080808F000000000303650 +:100C7B00010000C030C828E810E000071827242323 +:100C8B00140B000000C038E0000000203C230202DF +:100C9B0027382008F8888888700000203F20202003 +:100CAB00110E00C030080808083800071820202053 +:100CBB0010080008F808080810E000203F2020204A +:100CCB00100F0008F88888E8081000203F20202328 +:100CDB0020180008F88888E8081000203F2000033F +:100CEB00000000C030080808380000071820202238 +:100CFB001E020008F808000008F808203F21010137 +:100D0B00213F20000808F8080800000020203F20A1 +:100D1B0020000000000808F8080800C08080807FD1 +:100D2B0000000008F888C028180800203F20012682 +:100D3B0038200008F8080000000000203F20202089 +:100D4B0020300008F8F800F8F80800203F003F00BA +:100D5B003F200008F830C00008F808203F200007AB +:100D6B00183F00E01008080810E0000F10202020AA +:100D7B00100F0008F808080808F000203F210101B7 +:100D8B00010000E01008080810E0000F18242438B8 +:100D9B00504F0008F8888888887000203F20000397 +:100DAB000C302000708808080838000038202121FA +:100DBB00221C00180808F8080818000000203F2023 +:100DCB0000000008F808000008F808001F20202089 +:100DDB00201F000878880000C83808000007380E6C +:100DEB00010000F80800F80008F800033C070007B2 +:100DFB003C0300081868808068180820302C030317 +:100E0B002C30200838C800C83808000000203F20CC +:100E1B0000000010080808C83808002038262120D8 +:100E2B00201800000000FE020202000000007F40BC +:100E3B00404000000C30C000000000000000010624 +:100E4B0038C00000020202FE000000004040407F5C +:100E5B000000000000040202020400000000000079 +:100E6B0000000000000000000000008080808080F7 +:100E7B0080808000020204000000000000000000DF +:100E8B0000000000008080808000000019242222D6 +:100E9B00223F2008F8008080000000003F11202036 +:100EAB00110E000000008080800000000E11202039 +:100EBB00201100000000808088F800000E11202017 +:100ECB00103F200000808080800000001F22222223 +:100EDB00221300008080F0888888180020203F2093 +:100EEB002000000000808080808000006B94949430 +:100EFB0093600008F8008080800000203F210000F4 +:100F0B00203F2000809898000000000020203F2008 +:100F1B00200000000000809898000000C0808080B6 +:100F2B007F000008F8000080808000203F24022D05 +:100F3B00302000000808F8000000000020203F20AF +:100F4B002000008080808080808000203F20003F38 +:100F5B0020003F8080008080800000203F21000027 +:100F6B00203F200000808080800000001F20202078 +:100F7B00201F00808000808000000080FFA12020C7 +:100F8B00110E000000008080808000000E112020D8 +:100F9B00A0FF80808080008080800020203F212067 +:100FAB000001000000808080808000003324242416 +:100FBB00241900008080E0808000000000001F20CA +:100FCB002000008080000000808000001F20202077 +:100FDB00103F20808080000080808000010E300850 +:100FEB0006010080800080008080800F300C030C95 +:100FFB00300F0000808000808080000020312E0E9A +:10100B00312000808080000080808080818E70186D +:10101B0006010000808080808080000021302C221F +:10102B0021300000000000807C0202000000000064 +:10103B003F404000000000FF00000000000000FFE8 +:10104B000000000002027C800000000040403F00D6 +:10105B000000000006010102020404000000000071 +:10106B000000000000000000000000002F00000046 +:10107B00000700070000147F147F1400242A7F2A26 +:10108B0012006264081323003649552250000005F4 +:10109B0003000000001C224100000041221C000044 +:1010AB0014083E08140008083E0808000000A06061 +:1010BB00000008080808080000606000000020100D +:1010CB00080402003E5149453E0000427F400000AB +:1010DB004261514946002141454B31001814127FA2 +:1010EB0010002745454539003C4A494930000171FC +:1010FB0009050300364949493600064949291E00AE +:10110B00003636000000005636000000081422415D +:10111B0000001414141414000041221408000201DE +:10112B0051090600324959513E007C1211127C00C4 +:10113B007F49494936003E41414122007F414122CE +:10114B001C007F49494941007F09090901003E41C3 +:10115B0049497A007F0808087F0000417F41000061 +:10116B002040413F01007F08142241007F40404056 +:10117B0040007F020C027F007F0408107F003E417D +:10118B0041413E007F09090906003E4151215E00A5 +:10119B007F091929460046494949310001017F0160 +:1011AB0001003F4040403F001F2040201F003F40B8 +:1011BB0038403F00631408146300070870080700E9 +:1011CB00615149454300007F41410000552A552A92 +:1011DB0055000041417F0000040201020400404021 +:1011EB004040400000010204000020545454780099 +:1011FB007F48444438003844444420003844444831 +:10120B007F00385454541800087E0901020018A4BA +:10121B00A4A47C007F080404780000447D400000F7 +:10122B004080847D00007F102844000000417F40F7 +:10123B0000007C04180478007C080404780038440F +:10124B0044443800FC242424180018242418FC00DF +:10125B007C0804040800485454542000043F4440C4 +:10126B0020003C4040207C001C2040201C003C40C7 +:10127B0030403C004428102844001CA0A0A07C0057 +:10128B004464544C44141414141414CA3B7A1F00B1 +:10129B00807F309F117A1F00847E34007C7E240077 +:1012AB00007A1F00880217857E1F00807E1BB07A94 +:1012BB00B3008CB4250280030217650B347A1F0030 +:1012CB00807E1BB024DBBEB054400302177B7EA094 +:1012DB0003A49012E17302175602177B02177B02CD +:1012EB00177B02177B02177B02177B02177B0217F8 +:1012FB007B02177B02177B02177B02177B02177B84 +:10130B0002177B02177B02177B02177B02177B02EC +:10131B00177B02177B02177B02177B02177B0217C7 +:10132B007B02177B02177B02177B02177B02177B53 +:10133B0002177B02177B02177B02146F02177B02CB +:10134B00177B02177B02177B02177B02177B021797 +:10135B007B02177B02177B02177B02177B02177B23 +:10136B0002177B02177B02177B02177B02177B028C +:10137B00166102177B02177B02177B02177B021782 +:10138B007B02177B02177B02177B02177B02177BF3 +:10139B000213DD0213F602177B02146F02177B0296 +:1013AB00177B0213F602177B02177B02177B0217C0 +:1013BB007B02177B02160A02170502177B02177BAB +:1013CB000216C302177B0215B202177B02177B02B0 +:1013DB0016617E1F00881B367A1F00887E0F0088DF +:1013EB00693000027A73008D02176C7E1F00881B18 +:1013FB00367A1F00887E0F0088693000020B0A20A6 +:10140B007A1F00AE740A7AB300B37E08008D7401A4 +:10141B001246F17AB300B27E1F00AEBE1800005820 +:10142B00127EA02D7EB300B20A4B19A4008D047A54 +:10143B00B300B27E08008D7E7300B20A376D2212A4 +:10144B005A0D7E7300B20A37CA397E18008D7F039E +:10145B001200A61BFD7E7300B20A372D737E73003C +:10146B00B20216B67E1F00881B367A1F00887E0FCD +:10147B000088693000020B0A207A1F00AE740A7ACA +:10148B00B300B31203907E08008D74011246F17AFB +:10149B00B300B29F007E1F00AE12030D50127EA050 +:1014AB002D7EB300B20A4B19A4008D047AB300B29F +:1014BB007E08008D7E7300B20A376D22125A0D7EA4 +:1014CB007300B20A37CA397E18008D7F031200A64B +:1014DB001BFD7E7300B20A372D737E7300B20A17A1 +:1014EB006D007E1F00842F107A1F00847E7F00AE5C +:1014FB007F171203907CB41203537F017F171201E5 +:10150B00317E1424007E0449741201EC7A1F00AE64 +:10151B00BE1800006814740A7AB300B31203907EED +:10152B0008008D74011246F1801C74307AB300925E +:10153B007AB300917AB300907AB3008F7AB3008EAE +:10154B007AB3008D74067AB300B27E7030800F7E52 +:10155B00B300B20A2B1972008D047AB300B27EA3CA +:10156B0000B2BEA00640E8742E0A4A19B4008D7C66 +:10157B00B9047AB300B27E08008D7E7300B20A37CD +:10158B006D22125A0D7E7300B20A37CA397E1800CB +:10159B008D7F031200A61BFD7E7300B20A372D73DD +:1015AB007E7300B20216B67E1F00881B367A1F00B0 +:1015BB00887E0F0088693000020B0A207A1F00AE6C +:1015CB00740A7AB300B37E08008DE41246F17AB345 +:1015DB0000B27E08008D0A3B6D22125A0D7E7300FD +:1015EB00B20A37CA397E18008D7F031200A61BFD85 +:1015FB007E7300B20A372D737E7300B20216B67E6D +:10160B001F00881B367A1F00887E0F008869300008 +:10161B00020B0A207A1F00AE74087AB300B37E085F +:10162B00008DE41246F17AB300B27E08008D0A3BBE +:10163B006D22125A0D7E7300B20A37CA397E18001A +:10164B008D7F031200A61BFD7E7300B20A372D732C +:10165B007E7300B280557E1F00881B367A1F008870 +:10166B007E0F0088693000020B0A207A1F00AE74CF +:10167B00107AB300B37E08008DE41246F17AB30002 +:10168B00B27E08008D0A3B6D22125A0D7E7300B29A +:10169B000A37CA397E18008D7F031200A61BFD7E08 +:1016AB007300B20A372D737E7300B20A176D007E7A +:1016BB001F00842F100217777E1F00881B367A1F9E +:1016CB0000887E0F0088693000020B0A20801C7E88 +:1016DB001F008D7E1B707A3B700B747E1F00840B7A +:1016EB001C7A1F00847E1F008D0B347A1F008D7EA9 +:1016FB001F008D7E1BB070D780767E1F00881B3637 +:10170B007A1F00887E0F0088693000020B0A207A4E +:10171B001F00AE74107AB300B37E08008DE412463E +:10172B00F17E08008D7E180008125A0D7E340008D9 +:10173B00CA397E18008D7F031200A61BFD2E740084 +:10174B00087E1F00842E180008802174257A3BB078 +:10175B000B747E1F00840B1C80127E1F00807E1B6F +:10176B00707A3B700B747E1F00840B1C7A1F0084F5 +:10177B007E1F00800B347A1F00807E1F00807E1B33 +:10178B00B060030212B37E1F0084DA3B227D127D10 +:10179B00234D1168030218A97D325E3400F0781ACC +:1017AB007CB5540F7E04000160053E041478FB7C6D +:1017BB00A16EA0FF7CBA52935294BE340010781ADB +:1017CB007CB5540F7E04000160053E041478FB7C4D +:1017DB00A16EA0FF7CBA52915292BE340020781AAF +:1017EB007CB5540F7E04000160053E041478FB7C2D +:1017FB00A16EA0FF7CBA52955296BE340030781A77 +:10180B007CB5540F7E04000160053E041478FB7C0C +:10181B00A16EA0FF7CBA52B152B2BE340040781A0E +:10182B007CB5540F7E04000160053E041478FB7CEC +:10183B00A16EA0FF7CBA52B352B4BE340050781ADA +:10184B007CB5540F7E04000160053E041478FB7CCC +:10185B00A16EA0FF7CBA52C952CABE340060781A7E +:10186B007CB5540F7E04000160053E041478FB7CAC +:10187B00A16EA0FF7CBA52CB52CCBE340070680371 +:10188B00021B8E7CB5540F7E34000160053E341470 +:10189B0078FB7CA76EA0FF7CBA52E152E222BE1409 +:1018AB00000168030219B07D325E3400F078197CB8 +:1018BB00B5540F7E04000160053E041478FB7CB127 +:1018CB0064FF52937CB14294BE34001078197CB5FE +:1018DB00540F7E04000160053E041478FB7CB16458 +:1018EB00FF52917CB14292BE34002078197CB554E2 +:1018FB000F7E04000160053E041478FB7CB164FF8D +:10190B0052957CB14296BE34003078197CB5540F99 +:10191B007E04000160053E041478FB7CB164FF5229 +:10192B00B17CB142B2BE34004078197CB5540F7E05 +:10193B0004000160053E041478FB7CB164FF52B3D4 +:10194B007CB142B4BE34005078197CB5540F7E0480 +:10195B00000160053E041478FB7CB164FF52C97C26 +:10196B00B142CABE34006078197CB5540F7E0400B6 +:10197B000160053E041478FB7CB164FF52CB7CB153 +:10198B0042CCBE3400706803021B8E7CB5540F7EB4 +:10199B0034000160053E341478FB7CA77CBA64FFED +:1019AB0052E1021B8ABE1400026803021AA77D32A1 +:1019BB005E3400F078177CB5540F7E04000160058F +:1019CB003E041478FB7CB1429364FF5294BE340006 +:1019DB001078177CB5540F7E04000160053E04148B +:1019EB0078FB7CB1429164FF5292BE340020781791 +:1019FB007CB5540F7E04000160053E041478FB7C1B +:101A0B00B1429564FF5296BE34003078177CB554C2 +:101A1B000F7E04000160053E041478FB7CB142B1DB +:101A2B0064FF52B2BE34004078177CB5540F7E046D +:101A3B00000160053E041478FB7CB142B364FF5295 +:101A4B00B4BE34005078177CB5540F7E040001608F +:101A5B00053E041478FB7CB142C964FF52CABE3404 +:101A6B00006078177CB5540F7E04000160053E04BE +:101A7B001478FB7CB142CB64FF52CCBE340070684F +:101A8B0003021B8E7CB5540F7E34000160053E347F +:101A9B001478FB7CB742E164FF52E222BE140003D0 +:101AAB006803021B8E7D325E3400F078157CB554D2 +:101ABB000F7E14000160053E141478FB7CB3429337 +:101ACB004294BE34001078157CB5540F7E1400017F +:101ADB0060053E141478FB7CB342914292BE3400F5 +:101AEB002078157CB5540F7E14000160053E14144C +:101AFB0078FB7CB342954296BE34003078157CB5AA +:101B0B00540F7E14000160053E141478FB7CB34225 +:101B1B00B142B2BE34004078157CB5540F7E140030 +:101B2B000160053E141478FB7CB342B342B4BE345F +:101B3B00005078157CB5540F7E14000160053E14DF +:101B4B001478FB7CB342C942CABE34006078157C62 +:101B5B00B5540F7E14000160053E141478FB7CB362 +:101B6B0042CB42CCBE34007078197CB5540F7E3416 +:101B7B00000160053E341478FB7CA77CBA42E17C03 +:101B8B00BA42E222CA3B7AB302857F307A270283BC +:101B9B007D236D337A3702867A3702887A37028A49 +:101BAB00E47AB3028E7D125E1400077A17028C78EA +:101BBB000F7D121E141E141E147A17028A021EB6F3 +:101BCB001E241E241E240B247A27028A021EB6E42E +:101BDB007E3702861260D46D33021E9FE47AB30205 +:101BEB008E7E37028A1B34BE370286380E7E270262 +:101BFB008C4D226806BE240001402F7E0702863ED4 +:101C0B00043E043E047E170283AD107D212E270275 +:101C1B00887F032D127E0B50BE53028528067E242F +:101C2B00000180026D227A53028EBE370286380E77 +:101C3B007E27028C4D226806BE24000240397E07A7 +:101C4B0002863E043E043E047E170283AD107E27BF +:101C5B0002882E2702832D217F032D127E0B50BE6F +:101C6B0053028528067E24000180026D223E244EFD +:101C7B0053028E7A53028EBE370286380E7E2702AF +:101C8B008C4D226806BE240003403B7E0702863E35 +:101C9B00043E043E047E2702837D10AD123E242DAC +:101CAB00212E2702887F032D127E0B50BE530285F7 +:101CBB0028067E24000180026D223E243E244E53D2 +:101CCB00028E7A53028EBE370286380E7E27028C26 +:101CDB004D226806BE24000440437E4702863E44E4 +:101CEB003E443E447E0702837D54AD507E14000378 +:101CFB00AD107D212D252E2702887F032D127E0B03 +:101D0B0050BE53028528067E24000180026D223EC0 +:101D1B00243E243E244E53028E7A53028EBE37024B +:101D2B0086380E7E27028C4D226806BE24000540A5 +:101D3B00417E0702863E043E043E047E2702837DDD +:101D4B0010AD123E243E242D212E2702887F032D19 +:101D5B00127E0B50BE53028528067E2400018002A2 +:101D6B006D223E243E243E243E244E53028E7A5353 +:101D7B00028EBE370286380E7E27028C4D226806F5 +:101D8B00BE24000640477E4702863E443E443E4406 +:101D9B007E0702837D54AD507E140005AD107D216E +:101DAB002D252E2702887F032D127E0B50BE53024A +:101DBB008528067E24000180026D223E243E243EAF +:101DCB00243E243E244E53028E7A53028EBE37029B +:101DDB0086380E7E27028C4D226806BE24000740F3 +:101DEB00497E4702863E443E443E447E0702837D45 +:101DFB0054AD507E140006AD107D212D252E2702EB +:101E0B00887F032D127E0B50BE53028528067E243D +:101E1B00000180026D223E243E243E243E243E24BB +:101E2B003E244E53028E7A53028EBE370286380EF4 +:101E3B007E37028C4D336806BE34000840497E075E +:101E4B0002863E043E043E047E2702837D10AD12C3 +:101E5B007E340007AD322D312E3702882D377D268B +:101E6B007E1B70BE73028528067E34000180026DD6 +:101E7B00333E343E343E343E343E343E343E344EB8 +:101E8B0073028E7A73028E7EB3028E12665E7E377B +:101E9B0002880B347A3702887E370283BE3702887A +:101EAB002803021BE77E3702860B347A3702867EC5 +:101EBB0037028ABE3702862803021BDADA3B22CAB4 +:101ECB00797A0F00297D7343BA8012248A7E1F0012 +:101EDB001C7E0F00291209F97D126D007DD20B14A7 +:101EEB001209F77F711B7C7E1F002DBE182710680F +:101EFB001FE41203537E1440007E04461C12028C16 +:101F0B007F017F17E41203531201EC12039080043C +:101F1B007F170B1C7A1F0031BE7400405803021F41 +:101F2B00F07D570E540E540E540E541B563E547CDB +:101F3B00AB7E14000160053E141478FB7E34FEB5B5 +:101F4B007E24007E7E1BB04CB37A1BB07D375E3493 +:101F5B0000037CBA60053E341478FB7C677E14FE6C +:101F6B00B67E04007E7E0B704C767A0B707D570E1E +:101F7B00540E540E540E545E5400013E543E547E87 +:101F8B0034000160053E341478FB7C677D170E141A +:101F9B000E140E140E140E141A021A007F202F208A +:101FAB002F222E4400FF2E286757691200020B2A9E +:101FBB00007E0B704C767A0B707D1D0A127E34FE00 +:101FCB00F07E24007E7A1B307D3D7C377E34FEF123 +:101FDB007A1B3074807E34FEFD7A1BB074017E3424 +:101FEB00FEE00220C67D570E540E540E540E543E86 +:101FFB00547CAB7CBF54017E3400017D2360053ED5 +:10200B00241478FB7CBA60053E241478FB7E14FE06 +:10201B00B17E04007E7E0BB04CB57A0BB07D275E93 +:10202B002400070E247CBA60053E241478FB7C4503 +:10203B007E14FEB27E04007E7E0B504C547A0B5005 +:10204B007D270E240E240E240E245E2400013E2434 +:10205B003E247D575E5400013E542D5260053E34A4 +:10206B001478FB7C677D170E140E140E140E140ED1 +:10207B00141A021A007F202F202F222E4400FF2E2D +:10208B00286757691200020B2A007E0B704C767A78 +:10209B000B707D1D0A127E34FED07E24007E7A1BCF +:1020AB00307D3D7C377E34FED17A1B3074807E349C +:1020BB00FEDD7A1BB074017E34FEC07E24007E7A76 +:1020CB001BB07D1F7D370E340E340E340E340E34A0 +:1020DB000E341A261A247F212F212F222E4400FF83 +:1020EB002E28674F693200020B2A207A1B207D3F76 +:1020FB007D370E340E340E340E340E340E341A2655 +:10210B001A247F212F212F222E4400FF2E28674FC8 +:10211B00693200020B2A200B1C7A1B307E1F003108 +:10212B007C367D370E340E340E340E341A261A24B8 +:10213B007F212F212F222E4400FF2E28672F69325B +:10214B0000020B2A207A1B307E2F00317D370E3494 +:10215B000E340E340E341A261A247F012F012F0051 +:10216B007F702EE400FF2E78672F693700020B7A01 +:10217B00200B1C7A1BB02E0400FF2E0867676930FA +:10218B0000020B0A207E1BB044607A1BB07D370E19 +:10219B00340E340E340E341A261A247F012F012FDD +:1021AB00002E0400FF2E086767693000020B0A201F +:1021BB007E1BB044087A1BB0DA7922CA3B7A1F0225 +:1021CB00287F306D337A3702329F007A0F02347AD0 +:1021DB000F02387E1F02284D23780B7E3400037AC2 +:1021EB003702320224667E3B700A375E3400076882 +:1021FB00127E1F022C791100021B1A007E3400067E +:10220B000224787F031265707F217A1F02387E0FBC +:10221B00022C693000020B0A20BF1228267E1F02F7 +:10222B0038793000021B0A207E3400077A370232DD +:10223B007E1F02384D23780B7E3BB054F77A3BB0B0 +:10224B000224837E3BB044087A3BB06913000D69CE +:10225B0003000B6933000969230007BF1038127E96 +:10226B002F022C691200020B2A00BF10500302220E +:10227B00F9691300011B1468201B14683D0B1568CA +:10228B000302245E7E2F022C691200020B2A007DB2 +:10229B0051CA599F107D1380447E1F022C69110077 +:1022AB00020B1A007F102F10CA39693300096923FA +:1022BB0000079F107D133E1480237E1F022C691193 +:1022CB0000020B1A007F102F102F11CA396933002F +:1022DB0009692300079F107D133E143E14693300D8 +:1022EB0005692300032D317E0F022802245969133F +:1022FB000009690300077E2F022C693200020B2AAA +:10230B00209F107A1F0234693300011B34686B1B4A +:10231B003478030223EB0B35680302245E7E0F0235 +:10232B00347D31CA3969330015692300139F107D41 +:10233B001369330005692300032D317E0F02281228 +:10234B0000A61BFD7E1F022C695100020B1A407E5A +:10235B000F02347F129F10CA3969330009692300B9 +:10236B00079F127D5369330005692300032D357DCB +:10237B00517E0F02282D150224597E0F02347D3118 +:10238B003E34CA3969330015692300139F107D133E +:10239B003E1469330005692300032D317E0F02289B +:1023AB001200A61BFD7E1F022C695100020B1A4066 +:1023BB007E0F02347F129F102F11CA396933000927 +:1023CB00692300079F127D533E546933000569232F +:1023DB0000032D357D513E547E0F02282D15806E46 +:1023EB007E0F02347D313E343E34CA3969330015D9 +:1023FB00692300139F107D133E143E1469330005AF +:10240B00692300032D317E0F02281200A61BFD7ECF +:10241B001F022C695100020B1A407E0F02347F12EF +:10242B009F102F112F11CA39693300096923000737 +:10243B009F127D533E543E546933000569230003BC +:10244B002D357D513E543E547E0F02282D15120022 +:10245B00A61BFD7E3BB054F77A3BB07E3702304D66 +:10246B003378157E3BB0B40B0A7E3400027A370208 +:10247B003280057F03124E477E370232DA3B227DD4 +:10248B0053BE540074400302272A7E340003AD531D +:10249B002E5424A189540225FD02260402260B0288 +:1024AB00261202261902262002272A02272A022791 +:1024BB002A02272A02272A02272A02272A02272A48 +:1024CB0002272A02272A02262702262E0226350257 +:1024DB00263C02264302264A02272A02272A0227E3 +:1024EB002A02272A02272A02272A02272A02272A18 +:1024FB0002272A02272A02265102265702265D02AC +:10250B00266302266902266F02272A02272A022740 +:10251B002A02272A02272A02272A02272A02272AE7 +:10252B0002272A02272A02267502267B022681020F +:10253B00268702268D02269302269902269F0227C2 +:10254B002A02272A02272A02272A02272A02272AB7 +:10255B0002272A02272A0226A50226AB0226B1024F +:10256B0026B502272A02272A02272A02272A022710 +:10257B002A02272A02272A02272A02272A02272A87 +:10258B0002272A02272A0226BB0226C10226C702DD +:10259B0026CF02272A02272A02272A02272A0227C6 +:1025AB002A02272A02272A02272A02272A02272A57 +:1025BB0002272A02272A0226D90226E30226ED0247 +:1025CB0026F702272A02272A02272A02272A02276E +:1025DB002A02272A02272A02272A02272A02272A27 +:1025EB0002272A02272A02270102270B022715029C +:1025FB00271F7E3400100226D37E3400110226D30F +:10260B007E3400200226D37E3400210226D37E3472 +:10261B0000600226D37E3400610226D37E34001282 +:10262B000226D37E3400130226D37E3400220226E8 +:10263B00D37E3400230226D37E3400620226D37E5F +:10264B003400630226D37E340014807C7E34001564 +:10265B0080767E34002480707E340025806A7E3440 +:10266B00006480647E340065805E7E340016805882 +:10267B007E34001780527E340026804C7E34002737 +:10268B0080467E34006680407E340067803A7E341C +:10269B00003480347E340033802E7E34002080283A +:1026AB007E34001780226D33801E7E3400748018B8 +:1026BB007E34002180127E340054800C7E24000175 +:1026CB007D3280587E3400757E240001804E7E342E +:1026DB0000227E24000180447E3400337E240001DE +:1026EB00803A7E3400027E24000180307E340076F6 +:1026FB007E24000180267E3400237E240001801C72 +:10270B007E3400347E24000180127E3400037E244C +:10271B00000180087E3400777E2400010217982286 +:10272B00CA3B7F307EB300B470030229AA7E3BB054 +:10273B007E70027F032E1400337E60021240DE7E19 +:10274B003BB07E70047F032E1400377E6002124074 +:10275B00DE7E3BB07E70037F032E1400357E60025D +:10276B001240DE7E3BB07E70017F032E1400317E63 +:10277B0060021240DE29630033295300347C467C0F +:10278B00B61203587E14D70A7E043AA31201EC79D1 +:10279B0033001B7923001929630037295300387C38 +:1027AB00467CB61203586913001569030013120116 +:1027BB00EC7E14126F7E043A831201EC7933001F06 +:1027CB007923001D29630035295300367C467CB6DE +:1027DB0012035869130015690300131201EC7E14E0 +:1027EB00CCCD7E043CCC1201EC7933002379230051 +:1027FB002129630031295300327C467CB6120358E1 +:10280B007E14D70A7E043B231201EC79330027791F +:10281B002300259F006933001B6923001912030D48 +:10282B00280A6933001B6923001980029F11793331 +:10283B00001B792300199F006933001F6923001DBA +:10284B0012030D280A6933001F6923001D80029FA4 +:10285B00117933001F7923001D693300236923008D +:10286B00217E14126F7E043C8312030D282A9F775E +:10287B006933001F6923001D9F0012030D2819697E +:10288B0033001B692300197F0712030D280A6933D4 +:10289B0000236923002180029F11793300237923C0 +:1028AB0000219F00693300276923002512030D289F +:1028BB000A693300276923002580029F11793300B1 +:1028CB0027792300256C777404ACB72D577D4669A7 +:1028DB0012003F6902003D7912003B790200397406 +:1028EB0004ACB72D576912006769020065791200B5 +:1028FB0063790200610B70A5BF09CC6933001B69BA +:10290B002300197933005F7923005D6933001F6958 +:10291B0023001D79330087792300856913008369B0 +:10292B000300816933005B692300591201EC7F714D +:10293B0069130087690300856933005F6923005DB4 +:10294B001201EC7F071201347E14126F7E043A03DE +:10295B001201EC7F732EF40029691700020B7A0029 +:10296B00120134793700021B7A2069130083690343 +:10297B00008169330087692300851201347E1412AC +:10298B006F7E043A031201EC7F732EF4002D69174E +:10299B0000020B7A00120134793700021B7A20DA1D +:1029AB003B22CA3B7A1F00087F306D337A37001207 +:1029BB009F007A0F00147A0F00187E1F00084D231A +:1029CB00780B7E3400037A370012022BBF7E3B70EC +:1029DB000A375E34000368127E1F000C7911000267 +:1029EB001B1A007E340006022BD17F031265707F09 +:1029FB00217A1F00187E0F000C693000020B0A2091 +:102A0B00BF1228237E1F0018793000021B0A207E7C +:102A1B003400077A3700127E1F00184D2378087E8A +:102A2B003BB054F7022C127E3BB044087A3BB069A2 +:102A3B0033000D6923000B69530015694300139F85 +:102A4B00217A2F00147E7F000C691700020B7A008D +:102A5B00BF023858695300011B5468111B5468237B +:102A6B000B556803022BB7CA197D13802E7E0F00FE +:102A7B000C693000023E34CA396933000D7D133EB8 +:102A8B001480187E0F000C693000023E343E34CAAD +:102A9B00396933000D7D133E143E1469330005690B +:102AAB002300032D317E0F0008022BB26933000186 +:102ABB001B3468511B347803022B5E0B3568030201 +:102ACB002BB77E1F0014CA396933000D7D13693390 +:102ADB000005692300032D317E0F00081200A61B91 +:102AEB00FD7E1F000C691100020B1A007E1F0014E3 +:102AFB009F01CA197E0F00082D1369330005692346 +:102B0B000003022BB27E1F00142F11CA3969330048 +:102B1B000D6923000B7D133E1469330005692300F7 +:102B2B00032D317E0F00081200A61BFD7E1F000C2B +:102B3B00691100020B1A007E1F00149F012F00CA9F +:102B4B00193E347E0F00082D1369330005692300ED +:102B5B000380547E1F00142F112F11CA39693300C3 +:102B6B000D6923000B7D133E143E14693300056978 +:102B7B002300032D317E0F00081200A61BFD7E1FC4 +:102B8B00000C691100020B1A007E1F00149F012F0D +:102B9B00002F00CA193E343E347E0F00082D1369F6 +:102BAB00330005692300031200A61BFD7E3BB054C6 +:102BBB00F77A3BB07E3700104D33784E7E3BB0B486 +:102BCB000B0A7E3400027A370012803E44027A3BB5 +:102BDB00B07F037E2F000C693200020B2A201257A4 +:102BEB00FC7E1F000C695100020B1A407F032E1450 +:102BFB00000F693000020B0A202F12793000021BE4 +:102C0B000A207E3BB054FD7A3BB07E370012DA3B94 +:102C1B0022CA3B7A1F02507F306D337A3702589F9E +:102C2B00117A1F025A7E1F02504D2378067E340004 +:102C3B0003800F7E3BB00A3B5E340005680B7E348D +:102C4B0000047A370258022E6844047A3BB0693389 +:102C5B0000116923000F7E2F0254BF212803022E7F +:102C6B0058693300096923000769130015690300CC +:102C7B00139F017A0F025ABF203803022DB069133C +:102C8B0000011B1468551B147803022D3A0B1568B1 +:102C9B0003022E3C7E0F025ACA1969130005690301 +:102CAB0000032D137E1F02501200A61BFD7F037E17 +:102CBB001F025A1257B67E1F025A7E0F02549F01F3 +:102CCB00CA1969130009690300077D5169130005CF +:102CDB00690300032D157D53022D967E1F025A3E6C +:102CEB0034CA39693300093E34691300056903009E +:102CFB00032D137E1F02501200A61BFD7F037E1FA8 +:102D0B00025A1257B67E1F025A7E0F02549F013E83 +:102D1B0014CA1969130009690300077D513E5469F0 +:102D2B00130005690300032D157D533E54805C7E13 +:102D3B001F025A3E343E34CA39693300093E343ED1 +:102D4B003469130005690300032D137E1F02501213 +:102D5B0000A61BFD7F037E1F025A1257B67E1F0271 +:102D6B005A7E0F02549F013E143E14CA1969130078 +:102D7B0009690300077D513E543E546913000569F0 +:102D8B000300032D157D533E543E547E1F02502DE0 +:102D9B00351200A61BFD7F037E2F025A7E1F0254A5 +:102DAB009F12022E39693300011B34682D1B3468C6 +:102DBB00520B35787C7E1F0254CA3969330009697E +:102DCB00130005690300032D137E1F02501200A68A +:102DDB001BFD7F037E1F025480547E1F02543E3422 +:102DEB00CA39693300093E346913000569030003CE +:102DFB002D137E1F02501200A61BFD7F037E1F02A8 +:102E0B0054802B7E1F02543E343E34CA3969330042 +:102E1B00093E343E3469130005690300032D137E0C +:102E2B001F02501200A61BFD7F037E1F0254125778 +:102E3B00B67E2F02547F032E14000F693000020B55 +:102E4B000A209F12793000021B0A2080087E340072 +:102E5B00057A3702587E3BB054FB7A3BB07E370283 +:102E6B0058DA3B227DD07DF17DE27DC37E1F001CB5 +:102E7B007E0F02D41209F974027F011E141E045036 +:102E8B00034E20801478F46D337E2400019F101BB9 +:102E9B00C47803022F391BC47803022F7A1BC47822 +:102EAB0003022FD12EC40003680302302DBED400C1 +:102EBB0001781B439850E589F5897CB7F58B0A5649 +:102ECB00F58D438E40D28EE47AB302ED8014BED4DE +:102EDB000002780E4398507CB7F5D70A56F5D643C7 +:102EEB008E1553A23F4DEE780CBEF400017806E52B +:102EFB00A2F5A28031BEE40002780BBEF400037889 +:102F0B000543A2408020BEE40004780BBEF400050C +:102F1B00780543A280800FBEE400067809BEF4005A +:102F2B0007780343A2C0E47AB302EDD2AC22BED43D +:102F3B000002780E439A507CB7F5D70A56F5D64364 +:102F4B008E1453BAFEBEE40008780CBEF400097868 +:102F5B0006E5BAF5BA800FBEE4000A7809BEF400A4 +:102F6B000B780343BA0143AF01E47AB302EE22BEFE +:102F7B00D40002781043AC107CB7F5D70A56F5D6BF +:102F8B00438E148014BED40003780E43AC507CB730 +:102F9B00F5D50A56F5D443DD0A53BAFDBEE4000C51 +:102FAB00780CBEF4000D7806E5BAF5BA800FBEE4D6 +:102FBB00000E7809BEF4000F780343BA0243AF0842 +:102FCB00E47AB302EF22BED40002781043FD107CEA +:102FDB00B7F5D70A56F5D6438E148014BED4000429 +:102FEB00780E43FD507CB7F5D30A56F5D243DDA0DE +:102FFB0053BAFBBEE40010780CBEF400117806E562 +:10300B00BAF5BA8015BEE40012780FBEF40013783F +:10301B000975CA0075C90443BA0443AF10E47AB307 +:10302B0002F0227C3B7D235E3400F0782E4C33681B +:10303B00147CB5540F7E24000160053E241478FBEC +:10304B007CB54280227CB5540F7E24000160053E86 +:10305B00241478FB7CB564FF528022BE34001078B8 +:10306B002E4C3368147CB5540F7E24000160053E52 +:10307B00241478FB7CB54290227CB5540F7E24003F +:10308B000160053E241478FB7CB564FF529022BE90 +:10309B00340020782E4C3368147CB5540F7E2400FA +:1030AB000160053E241478FB7CB542A0227CB5540C +:1030BB000F7E24000160053E241478FB7CB564FF71 +:1030CB0052A022BE340030782E4C3368147CB55499 +:1030DB000F7E24000160053E241478FB7CB542B0C2 +:1030EB00227CB5540F7E24000160053E241478FB2E +:1030FB007CB564FF52B022BE340040782E4C33684E +:10310B00147CB5540F7E24000160053E241478FB1B +:10311B007CB542C0227CB5540F7E24000160053E75 +:10312B00241478FB7CB564FF52C022BE3400507867 +:10313B002E4C3368147CB5540F7E24000160053E81 +:10314B00241478FB7CB542C8227CB5540F7E240036 +:10315B000160053E241478FB7CB564FF52C822BE87 +:10316B00340060782E4C3368147CB5540F7E2400E9 +:10317B000160053E241478FB7CB542E8227CB554F3 +:10318B000F7E24000160053E241478FB7CB564FFA0 +:10319B0052E822BE340070782D4C3368147CB55441 +:1031AB000F7E34000160053E341478FB7CB742F887 +:1031BB00227CB5540F7E34000160053E341478FB3D +:1031CB007CB764FF52F822123ED3C285123C7A6D53 +:1031DB00337E2441A07A1F002E7E2440A07A1F004C +:1031EB00327E34BE0E7E243F887A1F00367E344EEC +:1031FB006A7E243F807A1F003A7E0800B574407EB9 +:10320B0018031B1239CF7E3400017E2400011245B6 +:10321B00C97E1813887A1F002D7E3400047E148615 +:10322B00A07E040001121ECAC28674047AB3002E5B +:10323B006D226D337E0F00CE74021238D774376C4B +:10324B00777E1467E97E0400FF12403574047AB36D +:10325B00002E6D337E2400017E0F00D274021238D3 +:10326B00D774377E70017E1467E77E0400FF12402F +:10327B003574047AB3002E6D337E2400027E0F006A +:10328B00D674021238D774377E70027E1467E57ECF +:10329B000400FF12403574027AB3002E6D337E2486 +:1032AB0000037E0F00DE74051238D774377E70036F +:1032BB007E1467E37E0400FF12403574037AB3007B +:1032CB002E6D33CA397E240004CA296D117E044544 +:1032DB00617E1F00DE12028C7F017405DA29DA3958 +:1032EB001238D774377E70047E1467E07E0400FFBB +:1032FB0012403574027AB3002E6D337E2400057EA6 +:10330B000F00E274051238D774377E70057E146790 +:10331B00DE7E0400FF124035A2CBB392CB023235D6 +:10332B007D235E3400F078237CB5540F7E4400017E +:10333B0060053E441478FBE5800A2B5D2468077416 +:10334B00017CAB02346B6CAA02346BBE3400107878 +:10335B00237CB5540F7E44000160053E441478FB7A +:10336B00E5900A2B5D24680774017CAB02346B6C0F +:10337B00AA02346BBE34002078237CB5540F7E44F4 +:10338B00000160053E441478FBE5A00A2B5D246820 +:10339B000774017CAB02346B6CAA02346BBE340035 +:1033AB003078237CB5540F7E44000160053E4414F5 +:1033BB0078FBE5B00A2B5D24680774017CAB023403 +:1033CB006B6CAA02346BBE34004078217CB5540F71 +:1033DB007E44000160053E441478FBE5C00A2B5D7A +:1033EB0024680674017CAB80776CAA8073BE3400B2 +:1033FB005078217CB5540F7E44000160053E441487 +:10340B0078FBE5C80A2B5D24680674017CAB805001 +:10341B006CAA804CBE34006078217CB5540F7E447E +:10342B00000160053E441478FBE5E80A2B5D246837 +:10343B000674017CAB80296CAA8025BE34007078A1 +:10344B001F7CB5540F7E24000160053E241478FBCD +:10345B00E5F80A3B5D32680674017CAB80026CAA0E +:10346B007CBA227DF37E1F001C1209F97D126D00C0 +:10347B007DE20B141209F77F611B6C7E1F02FFBEEE +:10348B001827106821E41203537E1440007E044673 +:10349B001C12028C7F017F16E41203531201EC12F3 +:1034AB0003907F5180047F560B5CBEF4004048199B +:1034BB007D1E0A127E34FEF07E24007E7A1B307D48 +:1034CB003E7C377E34FEF180177D1E0A127E34FE61 +:1034DB00D07E24007E7A1B307D3E7C377E34FED13D +:1034EB007E24007E7A1B307D1D7D3F0E340E340E04 +:1034FB00340E340E340E341A261A247F212F212F2A +:10350B00222E4400FF2E28674F693200020B2A201F +:10351B007A1B207D3D7D3F0E340E340E340E340E5F +:10352B00340E341A261A247F212F212F222E4400E9 +:10353B00FF2E28674F693200020B2A200B1C7A1BC7 +:10354B00307D1B7D3F0E340E340E340E341A261A8A +:10355B00247F212F212F222E4400FF2E28672F6935 +:10356B003200020B2A207A1B207D3B7D3F0E340E4E +:10357B00340E340E341A261A247F212F212F222E9B +:10358B004400FF2E28672F693200020B2A200B1CE8 +:10359B007A1B302243BA807E3480007E2401517E18 +:1035AB007F001CBF71781474047E34FE017E2400EE +:1035BB007E7A1BB07E14FDEB0236A67E3436007E7F +:1035CB0024016EBF71781474047E34FE017E2400D6 +:1035DB007E7A1BB07E14FDEC0236A67E34FCC07ED8 +:1035EB0024019BBF71781474047E34FE017E240089 +:1035FB007E7A1BB07E14FDED0236A67E34C3807E30 +:10360B002401C9BF71781374047E14FE017E04007B +:10361B007E7A0BB07E54FDEE801D7E1440007E043E +:10362B0001FABF70782874047E14FE017E04007EBC +:10363B007A0BB07E54FDEF7E44007E7E2BB0F59F5F +:10364B007E54FDF77E2BB0F5A6759D0280327E145D +:10365B000EC07E040216BF70782C74047E14FE011B +:10366B007E04007E7A0BB07E54FDF07E44007E7E9D +:10367B002BB0F59F7E54FDF87E2BB0F5A6759D0300 +:10368B00E47A0BB0802E7A1F001C74047E34FE018A +:10369B007E24007E7A1BB07E14FDEE7E04007E7EBF +:1036AB000BB0F59F7E14FDF77E0BB0F5A6759D0252 +:1036BB00E47A1BB07E1F001C22CA3B7A1F02997F43 +:1036CB00306D337A37029F7E1F02994D23780B7E24 +:1036DB003400037A37029F0237897E3B700A375ECC +:1036EB0034000368077E34000602379B7F031265A4 +:1036FB0070BE18000150077E34000702379B7E3BDB +:10370B00B044087A3BB0693300011B3468241B3486 +:10371B00683E0B3578606933000D7D136933000506 +:10372B00692300032D317E1B307E1F02997A1B30DB +:10373B0080446933000D7D133E1469330005692302 +:10374B0000032D310B1A107E1F02991B1A108026B5 +:10375B006933000D7D133E143E1469330005692354 +:10376B0000032D31691100020B1A007E1F0299799B +:10377B001100021B1A007E3BB054F77A3BB07E3728 +:10378B00029D4D33783C7E3BB0B40B0A7E34000275 +:10379B007A37029F802C44027A3BB07F037E18005D +:1037AB00011257FC7F032E14000F693000020B0A25 +:1037BB00200B1C793000021B0A207E3BB054FD7A93 +:1037CB003BB07E37029FDA3B22CAF87EF3023C7C89 +:1037DB00BF5480B480167EB3023F70307EB3023E7E +:1037EB00702A7E370242BE34000268030238CC7C5A +:1037FB00BF540F14681B14683B0BB168030238CC21 +:10380B007EB3024170067EB30240601E0238CC804C +:10381B00197EB30246B4040F7EB302416003023833 +:10382B00CC7EB3024060030238CC7E3449A47E24A4 +:10383B0000FF807D7EB30246B404067EB302416076 +:10384B0002807E7E7302407CA75EA00F1B706836E1 +:10385B002E707F68040B7078687E2400017CBA6040 +:10386B00053E241478FB7E73024E6C665C754D33FB +:10387B00680A7E3449A67E2400FF80357E3449A435 +:10388B007E2400FF802B7E2400017CBA60053E2441 +:10389B001478FB7E73024F6C665C754D33680A7E41 +:1038AB003449A67E2400FF80087E3449A47E240080 +:1038BB00FF7A1F024A7E3400027A37024880078063 +:1038CB000012667A800312660FDAF822CA3B7AB3CB +:1038DB00002D7F307A27002B7A3700297E73002E3C +:1038EB00BE7006280674067AB3002E7E73002DBEBA +:1038FB00700A2806740A7AB3002D9F117F031203F6 +:10390B000D28197A3F00787E0800307E3467EB7EF5 +:10391B002400FF1212967A73002F801E7A3F0078D4 +:10392B007E0800317E3467EB7E2400FF1212967CFA +:10393B00B77A73002F047AB3002F7E73002F0A37E8 +:10394B009E3400077E63002D0A161A279D211B2427 +:10395B007A5300527E63002E0A261A372D320B340F +:10396B007A7300537EA020801C7EB300531A3B1940 +:10397B00A300307EB30053047AB300537EB30052DE +:10398B00047AB300527EB30052BEB00048DB9F11E5 +:10399B007F0312030D2804742D800274207EA30074 +:1039AB00521A3A19B30030E47EA300531A3A19B3F2 +:1039BB0000307E5700297E37002B7E0800301240E6 +:1039CB0035DA3B22CA3B7A1F002A7AB300297F30B3 +:1039DB007EB300B4700D6D33740A1251C974017A41 +:1039EB00B300B47E7300297A3B707E1F002A7E1BC6 +:1039FB0070397300117E1F002A2971000139730081 +:103A0B00127E1F002E79330003792300017E1F00E5 +:103A1B003279330007792300057E1F003A79330092 +:103A2B000B792300097E1F00367933000F792300B1 +:103A3B000D7E1411EC7E0442837E1F002E12028C2D +:103A4B007933001579230013691300076903000507 +:103A5B0069330015692300131201EC7F016D337E6E +:103A6B002445A012028C6913000F6903000D12018B +:103A7B00EC7F711203900A36397300177F1712030C +:103A8B0090397300187F032E1400197E340070E4F4 +:103A9B0012633E7E3BB06C777F032E1400117E6069 +:103AAB0002124B307E3BB07E70057F032E14001745 +:103ABB007E6002124B30DA3B22CA3B7CDB7D739F6C +:103ACB00117A1F0307BED00A28037ED00A7E34006A +:103ADB0034E412302E7E340033740112302E7E34D7 +:103AEB00003312332BBEB00168F46CCC7E3400343F +:103AFB00740112302E7E1F03072F117A1F03077ECE +:103B0B0034003312332BB4010B7E1F03074E7001AD +:103B1B007A1F03077E340034E412302E0BC0BEC074 +:103B2B001878C96CCC80157E340034740112302E99 +:103B3B0000007E340034E412302E0BC00A3CBD373B +:103B4B0048E56CCC7404ACBC493501DE492501DC7D +:103B5B00593501DA592501D80BC0BEC00978E57E6D +:103B6B001F03077A1F01FC9F117A1F03076CCC8080 +:103B7B00217404ACBC493501DA492501D80A1D6D05 +:103B8B00001209F97F017E1F03072F107A1F03070D +:103B9B000BC0BCDC38DB7E1F0307DA3B22CA79740F +:103BAB000E7E70011265EA741412659A7CFB30E686 +:103BBB000874147E70801265EA7CBF20E003023C1F +:103BCB00777E1400407E0400017421125B407AB3AF +:103BDB0002447E1F026B4D237803023C676CFF800F +:103BEB00737EB302451A3B7E0F026B2D317D207E17 +:103BFB001BA00A4F2E4400407A91827A81837EEB80 +:103C0B00E0BCEA7839047AB302457E7302451A3771 +:103C1B002D317D207E1BB0703974146C771265EAE0 +:103C2B0075F40075DC00E47E34FE077E24007E7A9A +:103C3B001BB07E34000A1264FF75C76080FE7E1FC6 +:103C4B00026B7E1B70BCE7780474018001E47AB3CD +:103C5B0002450BF07E730244BC7F3885D20012659F +:103C6B00D7500974146C771265EAC200DA79227E98 +:103C7B003466C47A3702777E3466BE7A3702797E31 +:103C8B003466C17A37027B7E3466BB7A37027D7E1F +:103C9B0034000E7A37027F6D337A3702817E080249 +:103CAB00771265FD74AE120046E4120046741012D2 +:103CBB00004674401200467481120046747F120055 +:103CCB004674A112004674C812004674A612004630 +:103CDB0074A8120046743F12004674D3120046E4D7 +:103CEB0012004674D5120046748012004674D91225 +:103CFB00004674F112004674DA1200467412120078 +:103D0B004674DB12004674401200467420120046C3 +:103D1B007402120046748D1200467414120046741D +:103D2B00A412004674A612004674AF120046E412A9 +:103D3B005D69E46C770260D47F607DF30E340E34E2 +:103D4B000E340E340E340E341A261A247F012F0132 +:103D5B002F002E0400FF2E08674F693000020B0A5C +:103D6B00200B1C7E1B700AE7693000020B0A207EB9 +:103D7B001B700A977D397C676C777D934D9E6D88A0 +:103D8B00BE68271068237F16E41203537E1440008D +:103D9B007E04461C12028C7F017F14E41203531223 +:103DAB0001EC1203907F5180047F540B5C7D1B7DD3 +:103DBB003F0E340E340E340E341A261A247F212F64 +:103DCB00212F222E4400FF2E28672F693200020B71 +:103DDB002A207A1B207D3B7D3F0E340E340E340E91 +:103DEB00341A261A247F212F212F222E4400FF2E36 +:103DFB0028672F693200020B2A200B1C7A1B3022FA +:103E0B00CA3B7F617F306D337A3703237E3BB00A29 +:103E1B003B5E340005680B7E3400047A37032302C3 +:103E2B003ECC44047A3BB0693300116923000FBECA +:103E3B00180001407C693300011B3468211B346876 +:103E4B00340B35784B7D3D7C37693300097D036935 +:103E5B00330005692300032D307A1B308032693320 +:103E6B0000097D033E0469330005692300032D30EF +:103E7B001B1AD0801B693300097D133E143E146955 +:103E8B00330005692300032D3179D100021B1AC0C1 +:103E9B007F037E1800011257B67F032E14000F69A3 +:103EAB003000020B0A201B1C793000021B0A2080F9 +:103EBB00087E3400057A3703237E3BB054FB7A3BF4 +:103ECB00B07E370323DA3B22A9D7BA75EA0075E92E +:103EDB000043FF1075BA807E3440007E2401FA7ACD +:103EEB001F001C125BEE75E90043BA80E47E34FEC2 +:103EFB00017E24007E7A1BB0759400759300759239 +:103F0B000075910075960075950075B20075B1003E +:103F1B0075B40075B30075CA0075C90075CC007512 +:103F2B00CB0075E20075E10075DE00758E007598AB +:103F3B0000759A0075AC0075FD0075A20075AF0099 +:103F4B0075890043BA8053B2FC43B10374807E344D +:103F5B00FE077A1BB07E34FE077E24007E7E1BB0EC +:103F6B0030E0F275DC0075F49012522743AF80D22B +:103F7B00AF7EB30246B404F9020096CAD8CA797D63 +:103F8B00739F117A1F030B7E340034E412302E7EA4 +:103F9B00340033740112302E7E34003312332BB4C1 +:103FAB000104E40240306CDD7E34003474011230C5 +:103FBB002E7E1F030B2F117A1F030B7E340033123F +:103FCB00332BB4010B7E1F030B4E70017A1F030BB7 +:103FDB007E340034E412302E0BD0BED01878C96C6E +:103FEB00DD80157E340034740112302E00007E34D7 +:103FFB000034E412302E0BD00A3DBD3748E56CDDA2 +:10400B007404ACBD493501DE492501DC593501DAB3 +:10401B00592501D80BD0BED00978E57E1F030B7A4A +:10402B001F01FC7401DA79DAD822CA3B7F307A732C +:10403B0000557AB30054E47AB300567AB300578034 +:10404B00797E7300580A372D377D267E1B701A3701 +:10405B009E3400207A7300567E730054BE707E2807 +:10406B000EE47AB300547EB30055047AB300557E48 +:10407B00B300547E7300551260D4E47AB300577EBC +:10408B006300567E7006AC677E5300570A252D32AF +:10409B002E34106E7A71827A6183E49312665E7E9F +:1040AB00B30057047AB30057B406D47EB30054243C +:1040BB00067AB300547EB30058047AB300587E736B +:1040CB0000580A372D377D267E1BB0600302404C0B +:1040DB00DA3B22CA3B7A6300237F307A7300227A61 +:1040EB00B30021126620600574010241807EB3008B +:1040FB00213EB012652E6004740180791266306027 +:10410B0004740180707EB3002212652E600474016A +:10411B00806312663060047401805A12662060045A +:10412B00740180517EB300213EB0440112652E60B4 +:10413B000474018040126630602274018037801C49 +:10414B001261997A3BB07EB30023700512637180C4 +:10415B000B1264CF60047401801B0B747EA30023CD +:10416B007CBA147AB300234CAA78D512664060044B +:10417B0074018001E4DA3B227EB30246BEB00268D2 +:10418B00207EB3023C701A7EB3023F70147EB302E2 +:10419B0041700E7EB3024070087E3702424D336889 +:1041AB000302667A7EB3023EB4015F74047AB302F3 +:1041BB0046E47AB3024E7AB3024F740E7E7001124C +:1041CB0065EA74127E70201265EA74107E70081214 +:1041DB0065EA740E7E70021265EA74127E7020120C +:1041EB0065EA74107E70081265EA740E7E70011217 +:1041FB0065EA74126C771265EA74137E70081265A7 +:10420B00EA740E6C771265EA801074037AB3024677 +:10421B0074FF7AB3024E7AB3024F0266967EB302F4 +:10422B0046B404247EB3023CB4021D7EB30241604B +:10423B00030242C17EB3023F707C7EB3023E7076B6 +:10424B007E3702424D336802806C7E6302407C767F +:10425B005E700F1B60682F2E607F68040B607856B2 +:10426B007E2400017CB760053E241478FB7C656ED0 +:10427B0060FF5E63024E7A63024E740E1265EA743F +:10428B00117E704080247E2400017CB760053E24A3 +:10429B001478FB7C656E60FF5E63024F7A63024F9E +:1042AB00740E1265EA74147E70801265EA740E6CDB +:1042BB00771265EA800302667A0266967EB3023C49 +:1042CB005480BEB08068030243527EB3023F1BB1E1 +:1042DB0068191468280BB1786E7E34494F7E240020 +:1042EB00FF7A1F024A7E34001280547E3449617E6D +:1042FB002400FF7A1F024A7E34004380427EB302C1 +:10430B003E1468191468280BB1783C7E34494B7EF7 +:10431B002400FF7A1F024A7E34000480227E344937 +:10432B00A87E2400FF7A1F024A7E34000880107E8C +:10433B0034492D7E2400FF7A1F024A7E34001E7AF8 +:10434B003702488005800002667A7E370242BE370C +:10435B00024850047A37024802660F6D227EA00194 +:10436B00C2030243EC7EB3013E0A4B0974013FBE0C +:10437B0070206813BE703B680EBE700D6809BE706E +:10438B000A6804A5BF0005200366804CA5BF2D0558 +:10439B007EA0FF8043BE70304019BE70393814D2F6 +:1043AB00030AF77E14000AAD127D212D2F9E2400E7 +:1043BB00308025A5BF2E1D80007EB3013E047AB34D +:1043CB00013E0A3B09B3013FBEB030400BBEB039D2 +:1043DB0028E780046D2280187EB3013E047AB30176 +:1043EB003E7EB3013E0A3B09B3013F6003024370BB +:1043FB001A3AAD32227EB30246B404247EB3023C99 +:10440B00B4021D7EB3024160030244937EB3023FAC +:10441B0070767EB3023E70707E3702424D33680277 +:10442B0080667E6302407C765E700F1B60682C2E6C +:10443B00607F68040B6078507E2400017CB76005B8 +:10444B003E241478FB7C654E63024E7A63024E74F5 +:10445B000E1265EA74117E701080217E2400017C9F +:10446B00B760053E241478FB7C654E63024F7A637C +:10447B00024F740E1265EA74147E70201265EA7492 +:10448B000E6C771265EA800302667A026696CA3B67 +:10449B007A3702F67F306D337A3702F9807A7438C7 +:1044AB007AB302F87E3702F6BE34003850047A73C2 +:1044BB0002F81263BC7E7302F80A572E5400039065 +:1044CB000004F074CF900005F07E1702F97E3400E3 +:1044DB00067E2400011B1A107E7302F80A37CA39B4 +:1044EB007F137E1400087E0400011200A61BFD7EC4 +:1044FB00B302F82408125E307E7302F80A372D736C +:10450B007E7302F80A272E3702F97A3702F97E37C3 +:10451B0002F69D327A3702F67E3702F64D33680388 +:10452B000244A9DA3B22CA3B7A3702F17F306D3362 +:10453B007A3702F4807A74387AB302F37E3702F159 +:10454B00BE34003850047A7302F31264207E730277 +:10455B00F30A572E540003900004F074AF9000053B +:10456B00F07E1702F47E3400067E2400011B1A1025 +:10457B007E7302F30A37CA397F137E1400087E0458 +:10458B0000011200A61BFD7EB302F32408125E305D +:10459B007E7302F30A372D737E7302F30A272E37CD +:1045AB0002F47A3702F47E3702F19D327A3702F148 +:1045BB007E3702F14D336803024541DA3B227DF32E +:1045CB007E3403E88D327E14000CAD136D007E1F1C +:1045DB00001C120A4A7DE36EE4FFFF0BE44DFF78EB +:1045EB0013E589F5897D3E7CB7F58A0A56F58CD2A1 +:1045FB008CD2A922BEF400017813E589F5897D3EA2 +:10460B007CB7F58B0A56F58DD28ED2AB22BEF40059 +:10461B000278117D3E7CB7F5D70A56F5D6438E103E +:10462B0043AF0422BEF4000378117D3E7CB7F5D571 +:10463B000A56F5D443DD0843AF2022BEF4000478BC +:10464B00107D3E7CB7F5D30A56F5D243DD8043AFE0 +:10465B004022CAF87D23E41203587F017E34BC202C +:10466B007E2445BE12028C7F716D117E0440401278 +:10467B00030D50057EF00380336D117E04437F7F65 +:10468B001712030D28057EF0FF80217F1712039070 +:10469B007CF77C47E412035D7F017F171201316DBC +:1046AB00117E043F0012030D40020BF07E08025FE7 +:1046BB0074406C777E60101256E17E08025F744086 +:1046CB007E70FE7C6F1256E17E08025F74406C7741 +:1046DB006C661256E17E08025F74406C777E6080D8 +:1046EB001256E1DAF822CA797CAB7F707F616CFFDE +:1046FB004CAB68457F56BE580000580A6EB4FFFF9E +:10470B006EA4FFFF0B5C7E7300B30A176D007F1561 +:10471B00120A4A7F102E1800307A7B707E7300B31A +:10472B000A176D007F15120A4A7F510BF0BE580015 +:10473B000068400BF480CF803A7E7300B30A176D8C +:10474B00007F161209F97CE3BEE00A40052EE03724 +:10475B0080032EE0307A7BE07E7300B30A176D0086 +:10476B007F161209F97F610BF0BE68000068040B1D +:10477B00F480C67CBFDA7922CA3B7A6302BE7A73B5 +:10478B0002B97AB302B87F301260F77F037EB302AF +:10479B00B83EB0124BAC7F031253397F037EB3028A +:1047AB00B9124BAC7F031253397F031260F77F03AF +:1047BB007EB302B83EB04401124BAC7F03125339A7 +:1047CB0080287F03124D6F7E1F02BA7A1BB07EB317 +:1047DB0002BE70077F03125EB9800F7F03125EE685 +:1047EB007E1F02BA0B347A1F02BA7EA302BE7CBABA +:1047FB00147AB302BE4CAA78C97F03125E8C7E1F5B +:10480B0002BA7E1BB0DA3B22CA3B7A5302927F304C +:10481B007A6302917A7302907AB3028F6D3380655B +:10482B006D3380457E7302910A377E270293AD323A +:10483B007E53028F0A552D537EA302900A3A2E37D0 +:10484B0002951260D46D337A3702977E3BB01266B5 +:10485B005E0B747E3702970B347A370297BE3400A7 +:10486B001078E87E3702950B347A3702957E730207 +:10487B00910A371E341E341E34BE37029538A57E7E +:10488B003702930B347A3702937E7302920A37BE48 +:10489B00370293388BDA3B22CAF8740E6C771265A9 +:1048AB00EA741112659A7CFB30E20F74117C7F5E07 +:1048BB0070FB1265EAE47AB302477CBF30E40A74FA +:1048CB00117C7F4E70801265EA7EB3024724FD682F +:1048DB00461468480BB278477CBF30E0427E080232 +:1048EB003C7420125B407E370242125D017A370224 +:1048FB00427EB3023C546024E0680D24E0680E2431 +:10490B0040780F12528580171261D180121266CD3A +:10491B00800D12667A8008124EB08003125524DA8D +:10492B00F8221E035300540043002000550053008F +:10493B0042002000530065007200690061006C00AA +:10494B00040309041201000202000040BF3402FFFD +:10495B00000101020001090243000201008032093B +:10496B0004000001020201000524001001052401CE +:10497B0000010424020205240600010705820340FE +:10498B0000FF09040100020A000000070581024034 +:10499B00000007050102400000000001000803535E +:1049AB000054004300CA3B7CFB7A0F02027D627A03 +:1049BB00370200BEF00A28037EF00A0BF07E1F02BE +:1049CB0002BE18000058177A1F00787E0802067E78 +:1049DB003467EE7E2400FF1212967CE78021742050 +:1049EB007AB302067E1F02027A1F00787E08020746 +:1049FB007E3467EE7E2400FF1212967CE70BE07E7E +:104A0B00A02080080A3E19A302060BE0BCFE38F476 +:104A1B00E40A3F19B302067E5702007C7D7E080232 +:104A2B0006124035DA3B22CA7BCA6BCA5BCA4BCA39 +:104A3B003BCA2BCA1BCA0BC0D0C083C0827EF1FC01 +:104A4B00740612659A7CEB740212659A7CCB740423 +:104A5B0012659A7CDB7CBE30E10312008A7CBE308F +:104A6B00E2031256997CBC30E0031248A37CBC30A5 +:104A7B00E103125F137CBC30E203125F997CBD3003 +:104A8B00E103123BA87CBE30E0031200627AF1FC1A +:104A9B00D082D083D0D0DA0BDA1BDA2BDA3BDA4BAD +:104AAB00DA5BDA6BDA7B32CA797A0F03037CE77C49 +:104ABB00FB1266206004740180687CBF3EB01265F7 +:104ACB002E60047401805B126630600474018052A6 +:104ADB007CBE12652E600474018047126630600440 +:104AEB007401803E1266206004740180357CBF3EE9 +:104AFB00B0440112652E600474018026126630608A +:104B0B00047401801D1261997E1F03037A1BB0127E +:104B1B0064CF60047401800A1266406004740180E3 +:104B2B0001E4DA7922CA3B7A6300407F307A730062 +:104B3B003F7AB3003E1266206004740180607EB33E +:104B4B00003E3EB012652E60047401805112663037 +:104B5B006004740180487EB3003F12652E600474BC +:104B6B0001803B126630601D7401803280177E3BE2 +:104B7B00B012652E600474018024126630600474D8 +:104B8B0001801B0B747EA300407CBA147AB30040E7 +:104B9B004CAA78DA126640600474018001E4DA3BB7 +:104BAB0022CA3B7AB3005C7F30693300069934E448 +:104BBB007AB3005D6933000A1266507E73005D0A9A +:104BCB00477E5400079D547E24000160053E24144B +:104BDB0078FB7E73005C6C665C754D3368086933DB +:104BEB000004993480066933000699340B3A3099E6 +:104BFB00346933000A1266506933000299347EB36C +:104C0B00005D047AB3005D7E73005DBE700840A446 +:104C1B006933000A126650DA3B22CA3B7A3700240A +:104C2B007F30A9C7AF740E7E70011265EA6D337ABF +:104C3B003700277E270024BE24004008057E7040E5 +:104C4B0080027C757A730026741112659A20E0F845 +:104C5B007F032E1700277EB300267E700112658519 +:104C6B007E7300260A277D322E3700277A370027DE +:104C7B007E3700249D327A3700247E730026BE7067 +:104C8B004050B0A9D7AFDA3B227D127D23BE140072 +:104C9B0001782E7CB5540F7E34000160053E341430 +:104CAB0078FB7C677D120E140E140E140E141A0270 +:104CBB001A002E04007E2E08FE107E0B704C7680A0 +:104CCB00324D1178317CB5540F7E34000160053EB6 +:104CDB00341478FB7CB764FF7D120E140E140E1483 +:104CEB000E141A021A002E04007E2E08FE107E0BE4 +:104CFB00705C7B7A0B7022CA796CFF1266207E1473 +:104D0B0067A77E0400FF125F407CBF3EB012652E8A +:104D1B0074037E34FE817E24007E7A1BB07E34FECB +:104D2B00827E24007E7E1BB030E6F27E1BB030E12B +:104D3B00046CEE80037EE0017E1BB054BF7A1BB087 +:104D4B004CEE68130A3F7A3701D27E1467877E04D4 +:104D5B0000FF125F4080031266400BF0BEF07F280D +:104D6B009ADA7922CA3B7F30E47AB30321693300A4 +:104D7B00049934E47AB303220B3A30993469330043 +:104D8B000A126650693300089934601F7E73032240 +:104D9B000A477E5400079D547E34000160053E3463 +:104DAB001478FB4E7303217A730321693300029944 +:104DBB00346933000A1266507EB30322047AB303BC +:104DCB00227E730322BE700840AE7EB30321DA3B12 +:104DDB0022CA69CAF87D627A37031F7CFB7E080200 +:104DEB005F74407C7F3E703E702E70067E27031FE3 +:104DFB007C651256E17E08025F74407C7F3E703EFC +:104E0B00702E70077E27031F0A247C651256E17EE5 +:104E1B0008025F74407C7F3E703E702E70087C6D84 +:104E2B001256E17E08025F74407C7F3E703E702E0E +:104E3B0070097C6C1256E1DAF8DA6922CA3B7F30D2 +:104E4B007E3BB044017A3BB09F1179330009792343 +:104E5B0000077933000D7923000B693300156923A3 +:104E6B000013793300117923000F693300011B34D0 +:104E7B00680E1B3468120B357822693300158010CD +:104E8B00693300153E348008693300153E343E34D7 +:104E9B006913000569030003E412633EE47A3BB037 +:104EAB006D33DA3B22CAF8740E6C771265EA741113 +:104EBB0012659A20E1537E370248BE340040280524 +:104ECB007EF04080027CF77E0F024A7C7F742012BA +:104EDB005FED0A2F7E3702489D327A3702480A155A +:104EEB007E1F024A2D317A1F024A7E3702484D330C +:104EFB00780F74117E700A1265EAE47AB302478068 +:104F0B000874117E70021265EADAF822CA7BCA6B4A +:104F1B00CA5BCA4BCA2BCA1BCA0BC0D0C083C08288 +:104F2B00E59830E1085398FDE47AB302EDE598304B +:104F3B00E02A5398FE7EA199BEA07F78157E73035D +:104F4B00277CB7047AB30327BE7014280A75C76091 +:104F5B008005E47AB303277CBA125C60D082D083DD +:104F6B00D0D0DA0BDA1BDA2BDA4BDA5BDA6BDA7BC3 +:104F7B0032CA3B7A6302B77A7302B27AB302B17F59 +:104F8B00301260F77F037EB302B13EB0124BAC7FA1 +:104F9B00031253397F037EB302B2124BAC7F031261 +:104FAB005339801B7F037E1F02B37E1BB0124BACA9 +:104FBB007F031253397E1F02B30B347A1F02B37E69 +:104FCB00A302B77CBA147AB302B74CAA78D67F0384 +:104FDB00125E8CDA3B22CA3B7A7302E17AB302E0AF +:104FEB007F301260F77F037EB302E03EB0124BAC12 +:104FFB007F031253397F037EB302E1124BAC7F0365 +:10500B001253397F031260F77F037EB302E03EB089 +:10501B004401124BAC7F031253397F03124D6F7E49 +:10502B001F02E27A1BB07F03125EB97F03125E8C04 +:10503B007E1F02E27E1BB0DA3B227E340006123367 +:10504B002B701A7E1F02E80B1C7A1F02E8BE182772 +:10505B0010401D7E1827107A1F02E880137E340043 +:10506B000712332B700A9F117A1F02E87A3702E678 +:10507B007E1F02E8BE1807D040097E1400037A1782 +:10508B0002E622BE18006440127E3702E6BE3400F0 +:10509B000268087E3400017A3702E6227E3400373C +:1050AB007E2400011217987E3400367E24000112F4 +:1050BB0017987E3400357E2400011217987E340039 +:1050CB0037E412302E7E340036E412302E7E34005C +:1050DB0035E412302E7E3400067E240001124C94EF +:1050EB007E3400077E240001124C947E3400066D42 +:1050FB00221217987E3400076D220217987A1F022E +:10510B00A97E3402AC7E2400007E1B307E3402ADBF +:10511B007E2400007A1B307E3402AB7E2400007E9E +:10512B001B307E3402AE7E2400007A1B307E3402AC +:10513B00AA7E2400007E1B307E3402AF7E2400004A +:10514B007A1B307E3402A97E2400007E1B307E3415 +:10515B0002B07E2400007A1B307E1F02AD22CAD81B +:10516B00CA797CF67CE77CDB1266206004740180D4 +:10517B00487CBD3EB012652E60047401803B126604 +:10518B00306004740180327CBE12652E60047401A1 +:10519B00802712663060047401801E7CBF12652E5E +:1051AB0060047401801312663060047401800A126B +:1051BB006640600474018001E4DA79DAD8227CABB2 +:1051CB0053BACF43BA801B3468141B3468151B3495 +:1051DB0068162E3400037813E5BAF5BA800D43BA7E +:1051EB0010800843BA20800343BA307E14FE807EC1 +:1051FB0004007E7E0BB044407A0BB07E0BB0448033 +:10520B007A0BB07CBA543F7E0B704C7B7A0B70E4FC +:10521B007E34FE827E24007E7A1BB022E46C7712F1 +:10522B0065EA74017E70081265EA74077E703F129E +:10523B0065EA74097E703F1265EA740B7E70071283 +:10524B0065EA74016C771265EA74027AB30246E47C +:10525B007AB302477AB3024E7AB3024F7E3401001F +:10526B007E2400C27A1F02CD7AB302D17AB302D266 +:10527B0074087AB302D3A9D7AF227EB3023DBEB076 +:10528B000D50507EA003A4905296730252BD025251 +:10529B00C00252DE0252C30252DE0252C60252C991 +:1052AB000252CC0252CF0252D20252D50252D80233 +:1052BB0052DB0237D4024228024400025606024255 +:1052CB00C70266C70253E3024183025A4B026016C0 +:1052DB000266CA02667A7EB3025E70517E3466B88D +:1052EB007A37025F7E3466B27A3702617E3466B5F6 +:1052FB007A3702637E3466AF7A3702657E340006F6 +:10530B007A3702677E34000A7A3702697E08025FB9 +:10531B001265FD7E08025F74406C776C661256E175 +:10532B007E34003212465D74017AB3025E22CA3BB0 +:10533B007F30E47AB3005C6933000499346933003D +:10534B000A1266500B3A30993480157EB3005C0418 +:10535B007AB3005C7E73005CBE701E2803E4802170 +:10536B006933000A126650693300089934BEB001E4 +:10537B0068D96933000299346933000A1266507494 +:10538B0001DA3B227CAB1B34681E1B34682A1B34AE +:10539B0068362E340003783F7EB302ED70FA740149 +:1053AB007AB302ED7AA199227EB302EE70FA740100 +:1053BB007AB302EE7AA19B227EB302EF70FA7401EC +:1053CB007AB302EF7AA1AD227EB302F070FA7401C8 +:1053DB007AB302F07AA1FE227EB3023CB480227E25 +:1053EB00B3023F701C7EB3023E70167EB302417057 +:1053FB00107EB30240700A7E370242BE3400016851 +:10540B000302667A7EB30246B4040A7E3449A67E52 +:10541B002400FF80087E3449A47E2400FF7A1F02FB +:10542B004A7E3400017A37024802660F1B34681B30 +:10543B001B3468221B34682B1B3468340B36783CC6 +:10544B00C28C758C00758A00D28C22C28E758D0031 +:10545B00758B00D28E22538EEF75D60075D7004315 +:10546B008E102253DDF775D40075D50043DD08226D +:10547B0053DD7F75D20075D30043DD8022CA3B7F9D +:10548B00707CF57CE67CD77CCBCA7B0A366D222FF1 +:10549B00110A1F6D001209E6DA0B12453112642056 +:1054AB007405900004F074A8900005F09000067A43 +:1054BB00EBC09000077AEBD09000087AEBE09000FD +:1054CB00097AEBF0740A125E30DA3B227D236D33DE +:1054DB001B24681A1B2468201B2468261B24682C99 +:1054EB000B267834E58C7C6B6C77E58A8026E58D12 +:1054FB007C6B6C77E58B801CE5D67C6B6C77E5D78A +:10550B008012E5D47C6B6C77E5D58008E5D27C6B9B +:10551B006C77E5D30A2B4D3222740E6C771265EA49 +:10552B00741112659A30E03D7E0F024A7420125BB3 +:10553B00400A1B7E2702489D217A2702487E1F02C4 +:10554B004A2D317A1F024A7E3702484D33780E744A +:10555B00117E70481265EAE47AB302472274117E19 +:10556B0070400265EA22CA3B7D627CE77CFBBE642D +:10557B00000058146E64FFFF0B647CBF7C7E7E14AE +:10558B0067F37E0400FF800C7CBF7C7E7E1467F18A +:10559B007E0400FF1240352EF0067D367E0802C6D3 +:1055AB00125DCF7CBF7C7E7E0802C7124035DA3B92 +:1055BB00221B34681C1B3468241B34682A1B346878 +:1055CB00300B367835758A00758C00438904D28C84 +:1055DB0022758B00758D00438940D28E2275D700C2 +:1055EB0075D600438E182275D50075D40043DD0C9B +:1055FB002275D30075D20043DDC022CAF87EB302F8 +:10560B003C70237EB30241701D7EB3024070177E47 +:10561B00B3023F70117EF3023EBEF08050087E371E +:10562B0002424D33680512667A8017E47C7F12655F +:10563B00EA4CFF68047403800274027AB3024612C8 +:10564B006696DAF822CA797A0F01A81264B67453F7 +:10565B00900004F0E4900005F0900006F090000735 +:10566B00F07E3401A87E2400007A1F03177E1400FD +:10567B00087E0400017E1F01A81203CD7D732E74DA +:10568B0000087D570B54125E307D37DA7922E46CBB +:10569B00771265EA74027AB30246E47AB30247746E +:1056AB000E7E70011265EA74117E70481265EA7401 +:1056BB000E7E70021265EA74117E70481265EA74F0 +:1056CB000E7E70011265EA74147E70901265EA7496 +:1056DB000E6C770265EACA3B7A63005B7A73005AF9 +:1056EB007AB300597F301260F77F037EB300593EC7 +:1056FB00B0124BAC7F031253397F037EB3005A12A7 +:10570B004BAC7F031253397F037EB3005B124BAC60 +:10571B007F031253397F03125E8CDA3B22CAF87C6B +:10572B00FBBEF03B28037EF03B744C900000F07402 +:10573B0045900001F07444900002F074289000032F +:10574B00F09000047AEBF00A3FCA397F107E140008 +:10575B00057E0400011200A61BFD7CBF2405125E12 +:10576B0030DAF822CAF87CFBBEF03B28037EF03B14 +:10577B00744C900000F07445900001F0744490005C +:10578B0002F07440900003F09000047AEBF00A3FB3 +:10579B00CA397F107E1400057E0400011200A61B7F +:1057AB00FD7CBF2405125E30DAF8227F617F702EFC +:1057BB00140007693000020B0A202F168017695757 +:1057CB000015694700137F072E140007693000028C +:1057DB000B0A209F12793000021B0A20691700095F +:1057EB00690700076937001569270013BF1028CE1A +:1057FB00227F617F702E14000B693000020B0A2090 +:10580B002F16801769570015694700137F072E1451 +:10581B00000B693000020B0A209F12793000021B2B +:10582B000A206917000D6907000B693700156927F6 +:10583B000013BF1028CE22CA69CAF86D666CFF80B0 +:10584B00167E34000112655B7D360B64BE34001E80 +:10585B0040057EF001800E7E34FE827E24007E7E2B +:10586B001BB030E6DC7E34FE827E24007E7E1BB0D5 +:10587B0054BF7A1BB07CBFDAF8DA69227D437F70A4 +:10588B007E1F02A17937000579270003E47A7BB0EC +:10589B00794700019F11793700097927000779377C +:1058AB00000D7927000B7E1F02A579370011792790 +:1058BB00000F7E1F02A579370015792700136D3372 +:1058CB00227F717F607CAB6C7780310A170A2A2D9F +:1058DB00217F062D127E0BB07E7B60BCB6680E7EE0 +:1058EB000F030F7E0B609C677A0B60E4220BF47E38 +:1058FB000F030F7E0BB0047A0BB00B707E7BB07076 +:10590B00CA7401227EB3017F603AE47EA3013E0A92 +:10591B003A19B3013F7AB3013E7E18013E7A1F0359 +:10592B000F7E08013F7E3467DA7E2400FF1258CCCD +:10593B007E1467D17E0400FF125F40E47AB3013E10 +:10594B007AB3017F22CA3B7CF57CE67CD77CCB7C8F +:10595B007EAC7F1244991263BC7405900004F07402 +:10596B00C8900005F09000067AEBC09000077AEB28 +:10597B00D09000087AEBE09000097AEBF0740A12F1 +:10598B005E30DA3B227584017E44041FE47A49B011 +:10599B001B4478F97EF803287E0400FF7E1466D43E +:1059AB000B0A405D44681A692000020B0E0B448001 +:1059BB000A7E0BB07A29B00B240B0C1B4478F280B7 +:1059CB00DF0231D27D127D234D23780CBE140000F3 +:1059DB00A9A1D1B39288D2A8BE24000178082E14B5 +:1059EB00FFFF928AD2AABE2400027803438F10BE17 +:1059FB002400037803438F20BE2400047803438FD5 +:105A0B0040227F617F709F1180267F061B0C9F01B8 +:105A1B007D017F272D517E2B307D532D5F7E2B20DB +:105A2B007F272D507A2B207F272D537A2B300B1C61 +:105A3B007F261E541E4450034EA080BF1240CB2223 +:105A4B007EB30246B4041D7EB3023CB481167EB312 +:105A5B00023F70107EB30241700A7E370242BE34A1 +:105A6B000001680302667A7E3449A47E2400FF7A23 +:105A7B001F024A7E3400017A37024802660FCA7948 +:105A8B007D737E340037BE74003778047401800157 +:105A9B00E412302E7E340036BE7400367804740166 +:105AAB008001E412302E7E340035BE74003578044C +:105ABB0074018001E412302EDA7922CAF87CFB7A69 +:105ACB001F03131264B6744C900004F07401900021 +:105ADB0005F09000067AEBF0E4900007F07E0F03E0 +:105AEB00137E3400087E240001791100021B1A007A +:105AFB00740C125E30DAF822CA3B7F307A730326BD +:105B0B007AB303251266880B347F03124531126476 +:105B1B00207403900004F074A7900005F07EB3038B +:105B2B0025900006F07EB30326900007F074081250 +:105B3B005E30DA3B22CA3B7F30CAB80BFD741612BB +:105B4B00659A7AFBB039BFFFFF800C29BFFFFE12AD +:105B5B00659A7A3BB00B747EFBA07CBA147AFBB0CF +:105B6B004CAA78E729BFFFFF9EF80003DA3B22CA55 +:105B7B003B7D727CCB1263BC7406900004F074C640 +:105B8B00900005F07401900006F09000077AEBC0CE +:105B9B009000087AEB707E3400097E2400011B1AFA +:105BAB0070740B125E30DA3B22CA3B7D727CCB12D7 +:105BBB0063BC7406900004F074C6900005F0740288 +:105BCB00900006F09000077AEBC09000087AEB701B +:105BDB007E3400097E2400011B1A70740B125E3098 +:105BEB00DA3B227E0817707E7F001C7F17120A4A51 +:105BFB007A3702FB7E14CFC07E04006A7F17120A2D +:105C0B004A7A3702FD7E341B007E2400B7BF711821 +:105C1B000A7E3702FD0B347A3702FD22CA3B7D72B6 +:105C2B007CCB1263BC7406900004F074C690000524 +:105C3B00F0E4900006F09000077AEBC09000087A31 +:105C4B00EB707E3400097E2400011B1A70740B125A +:105C5B005E30DA3B227CAB7EB3017F702E7E73010C +:105C6B003E7CB7047AB3013E0A3719A3013F7EA3EA +:105C7B00013E0A3A09B3013EB43B0674017AB30103 +:105C8B007FBEA0404005E47AB3013E22CA7BCA6BBB +:105C9B00CA5BCA4BCA2BCA1BCA0BC0D0C083C082FB +:105CAB007E0800B512272BA287B39287D082D083B0 +:105CBB00D0D0DA0BDA1BDA2BDA4BDA5BDA6BDA7B66 +:105CCB0032CA3B1264B67443900004F0E4900005B2 +:105CDB00F0900006F0900007F07E340008CA397F80 +:105CEB00107E1400087E0400011200A61BFD741028 +:105CFB00125E30DA3B227A3700247E3400257E2474 +:105D0B0000007E1B307E3400267E2400007A1B3080 +:105D1B007E3400247E2400007E1B307E3400277EE0 +:105D2B002400007A1B307E37002622CAD8CA797C21 +:105D3B00D67CE77CFB1260D47CBE24B01200467C80 +:105D4B00BF54F0C4540F0A5B44101200467CBF547E +:105D5B000F1200467CBD12665EDA79DAD822CAD8F9 +:105D6B00CA797CFB6CEE7CBE24B012004674011227 +:105D7B00004674101200466CDD7CBF12665E0BD0C1 +:105D8B00BED08078F40BE0BEE00840DADA79DAD8DE +:105D9B0022CA3B7F311264B67444900004F0740144 +:105DAB00900005F0E4900006F0900007F07E3400C0 +:105DBB00087E240001797100021B1A60740C125EBC +:105DCB0030DA3B227F707D437EA006E439B70006B4 +:105DDB001BA07E04000A7D348D307D148D107D4117 +:105DEB000A252E2400307C650A2A7F072D127A0B98 +:105DFB00604CAA78DB2243BA8053BACF1B346814A9 +:105E0B001B3468151B3468162E3400037813E5BA5F +:105E1B00F5BA800D43BA10800843BA20800343BA09 +:105E2B003053BA7F22CAF87CFBA9C7AF740E7E70C1 +:105E3B00011265EA741112659A20E0F87E140000D5 +:105E4B007E0400017CBF7E7001126585D202A9D74A +:105E5B00AFDAF822CAB8CA1B7E34FD107E24007E4E +:105E6B007E1BB030E4087E1BB054EF7A1BB07E1B58 +:105E7B00B030E5087E1BB054DF7A1BB0DA1BDAB802 +:105E8B0032CA3B7F306933000699346933000A12FA +:105E9B0066500B3A3099346933000A1266506933F5 +:105EAB00000499346933000A126650DA3B22CA3B6C +:105EBB007F306933000499346933000A1266500B42 +:105ECB003A3099346933000A1266506933000299EB +:105EDB00346933000A126650DA3B22CA3B7F3069C1 +:105EEB0033000699346933000A1266500B3A309925 +:105EFB00346933000A1266506933000299346933EE +:105F0B00000A126650DA3B22CAF8740E7E70011238 +:105F1B0065EA741112659A7CFB30E50874117E708A +:105F2B00401265EA7CBF30E20774116C771265EAA8 +:105F3B00C202DAF822CA797A0F01D47E3401D47EF8 +:105F4B002400007A1F03177E1400007E0400017EDC +:105F5B001F01D41203CD7D737CB7125E307D37DA0F +:105F6B007922CA797CE77CFB1260D47CBE24B01208 +:105F7B0000467CBF54F0C4540F0A5B441012004619 +:105F8B007CBF540F120046E412665EDA7922CAF81F +:105F9B00740E7E70021265EA741112659A7CFB30E6 +:105FAB00E50874117E70401265EA7CBF30E207741D +:105FBB00116C771265EADAF822CA3B7F307A370226 +:105FCB00DA800C7E3702DA7E3BB00B7412538F7E75 +:105FDB001F02DC7F011B0C7A0F02DC4D2378E4DA05 +:105FEB003B22CA3BCA787F30CAB8800B7EFBB07E9F +:105FFB003B700B741265EA29AFFFFF7CBA1439BFF3 +:10600B00FFFF4CAA78E61BFDDA3B227EB30246B4B7 +:10601B00041B7EB3023CB401147EB3023F700E7EB0 +:10602B00B3024170087E3702424D33680302667A31 +:10603B00026696CAF87CFB1264207403900004F08D +:10604B0074A3900005F07402900006F09000077A9C +:10605B00EBF07408125E30DAF8227EB30246B40419 +:10606B00097EB3023CBEB0A1680302667A7E1802B9 +:10607B00CD7A1F024A7E3702427A37024802660FF8 +:10608B007EB30246B404097EB3023CBEB021680362 +:10609B0002667A7E1802CD7A1F024A7E3702427A56 +:1060AB0037024802666C7E3400336D221217987EDD +:1060BB003400346D221217987E340034E412302EE3 +:1060CB007E340033740102302ECAF87CFB7CB7247B +:1060DB00B01200467CBF54F0C4540F0A5B4410123C +:1060EB0000467CBF540F120046DAF822CA3B7F30C1 +:1060FB006933000699346933000A1266506933001C +:10610B000299346933000A126650DA3B22CAF87CD2 +:10611B00FB1263BC7402900004F074C5900005F090 +:10612B009000067AEBF07407125E30DAF822CAF8A8 +:10613B007CFB1263BC7402900004F074C4900005E5 +:10614B00F09000067AEBF07407125E30DAF822CA90 +:10615B00F87CFB1264207402900004F074A590008C +:10616B0005F09000067AEBF07407125E30DAF82235 +:10617B00CA3B7F307A37031D800C7E37031D7E3B75 +:10618B00B00B7412538F7E3BB070EFDA3B2274046A +:10619B007E34FE817E24007E7A1BB01258427E3400 +:1061AB00FE877E24007E7E1BB0227E3702E6BE3445 +:1061BB000001780D7E3400027A3702E67E3400014E +:1061CB00227E3702E6227EB3023D24DF680A146882 +:1061DB000A0BB1780902608B0260650265450266A5 +:1061EB007ACAB8E59A30E108539AFDE47AB302EE25 +:1061FB00E59A30E003539AFEDAB832CAB8E5AC3010 +:10620B00E10853ACFDE47AB302EFE5AC30E00353A5 +:10621B00ACFEDAB832CAB8E5FD30E10853FDFDE457 +:10622B007AB302F0E5FD30E00353FDFEDAB832122B +:10623B0063BC7402900004F074C7900005F0740105 +:10624B00900006F07407025E301263BC740290007B +:10625B0004F074C0900005F07401900006F0740710 +:10626B00025E301264207402900004F074A390005C +:10627B0005F07401900006F07407025E3012642082 +:10628B007402900004F074A4900005F07401900067 +:10629B0006F07407025E301263BC7402900004F0C7 +:1062AB0074C2900005F07401900006F07407025E52 +:1062BB00301264207402900004F074A2900005F078 +:1062CB007402900006F07407025E301263BC740215 +:1062DB00900004F074C1900005F07401900006F07A +:1062EB007407025E301264207402900004F074A0F4 +:1062FB00900005F07401900006F07407025E3012F6 +:10630B0064207402900004F074A2900005F07401F4 +:10631B00900006F07407025E301264207402900045 +:10632B0004F074A1900005F07401900006F074075E +:10633B00025E30CAF87DF37CFB7F207F1080071B49 +:10634B00F47A2BF00B544DFF78F5DAF8227F017EAF +:10635B003702FD7D231B247D3278F87F201B2C7F99 +:10636B00024D4578EA2274017E34FE827E24007E43 +:10637B007A1BB074057E34FE817A1BB0025842CA78 +:10638B00F80A5B2E540020125B407CFB74146C7774 +:10639B001265EA7CBFDAF8221263BC740290000427 +:1063AB00F074C0900005F0E4900006F07407025EF4 +:1063BB0030744F900000F0744C900001F0744590D5 +:1063CB000002F07480900003F0221264207402909B +:1063DB000004F074A4900005F0E4900006F074073C +:1063EB00025E301263BC7402900004F074C790001C +:1063FB0005F0E4900006F07407025E30126420741E +:10640B0002900004F074A0900005F0E4900006F0F8 +:10641B007407025E30744C900000F07443900001DE +:10642B00F07444900002F07480900003F022126428 +:10643B00207402900004F074A3900005F0E4900027 +:10644B0006F07407025E301263BC7402900004F015 +:10645B0074C2900005F0E4900006F07407025E3001 +:10646B001263BC7402900004F074C1900005F0E458 +:10647B00900006F07407025E3012642074029000E4 +:10648B0004F074A1900005F0E4900006F07407028C +:10649B005E301264207402900004F074A290000528 +:1064AB00F0E4900006F07407025E30743790000041 +:1064BB00F07453900001F07445900002F074479013 +:1064CB000003F022E47E34FE827E24007E7A1BB031 +:1064DB0074057E34FE817A1BB0025842A9C7AF7493 +:1064EB000E7E70011265EA74146C771265EAC200B5 +:1064FB00A9D7AF22CA797D7380077E3403E81200D7 +:10650B00667D371B744D3378F1DA79227D237E3724 +:10651B0002FB7D131B147D3178F87D121B147D213A +:10652B0078EC227E34FE867E24007E7A1BB07402C9 +:10653B007E34FE817A1BB00258427EB30246B4040D +:10654B00097EB3023CBEB021680302667A026696EE +:10655B00800A7EA0097CBA147CAB78F97D231B34AE +:10656B004D2278EE227F70691700116907000F69C1 +:10657B00370015692700139F10227CA77C7B0A5AD2 +:10658B002E540020125FED74117E70010265EA7CBF +:10659B00ABE5FC20E7FB7CBA4480F5FCE5FC20E78F +:1065AB00FBE5EC221264207401900004F074A690B9 +:1065BB000005F07406025E301263BC740190000497 +:1065CB00F074C3900005F07406025E307E14004038 +:1065DB007E0400017E7302440A37124C25D3227CC1 +:1065EB00A77C7BE5FC20E7FB7CB7547FF5FC7AA10D +:1065FB00EC22CA3B7F300B3A309934693300049953 +:10660B0034DA3B2274037AB3024774117E70401262 +:10661B0065EA024EB074017E34FE817E24007E7AE0 +:10662B001BB002584274037E34FE817E24007E7AB6 +:10663B001BB002584274067E34FE817E24007E7AA3 +:10664B001BB00258427D236D338003000B34BD23F6 +:10665B0038F9227C6B7E080277743C7E70400256C0 +:10666B00E174047AB3024774117E70400265EA74D8 +:10667B00057AB3024774117E70600265EA6D338050 +:10668B00020B347E0BB00B1470F722E47AB3024783 +:10669B0074117E70480265EA7EB3025E6005E47A8F +:1066AB00B3025E22C29422C29522D29422D29522A8 +:1066BB00C2A422C2A522D2A422D2A52202667A02A9 +:1066CB00667A02667A283029000002031B444F00C9 +:1066DB0004001C01FA4000000202FB000000020251 +:1066EB00FD00000001025E000001013E00000101FF +:1066FB007F00000202E60000000402E80000000038 +:10670B000004026B00FF67F50004026F000000003D +:10671B000004027300000000000100B4000001023D +:10672B0045000000007EFED5007EFED7007EFED920 +:10673B00007EFEDB007EFEF5007EFEF7007EFEF99E +:10674B00007EFEFB007EFED2007EFEF2007EFECCC3 +:10675B00007EFECD007EFEEC007EFEED007EFEC8D0 +:10676B00007EFEC9007EFECA007EFECB007EFEE8E8 +:10677B00007EFEE9007EFEEA007EFEEB0D0A466F10 +:10678B00756E642044657669636520416464726547 +:10679B0073733A3078253032580D0A002E000D0AEB +:1067AB00466F756E64204465766963652041646449 +:1067BB00726573733A3078253032580D0A002E000B +:1067CB004F4B210D0A004572726F72210D0A00505A +:1067DB004F570043005768004A00570041005600CE +:1067EB0025660025640020002D0040535443495377 +:0367FB0050230028 :00000001FF diff --git a/STC32G12K128.cfg b/STC32G12K128.cfg index 3285eb8..131c800 100644 --- a/STC32G12K128.cfg +++ b/STC32G12K128.cfg @@ -15,3 +15,4 @@ SelfDefineBaud=9600 SelfDefineFormat=0 SelfDefineSize=8 SelfDefineCommand=405354434953502339 +WaitForHidIsp=1 diff --git a/STC32_FPMU_LARGE.LIB.remove b/STC32_FPMU_LARGE.LIB.remove new file mode 100644 index 0000000..c2f6942 Binary files /dev/null and b/STC32_FPMU_LARGE.LIB.remove differ diff --git a/Source/PCA9685_driver.c b/Source/PCA9685_driver.c index c722faa..cbc1e29 100644 --- a/Source/PCA9685_driver.c +++ b/Source/PCA9685_driver.c @@ -10,12 +10,45 @@ static IIC_Soft_Config config; static uint8 has_init = 0; +#if (1==PCA9685_USE_SOFT_IIC) +void pca9685_scl_set() +{ + PCA9685_SCL_LEVEL(1); +} + +void pca9685_sda_set() +{ + PCA9685_SDA_LEVEL(1); +} + +void pca9685_sda_clr() +{ + PCA9685_SDA_LEVEL(0); +} + +void pca9685_scl_clr() +{ + PCA9685_SCL_LEVEL(0); +} + +uint8 pca9685_sda_read() +{ + return PCA9685_SDA_READ(); +} + +#endif + void pca9685_init() { if(has_init) return; // 如果已经初始化过,则直接返回 #if PCA9685_USE_SOFT_IIC == 1 - config.scl_pin = PCA9685_SOFT_IIC_SCL_PIN; - config.sda_pin = PCA9685_SOFT_IIC_SDA_PIN; + // config.scl_pin = PCA9685_SOFT_IIC_SCL_PIN; + // config.sda_pin = PCA9685_SOFT_IIC_SDA_PIN; + config.SCL_SET = pca9685_scl_set; + config.SCL_CLR = pca9685_scl_clr; + config.SDA_SET = pca9685_sda_set; + config.SDA_CLR = pca9685_sda_clr; + config.SDA_READ = pca9685_sda_read; config.wait_time = 10; soft_iic_init(&config); // 初始化软件IIC soft_iic_write_reg(&config, PCA9685_I2C_ADDR, PCA9685_MODE1, 0x00); // 设置PCA9685模式寄存器为正常模式 diff --git a/Source/iic.c b/Source/iic.c index 26baa41..7fa7a2e 100644 --- a/Source/iic.c +++ b/Source/iic.c @@ -16,13 +16,6 @@ void iic_delay_us(uint16 x) //33.1776Mhz } } - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 wait(void) { uint16 count = 0; @@ -40,12 +33,6 @@ uint8 wait(void) return ret; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 start(void) { uint8 ret; @@ -54,12 +41,6 @@ uint8 start(void) return ret; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 send_data(char dat) { uint8 ret; @@ -69,12 +50,6 @@ uint8 send_data(char dat) return ret; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 recv_ack(void) { uint8 ret; @@ -83,12 +58,6 @@ uint8 recv_ack(void) return ret; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- char recv_data(void) //接收数据 { I2CMSCR = 0x04; //发送RECV命令 @@ -96,12 +65,6 @@ char recv_data(void) //接收数据 return I2CRXD; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 send_ack(void) { uint8 ret; @@ -111,12 +74,6 @@ uint8 send_ack(void) return ret; } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- void send_nak(void) { I2CMSST = 0x01; //设置NAK信号 @@ -124,12 +81,6 @@ void send_nak(void) wait(); } -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部使用用户无需关心 -// @param NULL -// @return void -// Sample usage: 无需用户调用,用户请使用h文件中的宏定义 -//------------------------------------------------------------------------------------------------------------------- uint8 stop(void) { uint8 ret; @@ -139,6 +90,33 @@ uint8 stop(void) } +void iic_scan(void) +{ + uint8 i; + for(i = 0; i <= 0x7F; i++) { //7位SlaveAddress + uint8 ACK_or_NACK = 0; + start(); + printf("."); + send_data((i << 1) | 0); //I2C从地址+写标志 + + I2CMSCR = 0x03; + while(!(I2CMSST & 0x40)); + if(I2CMSST & 0x02) //判断I2CMSST的bit1 MSACKI,读入的ACK信号为低即是ACK,为高为NACK. + ACK_or_NACK = 0; //MSACKI=1=NACK=没有正确收到ACK信号 + else + ACK_or_NACK = 1; //MSACKI=0=ACK=正确收到ACK信号 + I2CMSST &= ~0x40; //清除中断标志 + if(ACK_or_NACK) { + printf("\r\nFound Device Address:0x%02X\r\n", i); + // UART_SendHex(i); + // printf("%02x",i); + } else { + stop(); + } + + } +} + //#define UNUSED(expr1, expr2) do { if(scl_pin == sda_pin); } while (0) @@ -213,6 +191,40 @@ uint8 iic_write_reg(uint8 dev_add, uint8 reg, uint8 dat) return IIC_SEND_OK; } +//------------------------------------------------------------------------------------------------------------------- +// @brief 写入多个字节数据到I2C设备指定寄存器地址 + +//------------------------------------------------------------------------------------------------------------------- +uint8 iic_write_reg_bytes(uint8 dev_add, uint8 reg, uint8 *dat, uint8 num) +{ + if(start() != IIC_SEND_OK) + return IIC_SEND_FAIL; + if(send_data((dev_add<<1) | 0x00) != IIC_SEND_OK) + return IIC_SEND_FAIL; + if(recv_ack() != IIC_SEND_OK) + return IIC_SEND_FAIL; + if(send_data(reg) != IIC_SEND_OK) + return IIC_SEND_FAIL; + if(recv_ack() != IIC_SEND_OK) + return IIC_SEND_FAIL; + while(num--) + { + if(send_data(*dat) != IIC_SEND_OK) + return IIC_SEND_FAIL; + if(recv_ack() != IIC_SEND_OK) + return IIC_SEND_FAIL; + dat++; + } + + // if(recv_ack() != IIC_SEND_OK) + // return IIC_SEND_FAIL; + if(stop() != IIC_SEND_OK) + return IIC_SEND_FAIL; + + + return IIC_SEND_OK; +} + //------------------------------------------------------------------------------------------------------------------- // @brief 读取I2C设备指定地址寄存器的数据 // @param iic_n I2C通道号及引脚 @@ -237,8 +249,10 @@ uint8 iic_read_reg(uint8 dev_add, uint8 reg, uint8 *dat) return IIC_SEND_FAIL; if(recv_ack() != IIC_SEND_OK) return IIC_SEND_FAIL; - - + // if(stop() != IIC_SEND_OK) + // return IIC_SEND_FAIL; + if(start() != IIC_SEND_OK) + return IIC_SEND_FAIL; // if(start() != IIC_SEND_OK) // return IIC_SEND_FAIL; @@ -288,26 +302,38 @@ uint8 iic_read_reg_bytes(uint8 dev_add, uint8 reg return IIC_SEND_FAIL; if(recv_ack() != IIC_SEND_OK) return IIC_SEND_FAIL; + // if(stop() != IIC_SEND_OK) + // return IIC_SEND_FAIL; + if(start() != IIC_SEND_OK) + return IIC_SEND_FAIL; if(send_data((dev_add<<1) | 0x01) != IIC_SEND_OK) return IIC_SEND_FAIL; if(recv_ack() != IIC_SEND_OK) return IIC_SEND_FAIL; - while(--num) + while(num--) { *dat = recv_data(); //读取数据 - if(send_ack() != IIC_SEND_OK) - { - return IIC_SEND_FAIL; - } - dat++; + if(num==0) + { + send_nak(); + } + else + { + if(send_ack() != IIC_SEND_OK) + { + return IIC_SEND_FAIL; + } + dat++; + } + } - *dat = recv_data(); + // *dat = recv_data(); - if(send_ack() != IIC_SEND_OK) - return IIC_SEND_FAIL; + // if(send_ack() != IIC_SEND_OK) + // return IIC_SEND_FAIL; if(stop() != IIC_SEND_OK) return IIC_SEND_FAIL; diff --git a/Source/iic_soft.c b/Source/iic_soft.c index 9e1fcf1..fcbf566 100644 --- a/Source/iic_soft.c +++ b/Source/iic_soft.c @@ -15,45 +15,45 @@ void soft_iic_delay(uint16 delay_time) void soft_iic_init(IIC_Soft_Config *config) { // 设置SCL和SDA引脚为推挽输出模式 - gpio_mode(config->scl_pin, GPIO); - gpio_mode(config->sda_pin, GPIO); + // gpio_mode(config->scl_pin, GPIO); + // gpio_mode(config->sda_pin, GPIO); // 初始化SCL和SDA引脚为高电平 - gpio_set_level(config->scl_pin, 1); - gpio_set_level(config->sda_pin, 1); + config->SCL_SET(); + config->SDA_SET(); } void soft_iic_start(IIC_Soft_Config *config) { - gpio_set_level(config->sda_pin, 0); // SDA拉低 + config->SDA_CLR(); // SDA拉低 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 0); // SCL拉低 + config->SCL_CLR(); // SCL拉低 soft_iic_delay(config->wait_time); // 等待一段时间 } void soft_iic_stop(IIC_Soft_Config *config) { - gpio_set_level(config->sda_pin, 0); // SDA拉低 + config->SDA_CLR(); // SDA拉低 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 1); // SCL拉高 + config->SCL_SET(); // SCL拉高 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->sda_pin, 1); // SDA拉高 + config->SDA_SET(); // SDA拉高 soft_iic_delay(config->wait_time); // 等待一段时间 } uint8 soft_iic_read(IIC_Soft_Config *config) { uint8 dat = 0,i; - gpio_set_level(config->sda_pin, 1); // 设置SDA为输入模式 + config->SDA_SET(); // 设置SDA为输入模式 for (i = 0; i < 8; i++) { - gpio_set_level(config->scl_pin, 1); // SCL拉高 + config->SCL_SET(); // SCL拉高 soft_iic_delay(config->wait_time); // 等待一段时间 - if (gpio_get_level(config->sda_pin)) // 读取SDA的状态 + if (config->SDA_READ()) // 读取SDA的状态 { dat |= (1 << (7 - i)); // 将读取的位存入dat } - gpio_set_level(config->scl_pin, 0); // SCL拉低 + config->SCL_CLR(); // SCL拉低 soft_iic_delay(config->wait_time); // 等待一段时间 } return dat; @@ -62,58 +62,113 @@ uint8 soft_iic_read(IIC_Soft_Config *config) void soft_iic_write(IIC_Soft_Config *config, uint8 dat) { uint8 i; - gpio_set_level(config->sda_pin, 0); // 设置SDA为输出模式 + config->SDA_CLR(); // 设置SDA为输出模式 for (i = 0; i < 8; i++) { soft_iic_delay(config->wait_time); // 等待一段时间 if (dat & (1 << (7 - i))) // 检查当前位 { - gpio_set_level(config->sda_pin, 1); // 写入1 + config->SDA_SET(); // 写入1 } else { - gpio_set_level(config->sda_pin, 0); // 写入0 + config->SDA_CLR(); // 写入0 } - gpio_set_level(config->scl_pin, 1); // SCL拉高 + config->SCL_SET(); // SCL拉高 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 0); // SCL拉低 + config->SCL_CLR(); // SCL拉低 } soft_iic_delay(config->wait_time); // 等待一段时间 } -uint8 soft_iic_ack(IIC_Soft_Config *config) +uint8 soft_iic_rev_ack(IIC_Soft_Config *config) { - gpio_set_level(config->sda_pin, 0); // 发送ACK + uint8 err_count = 0; + config->SDA_SET(); // 发送 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 1); // SCL拉高 + config->SCL_SET(); // SCL拉高 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 0); // SCL拉低 + while(config->SDA_READ() == 1) + { + err_count++; + if(err_count > 30) + { + return 0; // 返回ACK失败 + } + soft_iic_delay(config->wait_time); // 等待一段时间 + } + config->SCL_CLR(); // SCL拉低 soft_iic_delay(config->wait_time); // 等待一段时间 - return 0; // 返回ACK成功 + return 1; } +void soft_iic_scan(IIC_Soft_Config *config) +{ + uint8 i; + for(i = 0; i <= 0x7F; i++) { //7位SlaveAddress + uint8 ACK_or_NACK = 0; + soft_iic_start(config); + printf("."); + soft_iic_write(config,(i << 1) | 0); //I2C从地址+写标志 + if(soft_iic_rev_ack(config) ) { + printf("\r\nFound Device Address:0x%02X\r\n", i); + // UART_SendHex(i); + // printf("%02x",i); + } else { + soft_iic_stop(config); + } + + } +} + + void soft_iic_nack(IIC_Soft_Config *config) { - gpio_set_level(config->sda_pin, 1); // 发送NACK + config->SDA_SET(); // 发送NACK soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 1); // SCL拉高 + config->SCL_SET(); // SCL拉高 soft_iic_delay(config->wait_time); // 等待一段时间 - gpio_set_level(config->scl_pin, 0); // SCL拉低 + config->SCL_CLR(); // SCL拉低 soft_iic_delay(config->wait_time); // 等待一段时间 } +void soft_iic_ack(IIC_Soft_Config *config) +{ + config->SDA_CLR(); // 发送ACK + soft_iic_delay(config->wait_time); // 等待一段时间 + config->SCL_SET(); // SCL拉高 + soft_iic_delay(config->wait_time); // 等待一段时间 + config->SCL_CLR(); // SCL拉低 + soft_iic_delay(config->wait_time); // 等待一段时间 +} void soft_iic_write_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 dat) { soft_iic_start(config); // 发送起始信号 soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK soft_iic_write(config, reg); // 发送寄存器地址 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK soft_iic_write(config, dat); // 发送数据 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK + soft_iic_stop(config); // 发送停止信号 +} + +void soft_iic_write_reg_bytes(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 *dat, uint8 len) +{ + soft_iic_start(config); // 发送起始信号 + soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令 + soft_iic_rev_ack(config); // 等待ACK + soft_iic_write(config, reg); // 发送寄存器地址 + soft_iic_rev_ack(config); // 等待ACK + while(len--) + { + soft_iic_write(config, *dat); // 发送数据 + soft_iic_rev_ack(config); // 等待ACK + dat++; + } soft_iic_stop(config); // 发送停止信号 } @@ -121,14 +176,42 @@ uint8 soft_iic_read_reg(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint { soft_iic_start(config); // 发送起始信号 soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK soft_iic_write(config, reg); // 发送寄存器地址 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK soft_iic_start(config); // 重新发送起始信号 soft_iic_write(config, (dev_addr << 1) | 1); // 发送设备地址和读命令 - soft_iic_ack(config); // 等待ACK + soft_iic_rev_ack(config); // 等待ACK *dat = soft_iic_read(config); // 读取数据 soft_iic_nack(config); // 发送NACK soft_iic_stop(config); // 发送停止信号 return *dat; // 返回读取的数据 -} \ No newline at end of file +} + +uint8 soft_iic_read_reg_bytes(IIC_Soft_Config *config, uint8 dev_addr, uint8 reg, uint8 *buf, uint8 len) +{ + soft_iic_start(config); // 发送起始信号 + soft_iic_write(config, (dev_addr << 1) | 0); // 发送设备地址和写命令 + soft_iic_rev_ack(config); // 等待ACK + soft_iic_write(config, reg); // 发送寄存器地址 + soft_iic_rev_ack(config); // 等待ACK + soft_iic_start(config); // 重新发送起始信号 + soft_iic_write(config, (dev_addr << 1) | 1); // 发送设备地址和读命令 + soft_iic_rev_ack(config); // 等待ACK + while(len--) + { + *buf = soft_iic_read(config); // 读取数据 + if(len==0) + { + soft_iic_nack(config); // 发送NACK + } + else + { + soft_iic_ack(config); // 发送ACK + buf++; + } + } + soft_iic_stop(config); // 发送停止信号 + return *buf; // 返回成功 +} + diff --git a/Source/ina226.c b/Source/ina226.c new file mode 100644 index 0000000..ce63dd7 --- /dev/null +++ b/Source/ina226.c @@ -0,0 +1,123 @@ +#include "ina226.h" + +static uint8 is_iic_init = 0; +INA226_t ina226[INA226_NUM]; + +#if (1==INA226_USE_SOFT_IIC) + +#include "iic_soft.h" +static IIC_Soft_Config ina226_soft_config; + +void ina226_scl_set() +{ + INA226_SCL_LEVEL(1); +} + +void ina226_sda_set() +{ + INA226_SDA_LEVEL(1); +} + +void ina226_sda_clr() +{ + INA226_SDA_LEVEL(0); +} + +void ina226_scl_clr() +{ + INA226_SCL_LEVEL(0); +} + +uint8 ina226_sda_read() +{ + return INA226_SDA_READ(); +} + +#else + +#include "iic.h" + +#endif + + +void INA226_Init(INA226_t *ina226, uint8 addr, uint8 mode[2], float max_current_A, float rshunt_mOhm, float amp_fix_k, float vot_fix_k) +{ + float cal; + if(!is_iic_init) + { + #if (1==INA226_USE_SOFT_IIC) + ina226_soft_config.SCL_SET = ina226_scl_set; + ina226_soft_config.SCL_CLR = ina226_scl_clr; + ina226_soft_config.SDA_SET = ina226_sda_set; + ina226_soft_config.SDA_CLR = ina226_sda_clr; + ina226_soft_config.SDA_READ = ina226_sda_read; + ina226_soft_config.wait_time = INA226_SOFT_WAIT_TIME; + soft_iic_init(&ina226_soft_config); + #else + iic_init(INA226_IIC, INA226_HARD_WAIT_TIME); + #endif + is_iic_init = 1; + } + ina226->config.addr = addr; + ina226->config.mode[0] = mode[0]; + ina226->config.mode[1] = mode[1]; + ina226->config.max_current_A = max_current_A; + ina226->config.rshunt_mOhm = rshunt_mOhm; + ina226->config.vot_fix_k = vot_fix_k; + ina226->config.amp_fix_k = amp_fix_k; + + ina226->calibration.c_lsb_mA = max_current_A / 65.535f; // Current LSB + cal = (5120.0f) / (ina226->calibration.c_lsb_mA * ina226->config.rshunt_mOhm) * ina226->config.amp_fix_k; + ina226->calibration.cal[0] = (uint8)((uint16)cal >> 8); + ina226->calibration.cal[1] = (uint8)((uint16)cal & 0xFF); + + memset(&ina226->result, 0, sizeof(ina226->result)); + #if (1==INA226_USE_SOFT_IIC) + soft_iic_write_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_CONFIG_REG, ina226->config.mode, 2); + soft_iic_write_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_CALIBRATION_REG, ina226->calibration.cal, 2); + #else + iic_write_reg_bytes(ina226->config.addr, INA226_CONFIG_REG, ina226->config.mode, 2); + iic_write_reg_bytes(ina226->config.addr, INA226_CALIBRATION_REG, ina226->calibration.cal, 2); + #endif + +} + +void INA226_Read(INA226_t *ina226) +{ + uint8 counter; + if(!is_iic_init) return; + + // Read voltage, current, power, and shunt voltage registers + #if (1==INA226_USE_SOFT_IIC) + soft_iic_read_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_BUSVOT_REG, ina226->result.org_reg[1],2); + soft_iic_read_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_CURRENT_REG, ina226->result.org_reg[3],2); + soft_iic_read_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_POWER_REG, ina226->result.org_reg[2],2); + soft_iic_read_reg_bytes(&ina226_soft_config, ina226->config.addr, INA226_SHUNTVOT_REG, ina226->result.org_reg[0],2); + #else + iic_read_reg_bytes(ina226->config.addr, INA226_BUSVOT_REG, ina226->result.org_reg[1],2); + iic_read_reg_bytes(ina226->config.addr, INA226_CURRENT_REG, ina226->result.org_reg[3],2); + iic_read_reg_bytes(ina226->config.addr, INA226_POWER_REG, ina226->result.org_reg[2],2); + iic_read_reg_bytes(ina226->config.addr, INA226_SHUNTVOT_REG, ina226->result.org_reg[0],2); + #endif + + ina226->result.voltage_V = (int16)((ina226->result.org_reg[1][0] << 8) | ina226->result.org_reg[1][1]) * 0.00125f; + ina226->result.current_A = (int16)((ina226->result.org_reg[3][0] << 8) | ina226->result.org_reg[3][1]) * ina226->calibration.c_lsb_mA * 0.001f; + ina226->result.power_W = (int16)((ina226->result.org_reg[2][0] << 8) | ina226->result.org_reg[2][1]) * ina226->calibration.c_lsb_mA * 0.025f; + ina226->result.shunt_voltage_mV = (int16)((ina226->result.org_reg[0][0] << 8) | ina226->result.org_reg[0][1]) * 0.0025f; + + ina226->result.voltage_V = ina226->result.voltage_V > 0 ? ina226->result.voltage_V : 0; + ina226->result.current_A = ina226->result.current_A > 0 ? ina226->result.current_A : 0; + ina226->result.power_W = ina226->result.power_W > 0.016 && ina226->result.current_A > 0 && ina226->result.voltage_V > 0 ? ina226->result.power_W : 0; + ina226->result.shunt_voltage_mV = ina226->result.shunt_voltage_mV > 0 ? ina226->result.shunt_voltage_mV : 0; + + for(counter = 0; counter < 9; counter++) + { + ina226->result.past_voltage_V[counter] = ina226->result.past_voltage_V[counter+1]; + ina226->result.past_current_A[counter] = ina226->result.past_current_A[counter+1]; + } + ina226->result.past_voltage_V[9] = ina226->result.voltage_V; + ina226->result.past_current_A[9] = ina226->result.current_A; + + ina226->result.energy_J += (ina226->result.past_voltage_V[9] * ina226->result.past_current_A[9] + ina226->result.past_voltage_V[8] * ina226->result.past_current_A[8]) * (INA226_READ_TIME_MS / 2000.0f); + ina226->result.quantity_C += (ina226->result.past_current_A[9] + ina226->result.past_current_A[8]) * (INA226_READ_TIME_MS / 2000.0f); +} diff --git a/Source/isr.c b/Source/isr.c index 27be3f8..f66c5ad 100644 --- a/Source/isr.c +++ b/Source/isr.c @@ -1,6 +1,6 @@ #include "isr.h" #include "command.h" - +#include "ina226.h" //UART1中断 void UART1_Isr() interrupt 4 @@ -112,7 +112,8 @@ void TM0_Isr() interrupt 1 } void TM1_Isr() interrupt 3 { - + INA226_Read(&ina226[0]); + P07 ^= 0x01; } void TM2_Isr() interrupt 12 { diff --git a/Source/main.c b/Source/main.c index ec22798..f46ce1a 100644 --- a/Source/main.c +++ b/Source/main.c @@ -1,18 +1,90 @@ #include "common.h" #include "delay.h" +#include "oled_iic_SSD1306.h" +#include "ina226.h" +#include "tim.h" +#include "iic.h" +#include "iic_soft.h" +#include "printfs.h" +#include "pwm.h" +uint8 mode[2] = INA226_DEF_MODE; +// uint8 m5[2] = {0x0D, 0x1B}; +// int8 s_buff[30]; +// uint8 ttt = 0; +// extern IIC_Soft_Config ina226_soft_config; void main() { - board_init(); // 初始化板子 - delay_ms(1000); - printf("System Init...\r\n"); - + // delay_ms(1000); + // printf("System Init...\r\n"); + P05 = 0; + oled_init(); + INA226_Init(&ina226[0], INA226_DEF_ADDR, mode, 20, 5, 1.0683, 1.002393); + + pit_timer_ms(TIM_1,INA226_READ_TIME_MS); + + pwm_init(PWMA_CH1P_P60,100000,5000); + + // oled_fill(0xff); + + // iic_init(IIC_1,10); + // ttt += iic_write_reg_bytes(0x40, 0x00, mode, 2); + // ttt += iic_write_reg_bytes(0x40, 0x05, m5, 2); + // // printf("ttt: %d",ttt); + P06 = 0; + // iic_scan(); while(1) { - delay_ms(1000); - printf("System Running...\r\n"); + // soft_iic_scan(&ina226_soft_config); + // uint8 vot[2] = {0}; + // uint8 cru[2] = {0}; + // uint8 pow[2] = {0}; + // int16 vott, crut, powt; + // float votf, cruf, powf; + // // // iic_scan(); + // iic_read_reg_bytes(0x40, 0x02, vot, 2); + // iic_read_reg_bytes(0x40, 0x04, cru, 2); + // iic_read_reg_bytes(0x40, 0x03, pow, 2); + // zf_sprintf(s_buff, "VOT: %d,%d\r\n", 45, 1234); + // // printf("%s", s_buff); + // // printf("VOT: %d,%d\r\n", (int32)(vot[0] << 8 | vot[1]), 1234); + // vott = (int16)(vot[0] << 8 | vot[1]); + // votf = (float)vott * 1.25 /1000.0f; + + // crut = (int16)(cru[0] << 8 | cru[1]); + // cruf = (float)crut * 0.30518 /1000.0f; + + // powt = (int16)(pow[0] << 8 | pow[1]); + // powf = (float)powt * 0.30518*25 /1000.0f; + + oled_printf_float(0, 0, ina226[0].result.voltage_V,2,4);oled_p6x8str(55, 0, "V"); + oled_printf_float(0, 1, ina226[0].result.current_A,2,4);oled_p6x8str(55, 1, "A"); + oled_printf_float(0, 2, ina226[0].result.power_W,2,4);oled_p6x8str(55, 2, "W"); + oled_printf_float(0, 3, ina226[0].result.energy_J,5,2);oled_p6x8str(55, 3, "J"); + oled_printf_float(0, 4, ina226[0].result.energy_J/3600.0f,5,3);oled_p6x8str(55, 4, "Wh"); + oled_printf_float(0, 5, ina226[0].result.quantity_C,5,2);oled_p6x8str(55, 5, "C"); + // // oled_int16(0, 0, (int16)(vot[0] << 8 | vot[1])); + // oled_int16(0, 1, vot[0]); + // oled_int16(40, 1, vot[1]); + // oled_int16(80, 1, ttt); + // oled_int16(0, 2, -12345); + // oled_printf_float(0, 0, 45.6,2,4);oled_p6x8str(55, 0, "V"); + // oled_p6x8str(0,3,s_buff); + // // printf("System Running...\r\n"); + // // USB_SendData("wewe",4); + P53 ^= 0x01; + // if(P53) + // { + // oled_fill(0xff); + // } + // else + // { + // oled_fill(0x00); + // } + // delay_ms(1000); } -} \ No newline at end of file +} + diff --git a/Source/oled_font.c b/Source/oled_font.c new file mode 100644 index 0000000..960f2e9 --- /dev/null +++ b/Source/oled_font.c @@ -0,0 +1,223 @@ +#include "oled_font.h" + +const uint8 code ascii_font_8x16[][16]= +{ + // <阴码> <列行式> <逆向> <8*16> + // <纵向 8bit 为一个数据模型> <横向取模> + + // 字模数据储存格式为:{byte1, byte2,....byte16} + + // 字模数据与像素对应关系 + // byte 1 2 3 4 5 6 7 8 + // bit [ 0] [ 8] [ 16] [ 24] [ 32] [ 40] [ 48] [ 56] + // bit [ 1] [ 9] [ 17] [ 25] [ 33] [ 41] [ 49] [ 57] + // bit [ 2] [ 10] [ 18] [ 26] [ 34] [ 42] [ 50] [ 58] + // bit [ 3] [ 11] [ 19] [ 37] [ 35] [ 43] [ 51] [ 59] + // bit [ 4] [ 12] [ 20] [ 38] [ 36] [ 44] [ 52] [ 60] + // bit [ 5] [ 13] [ 21] [ 39] [ 37] [ 45] [ 53] [ 61] + // bit [ 6] [ 14] [ 22] [ 30] [ 38] [ 46] [ 54] [ 62] + // bit [ 7] [ 15] [ 23] [ 31] [ 39] [ 47] [ 55] [ 63] + + // byte 9 10 11 12 13 14 15 16 + // bit [ 64] [ 72] [ 80] [ 88] [ 96] [104] [112] [120] + // bit [ 65] [ 73] [ 81] [ 89] [ 97] [105] [113] [121] + // bit [ 66] [ 74] [ 82] [ 90] [ 98] [106] [114] [122] + // bit [ 67] [ 75] [ 83] [ 91] [ 99] [107] [115] [123] + // bit [ 68] [ 76] [ 84] [ 92] [100] [108] [116] [124] + // bit [ 69] [ 77] [ 85] [ 93] [101] [109] [117] [125] + // bit [ 70] [ 78] [ 86] [ 94] [102] [110] [118] [126] + // bit [ 71] [ 79] [ 87] [ 95] [103] [111] [119] [127] + + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 0 + {0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00}, // ! 1 + {0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // " 2 + {0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00}, // # 3 + {0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00}, // $ 4 + {0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00}, // % 5 + {0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10}, // & 6 + {0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ' 7 + {0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00}, // ( 8 + {0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00}, // ) 9 + {0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00}, // * 10 + {0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00}, // + 11 + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00}, // , 12 + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, // - 13 + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00}, // . 14 + {0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00}, // / 15 + {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00}, // 0 16 + {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // 1 17 + {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00}, // 2 18 + {0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00}, // 3 19 + {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00}, // 4 20 + {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00}, // 5 21 + {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00}, // 6 22 + {0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00}, // 7 23 + {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00}, // 8 24 + {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}, // 9 25 + {0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00}, // : 26 + {0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00}, // ; 27 + {0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00}, // < 28 + {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00}, // = 29 + {0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00}, // > 30 + {0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00}, // ? 31 + {0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00}, // @ 32 + {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20}, // A 33 + {0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00}, // B 34 + {0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00}, // C 35 + {0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00}, // D 36 + {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00}, // E 37 + {0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00}, // F 38 + {0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00}, // G 39 + {0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20}, // H 40 + {0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // I 41 + {0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00}, // J 42 + {0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00}, // K 43 + {0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00}, // L 44 + {0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00}, // M 45 + {0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00}, // N 46 + {0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00}, // O 47 + {0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00}, // P 48 + {0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00}, // Q 49 + {0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20}, // R 50 + {0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00}, // S 51 + {0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}, // T 52 + {0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00}, // U 53 + {0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00}, // V 54 + {0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00}, // W 55 + {0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20}, // X 56 + {0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}, // Y 57 + {0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00}, // Z 58 + {0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00}, // [ 59 + {0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00}, // \ 60 + {0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00}, // ] 61 + {0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ^ 62 + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}, // _ 63 + {0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ` 64 + {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20}, // a 65 + {0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00}, // b 66 + {0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00}, // c 67 + {0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20}, // d 68 + {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00}, // e 69 + {0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // f 70 + {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00}, // g 71 + {0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20}, // h 72 + {0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // i 73 + {0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00}, // j 74 + {0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00}, // k 75 + {0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // l 76 + {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F}, // m 77 + {0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20}, // n 78 + {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00}, // o 79 + {0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00}, // p 80 + {0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80}, // q 81 + {0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00}, // r 82 + {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00}, // s 83 + {0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00}, // t 84 + {0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20}, // u 85 + {0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00}, // v 86 + {0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00}, // w 87 + {0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00}, // x 88 + {0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00}, // y 89 + {0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00}, // z 90 + {0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40}, // { 91 + {0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00}, // | 92 + {0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00}, // } 93 + {0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // ~ 94 +}; + +const uint8 code oled_6x8[][6] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp + { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! + { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % + { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * + { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + + { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // , + { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 + { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 + { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 + { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 + { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 + { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 + { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ + { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G + { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H + { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I + { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J + { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M + { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q + { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T + { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U + { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V + { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W + { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ + { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 }, // 55 + { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] + { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' + { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d + { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f + { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g + { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i + { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j + { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l + { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p + { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t + { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u + { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v + { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w + { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y + { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines +}; + diff --git a/Source/oled_iic_SSD1306.c b/Source/oled_iic_SSD1306.c new file mode 100644 index 0000000..326e1d5 --- /dev/null +++ b/Source/oled_iic_SSD1306.c @@ -0,0 +1,491 @@ +#include "oled_iic_SSD1306.h" +#include "oled_font.h" +#include "delay.h" +#include "printfs.h" + +#if (1==OLED_USE_SOFT_IIC) + +#include "iic_soft.h" + +static IIC_Soft_Config oled_soft_iic; + +#else + +#include "iic.h" + +#endif + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param void +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_wrdat(uint8 dat) +{ +#if (1==OLED_USE_SOFT_IIC) + soft_iic_write_reg(&oled_soft_iic, OLED_ADDR, 0x40, dat); +#else + iic_write_reg(OLED_ADDR, 0x40, dat); +#endif +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param void +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_wrcmd(uint8 cmd) +{ +#if (1==OLED_USE_SOFT_IIC) + soft_iic_write_reg(&oled_soft_iic, OLED_ADDR, 0x00, cmd); +#else + iic_write_reg(OLED_ADDR, 0x00, cmd); +#endif +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param void +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_hexascii(uint16 hex,int8 * Print) +{ + uint8 edata hexcheck ; + uint8 edata TEMP ; + TEMP = 6 ; + Print[TEMP ]='\0'; + while(TEMP) + { + TEMP -- ; + hexcheck = hex%10 ; + hex /=10 ; + Print[TEMP ] = hexcheck + 0x30 ; + } + +} + +#if (1==OLED_USE_SOFT_IIC) +void oled_scl_set() +{ + OLED_SCL_LEVEL(1); +} + +void oled_sda_set() +{ + OLED_SDA_LEVEL(1); +} + +void oled_sda_clr() +{ + OLED_SDA_LEVEL(0); +} + +void oled_scl_clr() +{ + OLED_SCL_LEVEL(0); +} + +uint8 oled_sda_read() +{ + return OLED_SDA_READ(); +} + +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED初始化函数 +// @param NULL +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_init(void) +{ + // unsigned char i; + // unsigned char initData[] = {0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA0,0xA6,0xA8,0x3F,0xC8,0xD3,0x00,0xD5,0x80,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,0xAF}; +#if (1==OLED_USE_SOFT_IIC) + // oled_soft_iic.sda_pin = OLED_SDA_PIN; + // oled_soft_iic.scl_pin = OLED_SCL_PIN; + oled_soft_iic.SCL_SET = oled_scl_set; + oled_soft_iic.SCL_CLR = oled_scl_clr; + oled_soft_iic.SDA_SET = oled_sda_set; + oled_soft_iic.SDA_CLR = oled_sda_clr; + oled_soft_iic.SDA_READ = oled_sda_read; + oled_soft_iic.wait_time = OLED_SOFT_WAIT_TIME; + soft_iic_init(&oled_soft_iic); +#else + iic_init(OLED_IIC,OLED_HARD_WAIT_TIME); +#endif + + + // for(i=0;i<25;i++){ + // oled_wrcmd(initData[i]); + // } + + // oled_wrcmd(0xAE); + // oled_wrcmd(0x40); + // oled_wrcmd(0xB0); + // oled_wrcmd(0xC8); + // oled_wrcmd(0x81); + // oled_wrcmd(0xFF); + // oled_wrcmd(0xA1); + // oled_wrcmd(0xA6); + // oled_wrcmd(0xA8); + // oled_wrcmd(0x1F); + // oled_wrcmd(0xD3); + // oled_wrcmd(0x00); + // oled_wrcmd(0xD5); + // oled_wrcmd(0xF0); + // oled_wrcmd(0xD9); + // oled_wrcmd(0x22); + // oled_wrcmd(0xDA); + // oled_wrcmd(0x02); + // oled_wrcmd(0xDB); + // oled_wrcmd(0x49); + // oled_wrcmd(0x8D); + // oled_wrcmd(0x14); + // oled_wrcmd(0xAF); + + oled_wrcmd(0xae);//--turn off oled panel + oled_wrcmd(0x00);//---set low column address + oled_wrcmd(0x10);//---set high column address + oled_wrcmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) + oled_wrcmd(0x81);//--set contrast control register + oled_wrcmd(Brightness); // Set SEG Output Current Brightness + +#if (0 == OLED_DISPLAY_DIR) + oled_wrcmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 + oled_wrcmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 +#else + oled_wrcmd(0xa0);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 + oled_wrcmd(0xc0);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 +#endif + + oled_wrcmd(0xa6);//--set normal display + oled_wrcmd(0xa8);//--set multiplex ratio(1 to 64) + oled_wrcmd(0x3f);//--1/64 duty + oled_wrcmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) + oled_wrcmd(0x00);//-not offset + oled_wrcmd(0xd5);//--set display clock divide ratio/oscillator frequency + oled_wrcmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec + oled_wrcmd(0xd9);//--set pre-charge period + oled_wrcmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock + oled_wrcmd(0xda);//--set com pins hardware configuration + oled_wrcmd(0x12); + oled_wrcmd(0xdb);//--set vcomh + oled_wrcmd(0x40);//Set VCOM Deselect Level + oled_wrcmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02) + oled_wrcmd(0x02);// + oled_wrcmd(0x8d);//--set Charge Pump enable/disable + oled_wrcmd(0x14);//--set(0x10) disable + oled_wrcmd(0xa4);// Disable Entire Display On (0xa4/0xa5) + oled_wrcmd(0xa6);// Disable Inverse Display On (0xa6/a7) + oled_wrcmd(0xaf);//--turn on oled panel + oled_fill(0x00); //初始清屏 + oled_set_pos(0,0); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示坐标设置 +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_set_pos(uint8 x, uint8 y) +{ + oled_wrcmd((uint8)(0xb0+y)); + oled_wrcmd((uint8)(((x&0xf0)>>4)|0x10)); + oled_wrcmd((uint8)((x&0x0f))); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED清屏函数 +// @param bmp_data 填充颜色选着(0x00 or 0xff) +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_fill(uint8 bmp_data) +{ + uint8 edata y,x; + + for(y=0;y<8;y++) + { + oled_wrcmd((uint8)(0xb0+y)); + oled_wrcmd((uint8)(0x01)); + oled_wrcmd((uint8)(0x10)); + for(x=0;x>4)|0x10)); + oled_wrcmd((uint8)((x&0x0f)|0x00)); + oled_wrdat(data1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED关闭一个坐标所有亮点 +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_clrpixel(uint8 x,uint8 y) +{ + oled_set_pos(x,y); + oled_wrcmd((uint8)(0xb0+y)); + oled_wrcmd((uint8)(((x&0xf0)>>4)|0x10)); + oled_wrcmd((uint8)((x&0x0f)|0x00)); + oled_wrdat(0x00); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示字符串(6*8字体) +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @param ch[] 字符串 +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_p6x8str(uint8 x,uint8 y,const int8 ch[]) +{ + uint8 edata c=0,i=0,j=0; + while (ch[j]!='\0') + { + c =ch[j]-32; + if(x>126){x=0;y++;} + oled_set_pos(x,y); + for(i=0;i<6;i++) oled_wrdat(oled_6x8[c][i]); + x+=6; + j++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示无符号数(6*8字体) +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @param num 无符号数 +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_uint16(uint8 x, uint8 y, uint16 num) +{ + int8 ch[7]; + + oled_hexascii(num,ch); + + oled_p6x8str(x, y, &ch[1]); //显示数字 6*8字体 + //oled_p8x16str(x, y, &ch[1]); //显示数字 8*16字体 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示有符号数(6*8字体) +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @param num 有符号数 +// @return void +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void oled_int16(uint8 x, uint8 y, int16 num) +{ + int8 ch[7]; + if(num<0) {num = -num;oled_p6x8str(x, y, "-");} + else oled_p6x8str(x, y, " "); + x+=6; + + oled_hexascii(num,ch); + oled_p6x8str(x, y, &ch[1]); //显示数字 6*8字体 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示32位有符号(去除整数部分无效的0) +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: oled_printf_int32(0,0,x,5);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void oled_printf_int32(uint16 x,uint16 y,int32 dat,uint8 num) +{ + int8 buff[34]; + uint8 length; + + if(10dat) length = zf_sprintf( &buff[0],"%d",dat);//负数 + else + { + buff[0] = ' '; + length = zf_sprintf( &buff[1],"%d",dat); + length++; + } + while(length < num) + { + buff[length] = ' '; + length++; + } + buff[num] = '\0'; + + oled_p6x8str((uint8)x, (uint8)y, (int *)buff); //显示数字 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示浮点数(去除整数部分无效的0) +// @param x x轴坐标设置0-127 +// @param y y轴坐标设置0-7 +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: oled_printf_float(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void oled_printf_float(uint16 x,uint16 y,double dat,uint8 num,uint8 pointnum) +{ + uint8 length; + int8 buff[34]; + int8 start,end,point; + + if(6dat) length = zf_sprintf( &buff[0],"%f",dat);//负数 + else + { + length = zf_sprintf( &buff[1],"%f",dat); + length++; + } + point = length - 7; //计算小数点位置 + start = point - num - 1; //计算起始位 + end = point + pointnum + 1; //计算结束位 + while(0>start)//整数位不够 末尾应该填充空格 + { + buff[end] = ' '; + end++; + start++; + } + + if(0>dat) buff[start] = '-'; + else buff[start] = ' '; + + buff[end] = '\0'; + + oled_p6x8str((uint8)x, (uint8)y, (int8 *)buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief OLED显示图像 +// @param high 图像高度 +// @param width 图像宽度 +// @param *p 图像地址(数组) +// @param value 二值化阀值 +// @return void +// @since v1.0 +// Sample usage: +// @Note 使用Image2lcd V3.2软件取模 C语言数组 水平扫描 +// 宽度高度自行设置 颜色反转 256色 +//------------------------------------------------------------------------------------------------------------------- +void oled_dis_bmp(uint16 high, uint16 width, uint8 *p,uint8 value) +{ + uint16 i = 0; + uint16 edata j = 0; + uint16 temp = 0,temp1 = 0; + uint8 dat = 0; + + + temp1 = high%8; + if(temp1 == 0) temp = high/8; + else temp = high/8+1; + + for(i=0; i=1))dat |= (*(p+i*8*width+j+width*0) > value? 1: 0)<<0; + if( (i<(temp-1)) || !temp1 || (temp1>=2))dat |= (*(p+i*8*width+j+width*1) > value? 1: 0)<<1; + if( (i<(temp-1)) || !temp1 || (temp1>=3))dat |= (*(p+i*8*width+j+width*2) > value? 1: 0)<<2; + if( (i<(temp-1)) || !temp1 || (temp1>=4))dat |= (*(p+i*8*width+j+width*3) > value? 1: 0)<<3; + if( (i<(temp-1)) || !temp1 || (temp1>=5))dat |= (*(p+i*8*width+j+width*4) > value? 1: 0)<<4; + if( (i<(temp-1)) || !temp1 || (temp1>=6))dat |= (*(p+i*8*width+j+width*5) > value? 1: 0)<<5; + if( (i<(temp-1)) || !temp1 || (temp1>=7))dat |= (*(p+i*8*width+j+width*6) > value? 1: 0)<<6; + if( (i<(temp-1)) || !temp1 || (temp1>=8))dat |= (*(p+i*8*width+j+width*7) > value? 1: 0)<<7; + + oled_wrdat(dat); + } + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 汉字显示 +// @param x 横坐标 0-127 +// @param y 纵坐标 0-7 +// @param size 取模的时候设置的汉字字体大小,也就是一个汉字占用的点阵长宽为多少个点,取模的时候需要长宽是一样的。 +// @param *p 需要显示的汉字数组 +// @param len 需要显示多少位 +// @return void +// @since v1.0 +// Sample usage: +// @Note 使用PCtoLCD2002软件取模 阴码、逐行式、顺向 16*16 +//------------------------------------------------------------------------------------------------------------------- +void oled_print_chinese(uint8 x, uint8 y, uint8 size, const uint8 *p, uint8 len) +{ + uint16 i,j,k; + + for(i=0; i +#include + +uint8 number_conversion_ascii(uint32 dat, int8 *p, uint8 neg_type, uint8 radix) +{ + int32 neg_dat; + uint32 pos_dat; + uint8 temp_data = 0; + uint8 valid_num = 0; + + if(neg_type) + { + neg_dat = (int32)dat; + if(neg_dat<0) neg_dat = -neg_dat; + while(1) + { + *p = neg_dat%radix + '0'; + neg_dat = neg_dat/radix; + valid_num++; + + if(!neg_dat) break; + p++; + } + } + else + { + pos_dat = dat; + while(1) + { + temp_data = pos_dat%radix; + if(10 <= temp_data) temp_data += 'A'-10; + else temp_data += '0'; + + *p = temp_data; + + pos_dat = pos_dat/radix; + valid_num++; + + if(!pos_dat) break; + p++; + } + } + return valid_num; +} + +void printf_reverse_order(int8 *d_buff, uint32 len) +{ + uint32 i; + int8 temp_data; + for(i=0;ivlen) + { + vstr[vlen] = '0'; + vlen++; + } + + vstr[vlen] = '.'; + vlen++; + + printf_reverse_order(vstr,vlen); + memcpy(buff,vstr,vlen); + buff += vlen; + buff_len += vlen; + + break; + } + + case 'u':// 无符号十进制整数 + { + int8 vstr[33]; + uint32 ival = (uint32)va_arg(arg, uint32); + uint8 vlen = number_conversion_ascii(ival, vstr, 0, 10); + + printf_reverse_order(vstr,vlen); + memcpy(buff,vstr,vlen); + buff += vlen; + buff_len += vlen; + }break; + + case 'o':// 无符号八进制整数 + { + int8 vstr[33]; + uint32 ival = (uint32)va_arg(arg, uint32); + uint8 vlen = number_conversion_ascii(ival, vstr, 0, 8); + + printf_reverse_order(vstr,vlen); + memcpy(buff,vstr,vlen); + buff += vlen; + buff_len += vlen; + + }break; + + case 'x':// 无符号十六进制整数 + case 'X':// 无符号十六进制整数 + { + int8 vstr[33]; + uint32 ival = (uint32)va_arg(arg, uint32); + uint8 vlen = number_conversion_ascii(ival, vstr, 0, 16); + + printf_reverse_order(vstr,vlen); + memcpy(buff,vstr,vlen); + buff += vlen; + buff_len += vlen; + }break; + + + case 's':// 字符串 + { + int8 *pc = va_arg(arg, int8 *); + while (*pc) + { + *buff = *pc; + buff++; + buff_len++; + pc++; + } + }break; + + case 'p':// 以16进制形式输出指针 + { + int8 vstr[33]; + uint32 ival = (uint32)va_arg(arg, uint32); + //uint8 vlen = number_conversion_ascii(ival, vstr, 0, 16); + number_conversion_ascii(ival, vstr, 0, 16); + + printf_reverse_order(vstr,8); + memcpy(buff,vstr,8); + buff += 8; + buff_len += 8; + + }break; + + + case '%':// 输出字符% + { + *buff = '%'; + buff++; + buff_len++; + }break; + + default:break; + } + } + else + { + *buff = (int8)(*format); + buff++; + buff_len++; + } + format++; + } + va_end(arg); + + return buff_len; +} diff --git a/stc32g_all.uvopt b/stc32g_all.uvopt index 3a171d7..0553992 100644 --- a/stc32g_all.uvopt +++ b/stc32g_all.uvopt @@ -379,6 +379,54 @@ 0 0 + + 1 + 18 + 1 + 0 + 0 + 0 + .\Source\oled_iic_SSD1306.c + oled_iic_SSD1306.c + 0 + 0 + + + 1 + 19 + 1 + 0 + 0 + 0 + .\Source\oled_font.c + oled_font.c + 0 + 0 + + + 1 + 20 + 1 + 0 + 0 + 0 + .\Source\printfs.c + printfs.c + 0 + 0 + + + 1 + 21 + 1 + 0 + 0 + 0 + .\Source\ina226.c + ina226.c + 0 + 0 + @@ -389,7 +437,7 @@ 0 2 - 18 + 22 0 0 0 @@ -401,7 +449,7 @@ 2 - 19 + 23 5 0 0 @@ -413,7 +461,7 @@ 2 - 20 + 24 5 0 0 @@ -425,7 +473,7 @@ 2 - 21 + 25 5 0 0 @@ -437,7 +485,7 @@ 2 - 22 + 26 5 0 0 @@ -449,7 +497,7 @@ 2 - 23 + 27 5 0 0 @@ -461,7 +509,7 @@ 2 - 24 + 28 5 0 0 @@ -473,7 +521,7 @@ 2 - 25 + 29 5 0 0 @@ -485,7 +533,7 @@ 2 - 26 + 30 5 0 0 @@ -497,7 +545,7 @@ 2 - 27 + 31 5 0 0 @@ -509,7 +557,7 @@ 2 - 28 + 32 5 0 0 @@ -521,7 +569,7 @@ 2 - 29 + 33 5 0 0 @@ -533,7 +581,7 @@ 2 - 30 + 34 5 0 0 @@ -545,7 +593,7 @@ 2 - 31 + 35 5 0 0 @@ -557,7 +605,7 @@ 2 - 32 + 36 5 0 0 @@ -569,7 +617,7 @@ 2 - 33 + 37 5 0 0 @@ -581,7 +629,7 @@ 2 - 34 + 38 5 0 0 @@ -593,7 +641,7 @@ 2 - 35 + 39 5 0 0 @@ -605,7 +653,7 @@ 2 - 36 + 40 5 0 0 @@ -615,6 +663,54 @@ 0 0 + + 2 + 41 + 5 + 0 + 0 + 0 + .\Header\oled_iic_SSD1306.h + oled_iic_SSD1306.h + 0 + 0 + + + 2 + 42 + 5 + 0 + 0 + 0 + .\Header\oled_font.h + oled_font.h + 0 + 0 + + + 2 + 43 + 5 + 0 + 0 + 0 + .\Header\printfs.h + printfs.h + 0 + 0 + + + 2 + 44 + 5 + 0 + 0 + 0 + .\Header\ina226.h + ina226.h + 0 + 0 + @@ -625,7 +721,7 @@ 0 3 - 37 + 45 4 0 0 diff --git a/stc32g_all.uvproj b/stc32g_all.uvproj index a6bafce..27012cb 100644 --- a/stc32g_all.uvproj +++ b/stc32g_all.uvproj @@ -409,6 +409,26 @@ 1 .\Source\stc32_stc8_usb.c + + oled_iic_SSD1306.c + 1 + .\Source\oled_iic_SSD1306.c + + + oled_font.c + 1 + .\Source\oled_font.c + + + printfs.c + 1 + .\Source\printfs.c + + + ina226.c + 1 + .\Source\ina226.c + @@ -509,6 +529,26 @@ 5 .\Header\stc32_stc8_usb.h + + oled_iic_SSD1306.h + 5 + .\Header\oled_iic_SSD1306.h + + + oled_font.h + 5 + .\Header\oled_font.h + + + printfs.h + 5 + .\Header\printfs.h + + + ina226.h + 5 + .\Header\ina226.h +